【转】 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开发者成长计划社群内成功举办. 本期课程,由拓 ...
随机推荐
- bzoj3039 玉蟾宫
Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地.这片土地被分成N*M个格子,每个格子里写着'R'或者' ...
- hdu 2818 Building Block (带权并查集,很优美的题目)
Problem Description John are playing with blocks. There are N blocks ( <= N <= ) numbered ...N ...
- MVC 控制器详解
Controller: Controllers 文件夹包含负责处理用户输入和响应的控制器类. MVC 要求所有控制器的名称必须以 "Controller" 结尾. 控制器的职责: ...
- Android 如何检测一个服务是否还在运行?
前言 欢迎大家我分享和推荐好用的代码段~~ 声明 欢迎转载,但请保留文章原始出处: CSDN:http://www.csdn.net ...
- OpenWrt sscanf问题之于MT7620N与AR9341
在MT7620N平台做好了wifidog的相关调试工作,除了eth驱动.wireless性能问题,其余的都能够基本正常. 依据实际须要要对已完毕的工作在AR9341平台上实现. 事实上也简单.基本功能 ...
- 在 VS2008 下操作 Excel 的方法总结
这些天做个软件,需要读取 Excel 并导入到数据库中,所以研究了一下在 VC 下操作 Excel 的方法,这里做个总结,以作备忘. 一.最常用的 OLE 自动化方式 这个方式应该说是功能最全的方 ...
- linux 终止用户会话
第一步使用 tty 命令 查看自己会话id:本例中会话id为1[root@localhost ~]# tty/dev/pts/1[root@localhost ~]# 第二步 使用 w 命令 查看当前 ...
- 光盘自动运行HTML页,Autorun文件写法
1.把你的网页放在一个根目录下面,起名为index.html 2.在目录新建一个autorun.inf的文件,打开后编辑为以下内容: 代码如下: [autorun]icon=***.ico(加图标) ...
- (转).net开发者对android开发一周的学习体会
春节期间,相对比较闲,上班时也没什么事情做.利用这一周的时间,简单的学习了一下移动方面的开发.主要是针对android,其实我对IOS更感兴趣 (因为我用iphone),苦于暂时没有苹果电脑,只能把它 ...
- Qt串口通信
1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...