原文网址: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驱动调试经验的更多相关文章

  1. (转)CMOS Sensor的调试经验分享

    CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一些调试经验. 首先,要认识CMOS摄像头的结构.我们通常拿到的是集成封装好的模组,一般由三个部分组成:镜头.感应器和图像信号处 ...

  2. Smart210学习记录-----Linux i2c驱动

    一:Linux i2c子系统简介: 1.Linux 的 I2C 体系结构分为 3 个组成部分: (1) I2C 核心. I2C 核心提供了 I2C 总线驱动和设备驱动的注册.注销方法,I2C 通信方法 ...

  3. CMOS Sensor的调试经验分享

    转自:http://bbs.52rd.com/forum.php?mod=viewthread&tid=276351 CMOS Sensor的调试经验分享 我这里要介绍的就是CMOS摄像头的一 ...

  4. 【转】android 电容屏(三):驱动调试之驱动程序分析篇

    关键词:android  电容屏 tp 工作队列 中断 坐点计算  电容屏主要参数平台信息:内核:linux2.6/linux3.0系统:android/android4.0  平台:S5PV310( ...

  5. CMOS Sensor的调试经验分享【转】

    转自:https://blog.csdn.net/yapingmcu/article/details/37817727 转自:http://bbs.52rd.com/forum.php?mod=vie ...

  6. 《linux设备驱动开发详解》笔记——15 linux i2c驱动

    结合实际代码和书中描述,可能跟书上有一定出入.本文后续芯片相关代码参考ZYNQ. 15.1 总体结构 如下图,i2c驱动分为如下几个重要模块 核心层core,完成i2c总线.设备.驱动模型,对用户提供 ...

  7. linux驱动基础系列--Linux I2c驱动分析

    前言 主要是想对Linux I2c驱动框架有一个整体的把控,因此会忽略协议上的某些细节,同时里面涉及到的一些驱动基础,比如平台驱动.设备模型.sysfs等也不进行详细说明原理,涉及到i2c协议部分也只 ...

  8. 17调试经验之串口读写flash协议

    一是设计功能 我的理解协议就是一个命令包,通过给出不同的控制命令,来调动不同的功能模块,实现不同的功能,如读数据,写数据,擦除等. 二设计过程 先看了尤老师的视频,主要讲了大致设计原理和总体框架,当然 ...

  9. 【直播回顾】OpenHarmony知识赋能第四期第三课——I2C驱动开发

    3月24日晚上19点,​知识赋能第四期直播的第三节课<OpenHarmony标准系统HDF框架之I2C驱动开发>​,在OpenHarmony开发者成长计划社群内成功举办. 本期课程,由​拓 ...

随机推荐

  1. 【转】 ubuntu12.04更新源 官网和163等

    原文网址:http://blog.csdn.net/zhangliang_571/article/details/8813999 分类: LINUX 摘要: 本文列出ubuntu 12.04 LTS更 ...

  2. cocos2dx lua 加密

    cocos2dx-lua项目发布时,为了保护lua源码,需要对lua进行加密.通常分为两种方式:加密文件和编译为字节码. 1.加密文件 前提是你不用luajit,而使用lua.这样这种方法是真正加密, ...

  3. js面向对象的五种写法

    第一种: //第1种写法 function Circle(r) { this.r = r; } Circle.PI = 3.14159; Circle.prototype.area = functio ...

  4. Python获取并输出当前日期时间

    取得时间相关的信息的话,要用到python time模块,python time模块里面有很多非常好用的功能,你可以去官方文档了解下,要取的当前时间的话,要取得当前时间的时间戳,时间戳好像是1970年 ...

  5. 监控工具zabbix

    1 安装zabbixyum install -y epel-release安装rpm包的lamp环境 yum install  httpd mysql mysql-libs php php-mysql ...

  6. DEV GridControl 根据单元格值改变背景色

    GridControl 根据单元格值改变背景色(需要用到CustomDrawCell事件) 方法1: private void gdvClient_CustomDrawCell(object send ...

  7. 短信猫编程的一些资料1(At指令发送短信)

    现在正在做TC35的项目, 下面分享一下这几天在网上找到的资料: 手机 SMS PDU 格式参考手册 1.相关的GSM   AT指令     与SMS有关的GSM   AT指令(from   GSM0 ...

  8. rsync+inotify实时同步方案

    rsync+inotify实时同步,inotify可以实时监控本地文件或目录变化,当检测到本地文件变化,执行rsync同步命令,将变化的文件同步到其他服务器节点. 1.配置环境 3.在服务节点1.服务 ...

  9. UIImageView填充模式(contentMode)

    UIViewContentModeScaleToFill :拉伸填充UIImageView满屏          UIViewContentModeScaleAspectFit :拉伸到合适UIIma ...

  10. JS生成不重复随机数

    说明 我们可以用Math.random()的方法轻松的生成 一个随机的数字,但是这个数字可能是重复的.有时候,我们需要一个不重复的随机数,可以用很多的方法来实现这个要求,以下方法是效率最高的. 解释 ...