【转】 i2c驱动调试经验
原文网址:http://blog.csdn.net/cmm20071020/article/details/7179958
把一个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驱动调试经验的更多相关文章
- (转)CMOS Sensor的调试经验分享
CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一些调试经验. 首先,要认识CMOS摄像头的结构.我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头.感应器和图像信号处 ...
- Smart210学习记录-----Linux i2c驱动
一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...
- CMOS Sensor的调试经验分享
转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一 ...
- 【转】android 电容屏(三):驱动调试之驱动程序分析篇
关键词:android 电容屏 tp 工作队列 中断 坐点计算 电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0 平台:S5PV310( ...
- CMOS Sensor的调试经验分享【转】
转自:https://blog.csdn.net/yapingmcu/article/details/37817727 转自:http://bbs.52rd.com/forum.php?mod=vie ...
- 《linux设备驱动开发详解》笔记——15 linux i2c驱动
结合实际代码和书中描述,可能跟书上有一定出入.本文后续芯片相关代码参考ZYNQ. 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供 ...
- linux驱动基础系列--Linux I2c驱动分析
前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...
- 17调试经验之串口读写flash协议
一是设计功能 我的理解协议就是一个命令包,通过给出不同的控制命令,来调动不同的功能模块,实现不同的功能,如读数据,写数据,擦除等. 二设计过程 先看了尤老师的视频,主要讲了大致设计原理和总体框架,当然 ...
- 【直播回顾】OpenHarmony知识赋能第四期第三课——I2C驱动开发
3月24日晚上19点,知识赋能第四期直播的第三节课<OpenHarmony标准系统HDF框架之I2C驱动开发>,在OpenHarmony开发者成长计划社群内成功举办. 本期课程,由拓 ...
随机推荐
- <转载>无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引用
转载http://blog.sina.com.cn/s/blog_6e6c5f230100p92p.html 无法解析的外部符号 _main,该符号在函数 ___tmainCRTStartup 中被引 ...
- c语言结构体5之匿名结构体
注意: 1匿名结构体不会出现重合 重命名的情况 2有名结构体 名称不能相同 也就是不能重名 //匿名结构体不会出现重名的情况 struct //无名结构体 { ]; ]; int num; };//不 ...
- Adroid APPIUM实例步骤
1.下载eclipse 2.安装java 配置环境变量 3.eclipse 安装adt android development tools 4.android sdk manager 安装tool ...
- python数据类型-布尔值
布尔是计算机里最基本的判断单位,布尔只有两个值:真或假,即True False,也就是1或0. 在以后学习流程控制时会经常用到布尔值. 先来看简单的小例子: >>> 1+1 > ...
- 几道php基础面试题
前言 昨晚实验室一师弟在微薄上@我,给我发了几道php的基础面试题,这里把我写的答案贴出来 题目 (1)写一个函数获取URL的文件后缀,例如“http://www.feiyan.info/test.p ...
- mysql学习之五:sql语句学习3
好吧,大家认为这样的字体还是比較好看,全部我们就换这样的字体了. INSERT INTO 语句用于向表格中插入新的行. 语法 INSERT INTO 表名称 VALUES (值1, 值2,....) ...
- linux下使用mutt发送带附件的邮件
echo "hello"|mutt -s "world" -a hack.jpg -- name@address.com
- 未知宽高div水平垂直居中3种方法
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> </head&g ...
- [转] unix/linux下线程私有数据实现原理及使用方法
在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...
- Java第四周学习日记(绪)
1.静态导入 作用:简化书写静态导入可以作用一个类的所有静态成员静态导入格式:import static 包名.类名静态导入要注意的事项:如果静态导入的成员与本类的成员存在同名的情况下,那么默认使用本 ...