一、前言
本文介绍BSP驱动开发和调试经验,驱动是和硬件打交道,那就要明确硬件和软件的分界线,硬件一般负责模拟信号、大数据量的处理等工作,而驱动则专注于控制流。所以作为一个BSPer,走读datasheet时、看代码等主要关注配置流。
二、Linux驱动开发
Linux的驱动模型bus-device-driver基本已被说烂了,本文不再过多赘述,不了解的同学可以自行搜索。本文则专注于驱动初始化probe流程应该做的事情来展开,提取共性的内容:
主要分3个大流程:
1、从dts中解读驱动配置
2、配置硬件
3、对接Linux驱动子系统
遵循从外设的全局配置到局部配置,以网络交换芯片为例,先配global参数比如使能等,再配每个port的参数。通常流程如下:
1、reset:芯片复位,寄存器回复默认值
2、enable:使能芯片
3、config: 配置流,先global,再局部到每个port
1、对接Linux驱动子系统bus-device-driver模型,注册device结构。Linux驱动通过OPS实现对接,硬件驱动层ops负责操作底层寄存器等操作。
2、注册调试手段:sys/proc/字符设备等。
mermaid流程图
三、调试手段
驱动调试和硬件强相关,需要掌握一定的技巧思路,否则通常无从下手,通常有如下思路:
先看控制通道(I2C/SPI等)是否联通,通过dump寄存器查看,是否配置生效。
dump所有寄存器用于调试,好多驱动会提供ui读写寄存器的工具可以分析每个字段的含义。这里提一句供应商通常提供的资料通常包括:sample code、官方docs官网、datasheet手册、user guide用户手册。
网卡设备、摄像头MIPI总线,
1、抓包
2、查看link状态
3、查看错包统计、错误统计
驱动开发阶段硬件是个黑盒子,所以调试和检查手段很重要,调试手段先行,先确认验收手段,明确“正确的长什么样子”,通过对比验证建立认知。
比如OSI分层模型、PHY、MAC、网络层等,每一层都要有调试手段,从下层往上排查。
嵌入式是软硬配合的工作,有时候软件死活调不出来,可能是硬件接错了,所以一定要拉上硬件同事一起分析,比如常见的问题:
1、电平不匹配
GPIO空载信号正常,但是接上负载信号就变形。
2、板子烧了
控制信号死活不响应,需要示波器测量总线信号
3、连接线质量问题等等。
硬件:万用表、逻辑分析仪、示波器。
万用表:GPIO高低电平,PWM脉宽,可以量最重的电压值。
逻辑分析仪:看数字信号,I2C时序、PWM脉宽等低速信号。
示波器:很重要,示波器看模拟信号,有时候数字信号正常,模拟信号可能出现振铃,比如可能会导致软件中出现中断风暴问题。
1、多个电路板之间要通过GPIO连接,要共地,否则电平会飘。
2、使用逻辑分析仪和示波器时也要和待测设备共地。
3、同一套电源系统供电,会共电源地。
4、可以通过万用表测导通的形式测试是否是共地的。
以上就是驱动开发调试的全部内容啦,希望对大家有所帮助,欢迎讨论~