i2c驱动调试经验

把一个i2c驱动从2.6.21升级到2.6.39

 

 上网查到一篇帖子,讲了驱动分为i2c总线,i2c设备,总线驱动做实际的总线读写操作,设备驱动实现针对不同设备操作。先找一篇帖子看看整体架构,再看代码,理解效果不错,这招是跟老猫学的。

又查到一篇帖子,讲了从老版本i2c驱动,升级到新版本,需要做哪些变更,是翻译的内核文档。

 

照做,但是i2c设备驱动的probe函数调不起来,这个根据我的经验要加个device,但是i2c的device不知道怎么加。翻了翻i2c总线的代码,后来还是同事发现没有调用i2c_register_board_info。之前的老版本驱动就有这个i2c_register_board_info调用,在arch/arm里面一个跟board相关的文件里,我光注意driver目录下的内容,给漏掉了。

 

 

 

 

普通的设备,调用platform_add_devices添加设备 vs i2c总线上的设备,调用i2c_register_board_info添加设备,添加到了一个i2c单独的设备list结构里

添加驱动的函数与platform_add_devices也不一样,添加驱动后,就遍历设备列表,看哪个匹配

 

调试i2c驱动

芯片pt2314,设备手册上说明i2c地址是88,代码里地址写的是44。insmod驱动模块,写总线返回-6。用的是s3c2416平台。

i2c通信原理:

SCL时钟线,SDA数据线。空闲时,两条线都为高。

SCL高电平时,SDA变低,表示开始条件,相对的还有停止条件。

开始条件后,先发地址,再发数据,地址和数据都是一个字节一个字节的。

每个字节数据都要有应答,地址有ACK,数据也有ACK。

先发MSB,例如发送地址的话,先发送读写位,再发送7位地址,7位地址是一字节数据的低7位,最高位是读写位。例如pt2314的地址88(10001000),前面的1000100是地址,最后一位0是读写位。

仲裁过程是在开始条件和发送地址时监视SDA有没有冲突。SDA输出高电平时,读回来是低电平,说明总线上有冲突。

示波器测量

需要同时测试SCL,SDA。把示波器两个channel打开,分别调整电压和时间,上下位置分开便于观察。设置为下降沿触发,因为SCL,SDA平时为高,所以表笔点上引脚时会有一个上升沿,没必要触发。有人搭把手,帮忙按示波器的run,设成啥触发都行。表笔接地,接SCL,SDA,然后insmod驱动模块,发起i2c总线的操作。抓到信号,线上信号是88,但是没有得到ACK,因此i2c的adpter驱动返回-6错误。

i2c-tools

后来用i2c-tools中的i2cdetect,发现一开始没有设备,insmod驱动模块报错之后,再i2cdetect,就发现设备了,原来是pt2314供电之后,需要一个延时,才能正常工作。

关于i2c地址

本次调试中,芯片手册上的地址与i2c bus上测量的一致,为88,高7位1000100是地址,最低位0是读写位;而linux驱动代码中的地址44,是不包含读写位的i2c地址,且7位地址存储在一字节数据中的低7位,所以看起来跟芯片手册上不一致,在adpter驱动中使用这个地址时,会左移1位,再加上读写位。

<think>嗯,用户想调试触摸屏的I2C驱动问题,我需要根据提供的引用资料和知识库内容来整理步骤。首先,确保硬件连接正确,比如检查I2C总线和供电,这很重要,因为硬件问题可能导致驱动无法正常工作。然后需要确认设备树配置,比如检查compatible属性和reg地址是否正确,引用里提到Goodix GT9xx的地址是0x5d,所以用户需要确认他们的设备树是否有类似设置。 接下来是驱动加载情况,使用lsmod和dmesg查看驱动是否加载成功,如果有错误日志,可能需要重新编译驱动I2C通信测试部分,i2c-tools里的i2cdetect能扫描设备,如果地址出现,可能是硬件或配置问题。 然后是中断和输入子系统,检查中断是否注册,输入设备有有创建。引用3提到i2c_driver的添加和挂起函数的处理,所以驱动中的probe函数是否正常执行也很关键。如果有注册问题,可能是设备树匹配或驱动初始化的问题。 最后,调试工具和日志分析,使用devmem2直接读取寄存器,或者打开内核的调试选项,比如动态调试和输入子系统的事件记录。如果所有步骤都检查过了,可能需要联系厂家获取更详细的支持。 用户可能遇到的问题包括设备树配置错误、驱动未正确编译加载、I2C通信失败或中断配置不当。需要一步步排查,从硬件到软件,逐步缩小问题范围。</think>### 调试触摸屏 I2C 驱动程序的步骤 #### 1. **硬件连接验证** - 检查 I2C 总线物理连接是否正常(如 SCL/SDA 信号线、供电电压),确保触摸屏控制器芯片(如 Goodix GT9xx 或 FT5X06)的 I2C 地址与设备树配置一致[^2][^4]。 - 使用示波器或逻辑分析仪观察 I2C 总线波形,确认是否有起始信号、ACK/NACK 响应。 #### 2. **设备树配置检查** - 确认设备树(Device Tree)中 I2C 节点是否正确定义,例如: ```c &i2c2 { gt9xx@5d { compatible = "goodix,gt9xx"; reg = <0x5d>; interrupt-parent = <&gpio>; interrupts = <PIN_X LEVEL_TRIGGER>; }; }; ``` 需确保 `compatible` 属性与驱动匹配,`reg` 地址与芯片手册一致[^2][^3]。 #### 3. **驱动加载与日志分析** - 使用 `lsmod` 检查驱动模块是否加载,通过 `dmesg | grep i2c` 或 `journalctl -k` 查看内核日志,定位初始化错误(如 probe 函数失败、中断注册问题)。 - 若驱动未加载,需重新编译内核或模块,确保配置启用了对应驱动(如 `CONFIG_TOUCHSCREEN_GOODIX`)。 #### 4. **I2C 通信测试** - 安装 `i2c-tools` 工具包,执行 `i2cdetect -l` 列出所有 I2C 总线,再通过 `i2cdetect -y <bus_num>` 扫描设备地址: ```bash i2cdetect -y 2 # 检查总线2上的设备(GT9xx 地址应为0x5d) ``` 若设备地址未出现,可能是硬件问题或设备树配置错误。 #### 5. **中断与输入子系统调试** - 检查 `/proc/interrupts` 确认触摸屏中断是否被正确注册和触发。 - 使用 `evtest` 工具监听输入事件,验证触摸操作是否上报坐标数据: ```bash evtest /dev/input/eventX # X为触摸屏对应的设备编号 ``` 若无事件输出,可能是中断处理函数或输入子系统注册失败[^3]。 #### 6. **寄存器级调试** - 通过 `i2cget` 和 `i2cset` 直接读写芯片寄存器(需参考芯片手册): ```bash i2cget -y 2 0x5d 0x8140 # 读取GT9xx固件版本寄存器 ``` - 使用 `devmem2` 工具检查硬件寄存器状态(如 GPIO 中断引脚配置)。 #### 7. **动态调试与跟踪** - 启用内核动态调试功能: ```bash echo "file goodix* +p" > /sys/kernel/debug/dynamic_debug/control ``` - 使用 `ftrace` 跟踪驱动函数调用链,分析时序问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值