热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

关于i2c_msg的一些标志位

由于公司的需要,在写I2C程序,原来从头到尾自己写一个IIC驱动是一件很简单的事情,但想完美的我还是想把我的驱动和内核的I2C子系统连接起

由于公司的需要,在写I2C程序,原来从头到尾自己写一个IIC驱动是一件很简单的事情,但想完美的我还是想把我的驱动和内核的I2C子系统连接起 来,I2C本身很简单,S3C2410无操作系统不用300行就搞定,但I2C子系统却把这么简单的代码变得非常庞大,非常难懂,结构错综复杂。
      关于I2C子系统,我转载的文章Linux I2C核心、总线与设备驱动[转] 已经说得很请楚,这里只作一些补充。

一、master_xfer,以及i2c_msg标志位
      其实抛开子系编本身其它部份,实现I2C的主要作用代码就是algorithm里的master_xfer方法。这个方法就是我们无操作系统 时的的I2C读写函数(它用参数来区分读和写)。分析这些代码,最好是读内核的i2c-algo-bit.c文件,这个文件就是用模拟的方法来实现I2C 总线,因为不和其它I2C控制芯片相关,所以比较好理解。i2c-algo-bit.c其中的master_xfer函数bit_xfer函数如下:

 1static int bit_xfer(struct i2c_adapter *i2c_adap,
 2            struct i2c_msg msgs[], int num)
 3{
 4    struct i2c_msg *pmsg;
 5    struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
 6    
 7    int i,ret;
 8    unsigned short nak_ok;
 9
10    i2c_start(adap);
11    for (i&#61;0;i<num;i&#43;&#43;{
12        pmsg &#61; &msgs[i];
13        nak_ok &#61; pmsg->flags & I2C_M_IGNORE_NAK; 
14        if (!(pmsg->flags & I2C_M_NOSTART)) {
15            if (i) {
16                i2c_repstart(adap);
17            }
18            ret &#61; bit_doAddress(i2c_adap, pmsg);
19            if ((ret !&#61; 0&& !nak_ok) {
20                DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: NAK from device addr %2.2x msg #%d/n"
21                    ,msgs[i].addr,i));
22                return (ret<0? ret -EREMOTEIO;
23            }
24        }
25        if (pmsg->flags & I2C_M_RD {
26            
27            ret &#61; readbytes(i2c_adap, pmsg);
28            DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: read %d bytes./n",ret));
29            if (ret < pmsg->len {
30                return (ret<0)? ret -EREMOTEIO;
31            }
32        } else {
33            
34            ret &#61; sendbytes(i2c_adap, pmsg);
35            DEB2(printk(KERN_DEBUG "i2c-algo-bit.o: wrote %d bytes./n",ret));
36            if (ret < pmsg->len {
37                return (ret<0? ret -EREMOTEIO;
38            }
39        }
40    }
41    i2c_stop(adap);
42    return num;
43}

其实也并不复杂
      1&#xff09;i2c_start函数发start信号
      2&#xff09;i2c_repstart函数发重复start信号
      3&#xff09;bit_doAddress函数写器件地址
      4&#xff09;readbytes函数读N字节
      5&#xff09;writebytes函数写N字节

其中的每一个函数都不复杂&#xff0c;都是设置或读取scl和sda线。
bit_xfer函数参数只要是i2c_msg序列msgs。这个结构请看Linux I2C核心、总线与设备驱动[转] 或自己Google吧&#xff0c;里面放着要这个函数完成的任务。我们的最主要任务是i2c_msg的一些标志位&#xff0c;这些标识位网上都没有提到。我来解释一下&#xff0c;错了大家请原谅。

I2C_M_IGNORE_NAK&#xff1a;
      设置这个标志意味当前i2c_msg忽略I2C器件的ack和nack信号。
I2C_M_NOSTART&#xff1a;      
      设置这个标志意味当前i2c_msg不发送start信号。注意&#xff0c;其实调用bit_xfer的一开始就已经发了start信号了&#xff08;程序第10 行&#xff09;&#xff0c;这个标记无非就是标志是否发送地址第18行。其次&#xff0c;如果一个i2c_msg没有定义I2C_M_NOSTART而且又不是msgs序列里的第一个 i2c_msg&#xff0c;则回发送重复start信号&#xff0c;我想这就是这个标志起这个名的原因。我们可以猜想&#xff0c;
      1.msgs序列第一个数据必须是地址&#xff0c;同时必须不定义这个标志位
      2.在进行读数据&#xff0c;要从写操作转变为读操作时&#xff0c;会发重复start信号和器件地址时&#xff0c;必须不定义这个标志位
      3.其它情况下一的i2c_msg必须定义这个标志
      以上只是我看完这个函数的理解&#xff0c;不一定正确。同时1和2总结下来就是发器件地址&#xff08;注意&#xff0c;是器件地址&#xff0c;不是像EEPROM那样的EEPROM地 址&#xff0c;这个地址是当数据发的&#xff09;时会不设置I2C_M_NOSTART, 发数据时就设置I2C_M_NOSTART这个标志。
I2C_M_NO_RD_ACK&#xff1a;
      这个标识表示在正行读操作时不去ACK&#xff0c;我不知道其它芯片如果&#xff0c;如果是AT24C04则一定不能设这个标志位了。
&#xff08;下面三个标志为均为bit_doAddress函数使用&#xff0c;结合上面的说明&#xff0c;也就是这时I2C_M_NOSTART一定没有设置。&#xff09;
I2C_M_RD&#xff1a;
      表示这是一个读操作&#xff0c;默认是把相应的位置1
I2C_M_REV_DIR_ADDR&#xff1a;
      表示把读写标志位反转&#xff0c;也就是读是把相应位置0
I2C_M_TEN&#xff1a;
     表示这个器件的器件地址是10Bit的。一定要搞清&#xff0c;这是器件地址&#xff0c;不是指EEPROM的ROM地址。24C02等芯片真正的器件地址只有4位 永远有效&#xff08;0xA)&#xff0c;低4位用来放其它东西了&#xff08;根据容量有可能是器件地址的低3位&#xff0c;或ROM地址的高3位&#xff09;。也是说&#xff0c;无论什么容量&#xff0c;这类器件的地址只是器 件地址我们只选7位模式&#xff08;内核只区分10位模式和其它模式&#xff09;



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 本文介绍了Windows操作系统的版本及其特点,包括Windows 7系统的6个版本:Starter、Home Basic、Home Premium、Professional、Enterprise、Ultimate。Windows操作系统是微软公司研发的一套操作系统,具有人机操作性优异、支持的应用软件较多、对硬件支持良好等优点。Windows 7 Starter是功能最少的版本,缺乏Aero特效功能,没有64位支持,最初设计不能同时运行三个以上应用程序。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • HDFS2.x新特性
    一、集群间数据拷贝scp实现两个远程主机之间的文件复制scp-rhello.txtroothadoop103:useratguiguhello.txt推pushscp-rr ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
激越工作室
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有