i2c驱动调试经验
2012-11-02 16:20
525 查看
把一个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位,再加上读写位。
上网查到一篇帖子,讲了驱动分为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位,再加上读写位。
相关文章推荐
- i2c驱动调试经验
- 【转】 i2c驱动调试经验
- i2c驱动调试经验
- i2c驱动调试经验
- i2c驱动调试经验
- cc2640调试经验之 I2C驱动添加
- 飞思卡尔 KL2x系列M0+单片机 i2c 调试经验
- 四极管: Android开发调试I2C设备驱动 i2cdetect 工具的使用
- 电容屏驱动,输入设备注册,I2C设备注册,中断注册,虽然没有完全调试成功
- I2C 适配器 驱动 调试 总结
- I2C eeprom调试经验
- minifilter开发文件过滤驱动、以及syser调试的经验
- i2c驱动调试技巧(1)
- SD卡驱动调试经验
- win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法
- 驱动调试基本条件和经验
- WINCE下调试i2c矩阵键盘驱动
- linux I2C驱动调试日志
- 调试nios的uclinux驱动的两点经验总结
- Linux下i2c驱动调试总结