linux GPIO-i2c驱动

来源:互联网 发布:关联规则挖掘算法 编辑:程序博客网 时间:2024/05/04 14:07
  1. 转载链接地址:http://blog.chinaunix.net/uid-27717694-id-3519302.html

  2. 一、I2C概述
  3. Linux的I2C体系结构分为3个组成部分:
  4. 1.I2C核心
  5. I2C 核心提供了I2C总线驱动和设备驱动的注册、注销方法,I2C通信方法(即“algorithm”)上层的、与具体适配器无关的代码以及探测设备、检测设备地址的上层代码等。
  6. 2.I2C总线驱动
  7. I2C总线驱动是对I2C硬件体系结构中适配器端的实现,适配器可由CPU控制,甚至直接集成在CPU内部。
  8. I2C总线驱动主要包含了I2C适配器数据结构i2c_adapter、I2C适配器的algorithm数据结构i2c_algorithm和控制I2C适配器产生通信信号的函数。
  9. 经由I2C总线驱动的代码,我们可以控制I2C适配器以主控方式产生开始位、停止位、读写周期,以及以从设备方式被读写、产生ACK等。
  10. 3.I2C设备驱动
  11. I2C设备驱动是对I2C硬件体系结构中设备端的实现,设备一般挂接在受CPU控制的I2C适配器上,通过I2C适配器与CPU交换数据。
  12. I2C设备驱动主要包含了数据结构i2c_driver和i2c_client,我们需要根据具体设备实现其中的成员函数。

  13. 二、下面介绍i2c各核心数据结构的定义和它们之间的连接关系。
  14. 1. 一个i2c设备的驱动程序由i2c_driver数据结构描述,i2c_driver代表I2C从设备驱动,定义于include/linux/i2c.h:
  15. struct i2c_driver {
  16.     unsigned int class;
  17.     /* 这两个接口已经被probe和remove取代 */ 
  18.     int (*attach_adapter)(struct i2c_adapter *);//attach_adapter回调函数在安装i2c设备驱动程序模块时、或者在安装i2c适配器驱动程序模块时被调用,
  19.                                                                                             //用于检测、认领设备并为设备分配i2c_client数据结构。
  20.     int (*detach_adapter)(struct i2c_adapter *);//detach_client方法在卸载适配器或设备驱动程序模块时被调用,用于从总线上注销设备、并释放i2c_client及相应的私有数据结构。
  21.     
  22.     int (*probe)(struct i2c_client *, const struct i2c_device_id *);
  23.     int (*remove)(struct i2c_client *);
  24.     
  25.     void (*shutdown)(struct i2c_client *);
  26.     int (*suspend)(struct i2c_client *, pm_message_t mesg);
  27.     int (*resume)(struct i2c_client *);
  28.     void (*alert)(struct i2c_client *, unsigned int data);
  29.     int (*command)(struct i2c_client *client, unsigned int cmd, void *arg);
  30.     struct device_driver driver;/*设备驱动结构体*/
  31.     const struct i2c_device_id *id_table;//该驱动所支持的设备ID表
  32.     int (*detect)(struct i2c_client *, struct i2c_board_info *);
  33.     const unsigned short *address_list;
  34.     struct list_head clients;
  35. };

  36. 2. 一个i2c适配器由i2c_adapter数据结构描述
  37. /*
  38. i2c adapter是软件上抽象出来的i2c总线控制器接口
  39. 物理上一条i2c总线可以挂接多个硬件设备(slave),一个CPU可以挂接多条i2c总线(想象一下PCI总线)
  40. i2c总线控制器就是CPU访问I2C总线的硬件接口,也就是你说的那几个寄存器 .

  41. 简单点了, 你的开发板上有几个I2C接口,就有几个adapter , 也就是有几条I2C bus , I2C CLIENT 对应的就是你的外围I2C 设备,
  42. 有几个就有几个CLIENT , 把这些设备插入开发板, 对应其中的一条BUS, 那么相应的就对应了其中的一个ADAPTER , 
  43. 接下来的就是 CLIENT 与 ADAPTER 勾搭成对了, 后面就是做该做的事了.
  44. */
  45. struct i2c_adapter {
  46.     struct module *owner;/*所属模块*/
  47.     unsigned int id; /*algorithm的类型,定义于i2c-id.h,以I2C_ALGO_开始*/
  48.     unsigned int class;
  49.     struct i2c_algorithm *algo;/*总线通信方法结构体指针,一个i2c适配器上的i2c总线通信方法由其驱动程序提供的i2c_algorithm数据结构描述,由algo指针指向 */
  50.     void *algo_data; /* algorithm数据 */
  51.     int (*client_register)(struct i2c_client *); /*client注册时调用*/
  52.     int (*client_unregister)(struct i2c_client *); /*client注销时调用*/
  53.     struct semaphore bus_lock; /*控制并发访问的自旋锁*/
  54.     struct semaphore clist_lock;
  55.     int timeout;
  56.     int retries; /*重试次数*/
  57.     struct device dev; /* 适配器设备 */
  58.     struct class_device class_dev; /* 类设备 */
  59.     int nr;
  60.     struct list_head clients; /* client链表头,总线上每个设备的 i2c_client数据结构挂载在这里*/
  61.     struct list_head list;
  62.     char name[I2C_NAME_SIZE]; /*适配器名称*/
  63.     struct completion dev_released; /*用于同步*/
  64.     struct completion class_dev_released;
  65. };

  66. 3.具体i2c适配器的通信方法由i2c_algorithm数据结构进行描述:
  67. struct i2c_algorithm {
  68.     int (*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs,int num);//I2C传输函数指针
  69.     int (*smbus_xfer) (struct i2c_adapter *adap, u16 addr,unsigned short flags, char read_write,u8 command, int size, union i2c_smbus_data *data);//SMbus传输函数指针
  70.     u32 (*functionality) (struct i2c_adapter *);//返回适配器支持的功能
  71. };

  72. 4.一个i2c设备由i2c_client数据结构进行描述:
  73. struct i2c_client {
  74.     unsigned int flags; /* 标志 */
  75.     /*需要说明的是,i2c设备的7位地址是就当前i2c总线而言的,是“相对地址”。不同的i2c总线上的设备
  76.     可以使用相同的7位地址,但是它们所在的i2c总线不同。所以在系统中一个i2c设备的“绝对地址”由二
  77.     元组(i2c适配器的ID和设备在该总线上的7位地址)表示。
  78.     */
  79.     unsigned short addr; /* 低7位为芯片地址 */
  80.     struct i2c_adapter *adapter; /*依附的i2c_adapter*/
  81.     struct i2c_driver *driver; /*依附的i2c_driver */
  82.     int usage_count; /* 访问计数 */
  83.     struct device dev; /* 设备结构体 */
  84.     struct list_head list; /* 链表头 */ 
  85.     char name[I2C_NAME_SIZE]; /* 设备名称 */
  86.     struct completion released; /* 用于同步 */
  87. };

  88. 5.下面分析一下i2c_driver、i2c_client、i2c_adapter和i2c_algorithm这4个数据结构的作用及其盘根错节的关系。
  89. 5.1 i2c_adapter与i2c_algorithm
  90. i2c_adapter 对应于物理上的一个适配器,而i2c_algorithm对应一套通信方法。一个I2C适配器需要i2c_algorithm中提供的通信函数来控制适配器上产生特定的访问周期。缺少i2c_algorithm的i2c_adapter什么也做不了,因此i2c_adapter中包含其使用的 i2c_algorithm的指针。
  91. i2c_algorithm中的关键函数master_xfer()用于产生I2C访问周期需要的信号,以i2c_msg(即I2C消息)为单位。i2c_msg结构体也非常关键。
  92. //i2c_msg结构体:
  93. struct i2c_msg {
  94.     __u16 addr; /* 设备地址*/
  95.     __u16 flags; /* 标志 */ 
  96.     __u16 len; /* 消息长度*/
  97.     __u8 *buf; /* 消息数据*/
  98. };
  99. 5.2 i2c_driver与i2c_client
  100. i2c_driver对应一套驱动方法,是纯粹的用于辅助作用的数据结构,它不对应于任何的物理实体。i2c_client对应于真实的物理设备,每个I2C设备都需要一个i2c_client来描述。i2c_client一般被包含在i2c字符设备的私有信息结构体中。
  101. i2c_driver 与i2c_client发生关联的时刻在i2c_driver的attach_adapter()函数被运行时。attach_adapter()会探测物理设备,当确定一个client存在时,把该client使用的i2c_client数据结构的adapter指针指向对应的i2c_adapter, driver指针指向该i2c_driver,并会调用i2c_adapter的client_register()函数。相反的过程发生在 i2c_driver 的detach_client()函数被调用的时候。
  102. 5.3 i2c_adpater与i2c_client
  103. i2c_adpater 与i2c_client的关系与I2C硬件体系中适配器和设备的关系一致,即i2c_client依附于i2c_adpater。由于一个适配器上可以连 接多个I2C设备,所以一个i2c_adpater也可以被多个i2c_client依附,i2c_adpater中包括依附于它的i2c_client 的链表。

  104. 三、I2C驱动的实现工作
  105. 一方面,适配器驱动可能是Linux内核本身还不包含的。另一方面,挂接在适配器上的具体设备驱动可能也是Linux不存在的。即便上述设备驱动都存在于Linux内核中,其基于的平台也可能与我们的电路板不一样。因此,工程师要实现的主要工作将包括:
  106. 6.1 提供I2C适配器的硬件驱动,探测、初始化I2C适配器(如申请I2C的I/O地址和中断号)、驱动CPU控制的I2C适配器从硬件上产生各种信号以及处理I2C中断等。
  107. 6.2 提供I2C适配器的algorithm,用具体适配器的xxx_xfer()函数填充i2c_algorithm的master_xfer指针,并把i2c_algorithm指针赋值给i2c_adapter的algo指针。
  108. 6.3 实现I2C设备驱动与i2c_driver接口,用具体设备yyy的yyy_attach_adapter()函数指针、 yyy_detach_client()函数指针和yyy_command()函数指针的赋值给i2c_driver的attach_adapter、 detach_adapter和detach_client指针。
  109. 6.4 实现I2C设备驱动的文件操作接口,即实现具体设备yyy的yyy_read()、yyy_write()和yyy_ioctl()函数等。

  110. 四、核心层提供的接口函数
  111. 1、增加/删除I2C适配器
  112. int i2c_add_adapter(struct i2c_adapter *adapter) 
  113. int i2c_del_adapter(struct i2c_adapter *adap) 
  114. 2、增加/删除I2C从设备驱动
  115. int i2c_register_driver(struct module *owner, structi2c_driver *driver) 
  116. static inline int i2c_add_driver(struct i2c_driver *driver) 
  117. void i2c_del_driver(struct i2c_driver *driver) 
  118. //i2c_add_driver是对i2c_register_driver简单的封装
  119. 3、i2c传输,发送和接收
  120. int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg*msgs, int num) 
  121. int i2c_master_send(const struct i2c_client *client, constchar *buf, int count) 
  122. int i2c_master_recv(const struct i2c_client *client, char*buf, int count) 
  123. //i2c_master_send和i2c_master_recv是i2c_transfer的封装
  124. //3.1.0的内核中已经没有i2c_attach_client和i2c_detach_client接口
  125. 4、I2C总线通信方法
  126. 我们需要为特定的I2C适配器实现其通信方法,主要实现i2c_algorithm结构体中的两个函数:
  127. struct i2c_algorithm { 
  128.          int(*master_xfer)(struct i2c_adapter *adap, struct i2c_msg *msgs, int num); 
  129.          u32(*functionality) (struct i2c_adapter *); 
  130. }; 
  131. Functionality函数用于返回algorithm所支持的通信协议;
  132. Master_xfer函数在I2C适配器上完成数据的传输;
  133. //Master_xfer函数实现模板
  134. static int i2c_adapter_xxx_xfer(structi2c_adapter *adap, struct i2c_msg *msgs, int num) 
  135. { 
  136.    ...... 
  137.    for (= 0; i < num; i++) { 
  138.        i2c_adapter_xxx_start(); /*产生起始位*/ 
  139.        if (msgs[i]->flags & I2C_M_RD) { /*读取*/ 
  140.            i2c_adapter_xxx_setaddr((msg->addr << 1) | 1); /*发送从设备地址*/ 
  141.            i2c_adapter_xxx_wait_ack(); /*获得从设备的ACK*/ 
  142.                     i2c_adapter_xxx_readbytes(msgs[i]->buf,msgs[i]->len); /*读取len长度的数据到buf中*/ 
  143.        } else { 
  144.            i2c_adapter_xxx_setaddr(msg->addr << 1); 
  145.            i2c_adapter_xxx_wait_ack(); 
  146.            i2c_adapter_xxx_writebytes(msgs[i]->buf, msgs[i]->len); 
  147.        } 
  148.     } 
  149.    i2c_adapter_xxx_stop(); /*产生停止位*/ 
  150. } 
  151. 我们来大致分析一下匹配的过程:
  152. 当调用i2c_add_driver函数向I2C总线(i2c-core.c文件中注册的”i2c”总线)增加一个i2c_driver时,会遍历总线中的所有i2c_client,
  153. 调用总线注册的match函数I2C适配器上是否有与i2c_driver匹配的i2c_client,如果匹配会调用I2C注册的probe函数,然后再调用i2c_driver定义的probe来进行关联和初始化工作。

  154. 五、i2c的初始化
  155. i2c子系统的初始化函数的执行先后顺序,结合vmlinux.lds和Makefile,可确定i2c初始化函数的执行顺序如下:
  156. 1./dricer/i2c/i2c-core.c中的函数:i2c_init()---------->postcore_initcall级别

  157. 2./arch/arm/mach-davinci/board-da850-evm.c中的函数:da850_evm_init()---------->arch_initcall级别

  158. 3.driver/i2c/buses/i2c-gpio.c中的函数:i2c_gpio_init()---------->subsys_initcall级别 

  159. 4./driver/i2c/i2c-dev.c中的函数:i2c_dev_init()---------->module_init级别


  160. 1.在linux内核启动的时候最先执行的和I2C子系统相关的函数应该是driver/i2c/i2c-core.c文件中的i2c_init()函数。
  161. static int __init i2c_init(void)
  162. {
  163.     int retval;
  164.     //设备模型中,关心总线,设备,驱动这三个实体,总线将设备和驱动绑定,在系统每注册一个设备的时候,会寻找与之匹配的驱动。
  165.     //相反,在系统每注册一个驱动的时候,寻找与之匹配的设备,匹配是由总线来完成的。 你还可以看一看链表的信息。它们都是关联的。 
  166.     retval = bus_register(&i2c_bus_type);//可以发现i2c_inti的函数主要功能就是注册i2c总线
  167.     if (retval)
  168.         return retval;

  169.     retval = i2c_add_driver(&dummy_driver);
  170.     if (retval)
  171.         goto class_err;
  172.     return 0;

  173. class_err:
  174.     bus_unregister(&i2c_bus_type);
  175.     return retval;
  176. }
  177. /*
  178. struct bus_type i2c_bus_type = { 
  179.     .name = "i2c", 
  180.     .match = i2c_device_match, 
  181.     .probe = i2c_device_probe, 
  182.     .remove = i2c_device_remove, 
  183.     .shutdown = i2c_device_shutdown, 
  184.     .pm = &i2c_device_pm_ops, 
  185. }; 
  186. match方法的用来进行client device和client driver的配对。在向总线i2c_bus_type注册设备或者驱动时会调用此方法。
  187. probe方法在完成设备和驱动的配对后调用执行,i2c_bus_type的probe方法是通过传递进来的drv找到包含此drv的i2c_driver驱动,然后再去调用i2c_driver的probe方法,此处就是at24_probe。
  188. 为什么要这样呢?因为driver_register后,注册的是i2_driver->drv,而drv中的probe未初始化,我们需要调用的是i2c-driver的probe方法。
  189. */
  190. 2.设置i2c的复用管脚配置,以及注册platform设备
  191. 调用完函数i2c_init后,系统将成功创建i2c总线。初始化完毕总线后还需要接着初始化i2c设备和i2c驱动(一般是先初始化device)
  192. linux内核中的device初始化一般是通过platform device来初始化的,platform device的初始化在da850_evm_init().
  193. static __init void da850_evm_init(void)
  194. {
  195.     int ret;
  196.     char mask = 0;
  197.     //\arch\arm\mach-davinci\include\mach\common.h中定义davinci_soc_info结构。
  198.     //\arch\arm\mach-davinci\common.c中davinci_common_init()对其初始化。
  199.     //davinci_soc_info真正的定义在\arch\arm\mach-davinci\da850.c中,定义达芬奇架构的各类资源的地址等
  200.     struct davinci_soc_info *soc_info = &davinci_soc_info;

  201.     //......
  202.     /*const short da850_i2c0_pins[] __initdata = {
  203.             DA850_GPIO1_4, DA850_GPIO1_5,
  204.             -1
  205.         };
  206.     */
  207.     ret = davinci_cfg_reg_list(da850_i2c0_pins);//i2c的复用管脚配置
  208.     if (ret)
  209.         pr_warning("da850_evm_init: i2c0 mux setup failed: %d\n",ret);

  210.     /*
  211.         static struct i2c_gpio_platform_data da850_gpio_i2c_pdata = {
  212.             .sda_pin    = GPIO_TO_PIN(1, 4),//20 #define GPIO_TO_PIN(bank, gpio)    (16 * (bank) + (gpio)) 
  213.             .scl_pin    = GPIO_TO_PIN(1, 5),//21
  214.             .udelay        = 2,//250 KHz 
  215.             //.sda_is_open_drain =1, //未设置
  216.             //.scl_is_open_drain =1, //未设置
  217.             //.scl_is_output_only =1, //未设置
  218.         };
  219.         
  220.         static struct platform_device da850_gpio_i2c = {
  221.             .name        = "i2c-gpio",
  222.             .id        = 1,
  223.             .dev        = {
  224.                 .platform_data    = &da850_gpio_i2c_pdata,
  225.             },
  226.         };
  227.     */
  228.     platform_device_register(&da850_gpio_i2c);//注册i2c对应的platform设备
  229.     
  230.     //......
  231. }

  232. 3.在完成platform_device的添加之后,i2c子系统将进行platform_driver的注册过程。platform_driver的注册通过调用初始化函数i2c_gpio_init()函数来完成。
  233. static int __init i2c_gpio_init(void)
  234. {
  235.     int ret;
  236.     /*
  237.         static struct platform_driver i2c_gpio_driver = {
  238.             .driver        = {
  239.                 .name    = "i2c-gpio",
  240.                 .owner    = THIS_MODULE,
  241.             },
  242.             .probe        = i2c_gpio_probe,
  243.             .remove        = __devexit_p(i2c_gpio_remove),
  244.         };
  245.     */
  246.     //注册i2c设备对应的platform驱动,会调用i2c_gpio_probe
  247.     ret = platform_driver_register(&i2c_gpio_driver);
  248.     if (ret)
  249.         printk(KERN_ERR "i2c-gpio: probe failed: %d\n", ret);

  250.     return ret;
  251. }

  252. //3.1 platform_driver在注册到platform_bus总线的过程中会尝试将已注册的platform_driver与已注册到platform_bus上的所有platform_device进行配对。
  253. //配对过程通过调用总线的match方法实现,即platform_match函数.就是根据platfor_device和platform_driver的名字来实现配对。
  254. //但是platform_driver有好几个名字可以选择,通过id_table来实现配对。
  255. //执行到此处,之前已注册到platform_bus的platform_device型设备da850_gpio_i2c和现在刚注册到platform_bus总线的platfor_drver型驱动i2c_gpio_driver将实现配对成功。
  256. //因为他们的名字都是“i2c-gpio”。
  257. //3.2 成功配对之后将尝试进行probe。成功配对后首先调用的是总线的probe,假如总线未初始化probe方法才会去 调用驱动中的probe,即platform_driver.drv->probe,
  258. //而platform_bus本身未初始化probe方法,所以此处调用驱动的probe方法,驱动的probe在注册过程中已被初始化。即i2c_gpio_probe()。

  259. static int __devinit i2c_gpio_probe(struct platform_device *pdev)
  260. {
  261.     //传入的platform_device就是前边已经注册过的da850_gpio_i2c
  262.     struct i2c_gpio_platform_data *pdata;
  263.     struct i2c_algo_bit_data *bit_data;
  264.     struct i2c_adapter *adap;
  265.     int ret;

  266.     /*这个结构体主要描述gpio模拟i2c总线,sda_pin和scl_pin表示使用哪两个IO管脚来模拟I2C总线,
  267.     udelay和timeout分别为它的时钟频率和超时时间,sda_is_open_drain和scl_is_open_drain表示sda、scl这两个管脚是否是开漏(opendrain)电路,
  268.     如果是设置为1,scl_is_output_only表示scl这个管脚是否只是作为输出,如果是设置为1。
  269.     static struct i2c_gpio_platform_data da850_gpio_i2c_pdata = {
  270.             .sda_pin    = GPIO_TO_PIN(1, 4),//20
  271.             .scl_pin    = GPIO_TO_PIN(1, 5),//21
  272.             .udelay        = 2,//250 KHz         
  273.         };
  274.     */
  275.     pdata = pdev->dev.platform_data;//得到设备的i2c_gpio_platform_data结构
  276.     if (!pdata)
  277.         return -ENXIO;

  278.     ret = -ENOMEM;
  279.     adap = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);//分配适配器i2c_adapter结构空间
  280.     if (!adap)
  281.         goto err_alloc_adap;
  282.         
  283.     bit_data = kzalloc(sizeof(struct i2c_algo_bit_data), GFP_KERNEL);//申请空间,这个结构主要用来定义对GPIO管脚的一些操作
  284.     if (!bit_data)
  285.         goto err_alloc_bit_data;

  286.     //使用gpio_request去申请这个两个GPIO管脚,申请的目的是为了防止重复使用管脚。
  287.     //然后是根据struct i2c_gpio_platform_data结构中定义的后面三个数据对struct i2c_algo_bit_data结构中的函数指针做一些赋值操作
  288.     ret = gpio_request(pdata->sda_pin, "sda");//向全局数组gpio_desc[]申请一个gpio,并设置对应的标志FLAG_REQUESTED表示申请。并取名为sda
  289.     if (ret)
  290.         goto err_request_sda;
  291.     ret = gpio_request(pdata->scl_pin, "scl");//同上
  292.     if (ret)
  293.         goto err_request_scl;
  294.     
  295.     //然后是根据struct i2c_gpio_platform_data结构中定义的后面三个数据对struct i2c_algo_bit_data结构中的函数指针做一些赋值操作
  296.     if (pdata->sda_is_open_drain) {//未设置
  297.         gpio_direction_output(pdata->sda_pin, 1);
  298.         bit_data->setsda = i2c_gpio_setsda_val;
  299.     } else {
  300.         gpio_direction_input(pdata->sda_pin);//设置为输入
  301.         bit_data->setsda = i2c_gpio_setsda_dir;//设置sda管脚的方向函数
  302.     }

  303.     if (pdata->scl_is_open_drain || pdata->scl_is_output_only) {//未设置
  304.         gpio_direction_output(pdata->scl_pin, 1);
  305.         bit_data->setscl = i2c_gpio_setscl_val;
  306.     } else {
  307.         gpio_direction_input(pdata->scl_pin);//设置为输入
  308.         bit_data->setscl = i2c_gpio_setscl_dir;//设置scl管脚的方向
  309.     }

  310.     if (!pdata->scl_is_output_only)//未设置
  311.         bit_data->getscl = i2c_gpio_getscl;
  312.     
  313.     bit_data->getsda = i2c_gpio_getsda;//读sda管脚数据的函数

  314.     //I2C时钟频率设置
  315.     if (pdata->udelay)//2,即250 KHz 
  316.         bit_data->udelay = pdata->udelay;
  317.     else if (pdata->scl_is_output_only)
  318.         bit_data->udelay = 50;//10 kHz
  319.     else
  320.         bit_data->udelay = 5;//100 kHz
  321.     
  322.     //I2C超时设置
  323.     if (pdata->timeout)
  324.         bit_data->timeout = pdata->timeout;
  325.     else
  326.         bit_data->timeout = HZ / 10;//100 ms

  327.     bit_data->data = pdata;//i2c_gpio_platform_data结构
  328.     
  329.     //初始化i2c_adapter结构
  330.     adap->owner = THIS_MODULE;
  331.     snprintf(adap->name, sizeof(adap->name), "i2c-gpio%d", pdev->id);//设置adapter的名称:i2c-gpio1
  332.     adap->algo_data = bit_data;//通信算法的数据
  333.     adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
  334.     adap->dev.parent = &pdev->dev;//父设备指向platform_device

  335.     //pdev->id = 1,表示总线号
  336.     adap->nr = (pdev->id != -1) ? pdev->id : 0;
  337.     
  338.     //继续初始化i2c_adapter结构,设置通信方法,然后在i2c-core中注册适配器。
  339.     ret = i2c_bit_add_numbered_bus(adap);
  340.     if (ret)
  341.         goto err_add_bus;
  342.     
  343.     //保存i2c_adapter结构到pdev???
  344.     platform_set_drvdata(pdev, adap);

  345.     dev_info(&pdev->dev, "using pins %u (SDA) and %u (SCL%s)\n",pdata->sda_pin, pdata->scl_pin,pdata->scl_is_output_only? ", no clock stretching" : "");

  346.     return 0;

  347. err_add_bus:
  348.     gpio_free(pdata->scl_pin);
  349. err_request_scl:
  350.     gpio_free(pdata->sda_pin);
  351. err_request_sda:
  352.     kfree(bit_data);
  353. err_alloc_bit_data:
  354.     kfree(adap);
  355. err_alloc_adap:
  356.     return ret;
  357. }

  358. int i2c_bit_add_numbered_bus(struct i2c_adapter *adap)
  359. {
  360.     int err;
  361.     
  362.     //初始化i2c_adapter的通信方法
  363.     err = i2c_bit_prepare_bus(adap);
  364.     if (err)
  365.         return err;
  366.         
  367.     return i2c_add_numbered_adapter(adap);//注册adapter
  368. }

  369. static int i2c_bit_prepare_bus(struct i2c_adapter *adap)
  370. {
  371.     struct i2c_algo_bit_data *bit_adap = adap->algo_data;

  372.     if (bit_test) {//bit_test =0
  373.         int ret = test_bus(bit_adap, adap->name);
  374.         if (ret < 0)
  375.             return -ENODEV;
  376.     }

  377.     /* static const struct i2c_algorithm i2c_bit_algo = {
  378.             .master_xfer    = bit_xfer,//数据传输函数
  379.             .functionality    = bit_func,
  380.         };
  381.  */
  382.  //设置i2c_adapter的通信方法
  383.     adap->algo = &i2c_bit_algo;
  384.     adap->retries = 3;

  385.     return 0;
  386. }

  387. int i2c_add_numbered_adapter(struct i2c_adapter *adap)
  388. {
  389.     int    id;
  390.     int    status;

  391.     if (adap->nr & ~MAX_ID_MASK)//adap->nr=1
  392.         return -EINVAL;

  393. retry:
  394.     /*
  395.     在这里涉及到一个idr结构。idr结构本来是为了配合page cache中的radix tree而设计的。在这里我们只需要知道,它是一种高效的搜索树,且这个树预先存放了一些内存。避免在内存不够的时候出现问题。所以,在往idr中插入结构的时候,首先要调用idr_pre_get()为它预留足够的空闲内存,然后再调用idr_get_new_above()将结构插入idr中,该函数以参数的形式返回一个id.以后凭这个id就可以在idr中找到相对应的结构了。
  396.     */
  397.     if (idr_pre_get(&i2c_adapter_idr, GFP_KERNEL) == 0)
  398.         return -ENOMEM;

  399.     mutex_lock(&core_lock);//上锁
  400.     
  401.     //它是将adapter结构插入到i2c_adapter_idr中,存放位置的id必须要大于或者等于adap->nr,然后将对应的id号存放在adapter->nr中
  402.     status = idr_get_new_above(&i2c_adapter_idr, adap, adap->nr, &id);
  403.     if (status == 0 && id != adap->nr) {
  404.         status = -EBUSY;
  405.         idr_remove(&i2c_adapter_idr, id);
  406.     }
  407.     mutex_unlock(&core_lock);//解锁
  408.     if (status == -EAGAIN)
  409.         goto retry;

  410.     if (status == 0)
  411.         status = i2c_register_adapter(adap);//对这个adapter进行进一步注册。
  412.     return status;
  413. }

  414. static int i2c_register_adapter(struct i2c_adapter *adap)
  415. {
  416.     int res = 0;

  417.     if (unlikely(WARN_ON(!i2c_bus_type.p))) {
  418.         res = -EAGAIN;
  419.         goto out_list;
  420.     }

  421.     /* Sanity checks */
  422.     if (unlikely(adap->name[0] == '\0')) {//adapter的name不为空
  423.         pr_err("i2c-core: Attempt to register an adapter with ""no name!\n");
  424.         return -EINVAL;
  425.     }
  426.     if (unlikely(!adap->algo)) {//adapter的通信算法不能为空
  427.         pr_err("i2c-core: Attempt to register adapter '%s' with ""no algo!\n", adap->name);
  428.         return -EINVAL;
  429.     }

  430.     rt_mutex_init(&adap->bus_lock);
  431.     mutex_init(&adap->userspace_clients_lock);
  432.     INIT_LIST_HEAD(&adap->userspace_clients);

  433.     //若没设置超时时间,则缺省为HZ。实际已经设置
  434.     if (adap->timeout == 0)
  435.         adap->timeout = HZ;
  436.     
  437.     //adapter中内嵌的struct device结构进行必须的初始化
  438.     dev_set_name(&adap->dev, "i2c-%d", adap->nr);//设置adapter->dev的设备名:i2c-1
  439.     adap->dev.bus = &i2c_bus_type;//adapter中内嵌的struct device所在总线为i2c_bus_type
  440.     adap->dev.type = &i2c_adapter_type;
  441.     
  442.     //adapter内嵌的struct device注册
  443.     res = device_register(&adap->dev);
  444.     if (res)
  445.         goto out_list;

  446.     dev_dbg(&adap->dev, "adapter [%s] registered\n", adap->name);

  447.     //调用此函数i2c_scan_static_board_info之前,必须要调用i2c_register_board_info()将板子上的I2C设备信息预先注册到__i2c_board_list链表中,
  448.     //同时才会更改__i2c_first_dynamic_bus_num的值
  449.     if (adap->nr < __i2c_first_dynamic_bus_num)//__i2c_first_dynamic_bus_num=0,adap->nr=1,不会调用下边的函数
  450.         i2c_scan_static_board_info(adap);//遍历__i2c_board_list中挂载的i2c_devinfo结构,每个都是一个i2c_client即i2c设备。
  451.                                                                         //若i2c设备(i2c_client)与adapter位于同一i2c总线上,则调用i2c_new_device()进行i2c设备(i2c_client)注册
  452.     /* Notify drivers */
  453.     mutex_lock(&core_lock);
  454.     //在新的适配器加入内核时调用函数 bus_for_each_drv时调用的函数。
  455.   //函数bus_for_each_drv是在总线类型为i2c_bus_type的驱动中找到一个驱动与新加入的适配器匹配。
  456.     bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);//遍历该总线上所有的driver,并设用attach_adapter,因为i2c_driver还没注册,
  457.                                                                                                                                         //attach_adapter为空,设置会调用失败。
  458.     mutex_unlock(&core_lock);

  459.     return 0;

  460. out_list:
  461.     mutex_lock(&core_lock);
  462.     idr_remove(&i2c_adapter_idr, adap->nr);
  463.     mutex_unlock(&core_lock);
  464.     return res;
  465. }

  466. static int __process_new_adapter(struct device_driver *d, void *data)
  467. {
  468.     return i2c_do_add_adapter(to_i2c_driver(d), data);
  469. }

  470. static int i2c_do_add_adapter(struct i2c_driver *driver,struct i2c_adapter *adap)
  471. {
  472.     i2c_detect(adap, driver);

  473.     if (driver->attach_adapter) {//这里还没有设置attach_adapter字段,所以下边的函数不会执行
  474.         driver->attach_adapter(adap);
  475.     }
  476.     return 0;
  477. }

  478. //这个函数比较简单, struct i2c_board_info用来表示I2C设备的一些情况,比如所在的总线。名称,地址,中断号等。最后,这些信息会被存放到__i2c_board_list链表。
  479. /*
  480. static struct i2c_board_info __initdata da850_evm_i2c_devices[] = {
  481.     {
  482.         I2C_BOARD_INFO("24c256", 0x50),
  483.         .platform_data = &da850_evm_i2c_eeprom_info,
  484.     },
  485.     {
  486.         I2C_BOARD_INFO("tlv320aic3x", 0x18),
  487.     },

  488.     {
  489.         I2C_BOARD_INFO("tca6416", 0x20),
  490.         .platform_data = &da850_evm_ui_expander_info,
  491.     },
  492.     {
  493.         I2C_BOARD_INFO("tca6416", 0x21),
  494.         .platform_data = &da850_evm_bb_expander_info,
  495.     },
  496.     
  497.     {
  498.         I2C_BOARD_INFO("tps6507x", 0x48),
  499.         .platform_data = &tps_board,
  500.     },
  501.     {
  502.         I2C_BOARD_INFO("cdce913", 0x65),
  503.     },
  504.     {
  505.         I2C_BOARD_INFO("PCA9543A", 0x73),
  506.     },
  507. };
  508. */
  509. int __init i2c_register_board_info(int busnum,struct i2c_board_info const *info, unsigned len)
  510. {
  511.     int status;
  512.     mutex_lock(&__i2c_board_lock);

  513.     if (busnum >= __i2c_first_dynamic_bus_num)
  514.         __i2c_first_dynamic_bus_num = busnum + 1;
  515.         
  516.     for (status = 0; len; len--, info++) {
  517.         struct i2c_devinfo *devinfo;
  518.         devinfo = kzalloc(sizeof(*devinfo), GFP_KERNEL);
  519.         if (!devinfo) {
  520.             pr_debug("i2c-core: can't register boardinfo!\n");
  521.             status = -ENOMEM;
  522.             break;
  523.         }
  524.         devinfo->busnum = busnum;
  525.         devinfo->board_info = *info;
  526.         list_add_tail(&devinfo->list, &__i2c_board_list);
  527.     }
  528.     mutex_unlock(&__i2c_board_lock);
  529.     return status;
  530. }

  531. static void i2c_scan_static_board_info(struct i2c_adapter *adapter)
  532. {
  533.     struct i2c_devinfo    *devinfo;

  534.     down_read(&__i2c_board_lock);
  535.     list_for_each_entry(devinfo, &__i2c_board_list, list) {//遍历__i2c_board_list链表中挂载的i2c_devinfo结构
  536.         //如果指定设备是位于adapter所在的I2C总线上,那么,就调用i2c_new_device()
  537.         if (devinfo->busnum == adapter->nr && !i2c_new_device(adapter,&devinfo->board_info))//adapter->nr = 1
  538.             dev_err(&adapter->dev,"Can't create device at 0x%02x\n",devinfo->board_info.addr);
  539.     }
  540.     up_read(&__i2c_board_lock);
  541. }

  542. struct i2c_client *i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
  543. {
  544.     struct i2c_client    *client;
  545.     int            status;

  546.     //i2c_client表示一个具体的I2C设备,就是一个嵌入struct device的I2C设备的封装
  547.     client = kzalloc(sizeof *client, GFP_KERNEL);//分配空间
  548.     if (!client)
  549.         return NULL;
  550.     //client->adapter指向了它所在的adapter
  551.     client->adapter = adap;
  552.     //
  553.     client->dev.platform_data = info->platform_data;

  554.     if (info->archdata)
  555.         client->dev.archdata = *info->archdata;
  556.     
  557.     //设置标志,地址以及中断号
  558.     client->flags = info->flags;
  559.     client->addr = info->addr;
  560.     client->irq = info->irq;

  561.     //设置i2c设备名
  562.     strlcpy(client->name, info->type, sizeof(client->name));

  563.     //检查设备地址的有效性
  564.     status = i2c_check_client_addr_validity(client);
  565.     if (status) {
  566.         dev_err(&adap->dev, "Invalid %d-bit I2C address 0x%02hx\n",client->flags & I2C_CLIENT_TEN ? 10 : 7, client->addr);
  567.         goto out_err_silent;
  568.     }

  569.     /* Check for address business */
  570.     status = i2c_check_addr_busy(adap, client->addr);
  571.     if (status)
  572.         goto out_err;

  573.     client->dev.parent = &client->adapter->dev;
  574.     client->dev.bus = &i2c_bus_type;
  575.     client->dev.type = &i2c_client_type;
  576. #ifdef CONFIG_OF
  577.     client->dev.of_node = info->of_node;
  578. #endif
  579.     //设置i2c设备的名称
  580.     dev_set_name(&client->dev, "%d-%04x", i2c_adapter_id(adap),client->addr);
  581.     //将i2c设备内嵌的dev注册
  582.     status = device_register(&client->dev);
  583.     if (status)
  584.         goto out_err;

  585.     dev_dbg(&adap->dev, "client [%s] registered with bus id %s\n",client->name, dev_name(&client->dev));
  586.     return client;

  587. out_err:
  588.     dev_err(&adap->dev, "Failed to register i2c client %s at 0x%02x ""(%d)\n", client->name, client->addr, status);
  589. out_err_silent:
  590.     kfree(client);
  591.     return NULL;
  592. }

  593. 4.运行i2c_dev_init函数,注册设备,注册设备驱动,以_init为头的函数,在运行过后系统将回收其内存
  594. //前边已经注册了adapter设备device_register(&adap->dev);下边要注册设备的驱动i2c_add_driver(&i2cdev_driver);
  595. //驱动注册成功会和前边才注册的adapter设备相匹配i2cdev_attach_adapter(),匹配成功则创建设备文件。
  596. static int __init i2c_dev_init(void)
  597. {
  598.     int res;

  599.     printk(KERN_INFO "i2c /dev entries driver\n");
  600.     
  601.     //register_chrdev函数最终会向系统注册主设备为I2C_MAJOR,此设备号为0~255的设备。这表示系统最多可以容纳256个i2c adapter,其中注册的结构体&i2cdev_fops,给用户空间提供了调用接口,就是个字符型驱动
  602.     /*当read()、write()、open()、close()、ioctl()等系统调用发生时就会调用到这些函数。
  603.     static const struct file_operations i2cdev_fops = {
  604.         .owner        = THIS_MODULE,
  605.         .llseek        = no_llseek,
  606.         .read        = i2cdev_read,
  607.         .write        = i2cdev_write,
  608.         .unlocked_ioctl    = i2cdev_ioctl,
  609.         .open        = i2cdev_open,
  610.         .release    = i2cdev_release,
  611.     };
  612.     */
  613.     res = register_chrdev(I2C_MAJOR, "i2c", &i2cdev_fops);
  614.     if (res)
  615.         goto out;

  616.      //创建设备类,字符设备注册完毕后通过class_create()函数初始化一个类i2c_dev_class,这个类稍后需要使用,用于在/dev/i2c-0下自动创建设备.
  617.      //注册一个类,使i2c可以在"/dev/"目录下 面建立设备节点
  618.     i2c_dev_class = class_create(THIS_MODULE, "i2c-dev");
  619.     if (IS_ERR(i2c_dev_class)) {
  620.         res = PTR_ERR(i2c_dev_class);
  621.         goto out_unreg_chrdev;
  622.     }
  623.     
  624.     //调用函数i2c_add_driver函数注册i2c driver。这里所说的i2c其实对应的是系统中所有的i2c类设备(包括i2c_client and adapter)
  625.     /*
  626.         static struct i2c_driver i2cdev_driver = { 
  627.          .driver = { 
  628.          .name = "dev_driver", 
  629.          }, 
  630.          .attach_adapter = i2cdev_attach_adapter, 
  631.          .detach_adapter = i2cdev_detach_adapter, 
  632.         }; 

  633.     */
  634.     //其作用在于为系统中所有已安装的i2c适配器调用i2cdev_driver的attach_adpter方法,
  635.     //即i2cdev_attach_adapter函数,为所有已安装的适配器创建相应的/dev/i2c-%d字符设备结点并注册设备访问方法。
  636.     res = i2c_add_driver(&i2cdev_driver);
  637.     if (res)
  638.         goto out_unreg_class;

  639.     return 0;

  640. out_unreg_class:
  641.     class_destroy(i2c_dev_class);
  642. out_unreg_chrdev:
  643.     unregister_chrdev(I2C_MAJOR, "i2c");
  644. out:
  645.     printk(KERN_ERR "%s: Driver Initialisation failed\n", __FILE__);
  646.     return res;
  647. }

  648. static inline int i2c_add_driver(struct i2c_driver *driver)
  649. {
  650.     return i2c_register_driver(THIS_MODULE, driver);
  651. }

  652. int i2c_register_driver(struct module *owner, struct i2c_driver *driver)
  653. {
  654.     int res;

  655.     /* Can't register until after driver model init */
  656.     if (unlikely(WARN_ON(!i2c_bus_type.p)))
  657.         return -EAGAIN;

  658.     //关联到i2c_bus_types
  659.     driver->driver.owner = owner;
  660.     driver->driver.bus = &i2c_bus_type;

  661.     //注册i2c_driver结构中内嵌的device_driver
  662.     res = driver_register(&driver->driver);
  663.     if (res)
  664.         return res;

  665.     pr_debug("i2c-core: driver [%s] registered\n", driver->driver.name);

  666.     INIT_LIST_HEAD(&driver->clients);
  667.     /* Walk the adapters that are already present */
  668.     mutex_lock(&core_lock);
  669.     bus_for_each_dev(&i2c_bus_type, NULL, driver, __process_new_driver);//遍历i2c_bus_type总线上所有的设备,与新加入的驱动相匹配,并调用驱动的attach_adapter
  670.     mutex_unlock(&core_lock);

  671.     return 0;
  672. }

  673. static int __process_new_driver(struct device *dev, void *data)
  674. {
  675.     if (dev->type != &i2c_adapter_type)
  676.         return 0;
  677.     //前边adapter的dev已经注册,这里会找到注册的i2c_adapter设备
  678.     return i2c_do_add_adapter(data, to_i2c_adapter(dev));
  679. }

  680. static int i2c_do_add_adapter(struct i2c_driver *driver,struct i2c_adapter *adap)
  681. {
  682.     i2c_detect(adap, driver);//空函数

  683.     if (driver->attach_adapter) {
  684.         driver->attach_adapter(adap);//调用i2cdev_attach_adapter()
  685.     }
  686.     return 0;
  687. }

  688. static int i2cdev_attach_adapter(struct i2c_adapter *adap)
  689. {
  690.     struct i2c_dev *i2c_dev;
  691.     int res;

  692.     i2c_dev = get_free_i2c_dev(adap);//创建一个i2c_dev结构,并且指向adap( i2c_dev->adap = adap;)
  693.     if (IS_ERR(i2c_dev))
  694.         return PTR_ERR(i2c_dev);

  695.     /* 可见attach_adapter函数的作用就是调用device_create()函数 通过之前class_create的类信息在/dev下自动创建设备文件。
  696.     并且此设备的设备号是由固定的主设备号I2C_MAJOR 和 从设备号组成的,从设备号取的就是adapter的nr,此处为0。
  697.     并且可以推断出系统最多可以容纳0~255 总共256个i2c adapter。
  698.  */
  699.      //创建一个设备节点,节点名为"i2c-1"
  700.     i2c_dev->dev = device_create(i2c_dev_class, &adap->dev,MKDEV(I2C_MAJOR, adap->nr), NULL,"i2c-%d", adap->nr);
  701.     if (IS_ERR(i2c_dev->dev)) {
  702.         res = PTR_ERR(i2c_dev->dev);
  703.         goto error;
  704.     }
  705.     res = device_create_file(i2c_dev->dev, &dev_attr_name);
  706.     if (res)
  707.         goto error_destroy;

  708.     pr_debug("i2c-dev: adapter [%s] registered as minor %d\n",adap->name, adap->nr);
  709.     return 0;
  710. error_destroy:
  711.     device_destroy(i2c_dev_class, MKDEV(I2C_MAJOR, adap->nr));
  712. error:
  713.     return_i2c_dev(i2c_dev);
  714.     return res;
  715. }
  716. 六、i2c的打开、读、写
  717. 初始化过后就可以通过用户空间对i2c进行读写。
  718. 6.1 i2c的打开
  719. static int i2cdev_open(struct inode *inode, struct file *file)
  720. {
  721.     unsigned int minor = iminor(inode);
  722.     struct i2c_client *client;
  723.     struct i2c_adapter *adap;
  724.     struct i2c_dev *i2c_dev;

  725.     i2c_dev = i2c_dev_get_by_minor(minor);
  726.     if (!i2c_dev)
  727.         return -ENODEV;

  728.     adap = i2c_get_adapter(i2c_dev->adap->nr);
  729.     if (!adap)
  730.         return -ENODEV;

  731.     client = kzalloc(sizeof(*client), GFP_KERNEL);
  732.     if (!client) {
  733.         i2c_put_adapter(adap);
  734.         return -ENOMEM;
  735.     }
  736.     snprintf(client->name, I2C_NAME_SIZE, "i2c-dev %d", adap->nr);
  737.     client->driver = &i2cdev_driver;//设备驱动(adapter 也是这个设备驱动,共用)

  738.     client->adapter = adap;
  739.     file->private_data = client;//保存到文件的private_data字段中

  740.     return 0;
  741. }

  742. 6.2 i2c的读数据
  743. static ssize_t i2cdev_read(struct file *file, char __user *buf, size_t count,loff_t *offset)
  744. {
  745.     char *tmp;
  746.     int ret;

  747.     struct i2c_client *client = file->private_data;

  748.     if (count > 8192)
  749.         count = 8192;

  750.     tmp = kmalloc(count, GFP_KERNEL);
  751.     if (tmp == NULL)
  752.         return -ENOMEM;

  753.     pr_debug("i2c-dev: i2c-%d reading %zu bytes.\n",iminor(file->f_path.dentry->d_inode), count);

  754.     ret = i2c_master_recv(client, tmp, count);
  755.     if (ret >= 0)
  756.         ret = copy_to_user(buf, tmp, count) ? -EFAULT : ret;
  757.     kfree(tmp);
  758.     return ret;
  759. }

  760. int i2c_master_recv(struct i2c_client *client, char *buf, int count)
  761. {
  762.     struct i2c_adapter *adap = client->adapter;
  763.     struct i2c_msg msg;
  764.     int ret;

  765.     msg.addr = client->addr;//应用程序会通过ioctl(i2c_fd,I2C_SLAVE,slaveaddr)来设置client的地址
  766.     msg.flags = client->flags & I2C_M_TEN;
  767.     msg.flags |= I2C_M_RD;
  768.     msg.len = count;
  769.     msg.buf = buf;

  770.     ret = i2c_transfer(adap, &msg, 1);//传输1个msg

  771.     return (ret == 1) ? count : ret;
  772. }

  773. int i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num)
  774. {
  775.     unsigned long orig_jiffies;
  776.     int ret, try;
  777.     
  778.     if (adap->algo->master_xfer) {//存在通信方法
  779.         if (in_atomic() || irqs_disabled()) {
  780.             ret = i2c_trylock_adapter(adap);
  781.             if (!ret)/* I2C activity is ongoing. */
  782.                 return -EAGAIN;
  783.         } else {
  784.             i2c_lock_adapter(adap);//给adapter上锁
  785.         }

  786.         orig_jiffies = jiffies;
  787.         for (ret = 0, try = 0; try <= adap->retries; try++) {
  788.             ret = adap->algo->master_xfer(adap, msgs, num);//最终转换为i2c_algorithm中的master_xfer传输,调用bit_xfer()
  789.             if (ret != -EAGAIN)
  790.                 break;
  791.             if (time_after(jiffies, orig_jiffies + adap->timeout))//retry间隔时间
  792.                 break;
  793.         }
  794.         i2c_unlock_adapter(adap);//给adapter解锁

  795.         return ret;
  796.     } else {
  797.         dev_dbg(&adap->dev, "I2C level transfers not supported\n");
  798.         return -EOPNOTSUPP;
  799.     }
  800. }

  801. static int bit_xfer(struct i2c_adapter *i2c_adap,struct i2c_msg msgs[], int num)
  802. {
  803.     struct i2c_msg *pmsg;
  804.     struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  805.     int i, ret;
  806.     unsigned short nak_ok;

  807.     if (adap->pre_xfer) {//这个字段没有设置
  808.         ret = adap->pre_xfer(i2c_adap);
  809.         if (ret < 0)
  810.             return ret;
  811.     }

  812.     bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
  813.     
  814.     /*发送起始信号*/ 
  815.     i2c_start(adap);
  816.     for (= 0; i < num; i++) {//这里的num代表有几个struct i2c_msg
  817.         pmsg = &msgs[i];
  818.         nak_ok = pmsg->flags & I2C_M_IGNORE_NAK;
  819.         /*
  820.         I2C_M_NOSTART标志,这个标志主要用于写操作时,不必重新发送起始信号和设备地址,但是对于读操作就不同了,
  821.         要调用i2c_repstart这个函数去重新发送起始信号,调用bit_doAddress函数去重新构造设备地址字节
  822.         */
  823.         if (!(pmsg->flags & I2C_M_NOSTART)) {
  824.             if (i) {
  825.                 bit_dbg(3, &i2c_adap->dev, "emitting ""repeated start condition\n");
  826.                 i2c_repstart(adap);
  827.             }
  828.             ret = bit_doAddress(i2c_adap, pmsg);//重新构造设备地址字节
  829.             if ((ret != 0) && !nak_ok) {
  830.                 bit_dbg(1, &i2c_adap->dev, "NAK from ""device addr 0x%02x msg #%d\n",msgs[i].addr, i);
  831.                 goto bailout;
  832.             }
  833.         }
  834.         
  835.         if (pmsg->flags & I2C_M_RD) {//读数据
  836.             ret = readbytes(i2c_adap, pmsg);
  837.             if (ret >= 1)
  838.                 bit_dbg(2, &i2c_adap->dev, "read %d byte%s\n",ret, ret == 1 ? "" : "s");
  839.             if (ret < pmsg->len) {
  840.                 if (ret >= 0)
  841.                     ret = -EREMOTEIO;
  842.                 goto bailout;
  843.             }
  844.         } else {//写数据
  845.             ret = sendbytes(i2c_adap, pmsg);
  846.             if (ret >= 1)
  847.                 bit_dbg(2, &i2c_adap->dev, "wrote %d byte%s\n",ret, ret == 1 ? "" : "s");
  848.             if (ret < pmsg->len) {
  849.                 if (ret >= 0)
  850.                     ret = -EREMOTEIO;
  851.                 goto bailout;
  852.             }
  853.         }
  854.     }
  855.     ret = i;

  856. bailout:
  857.     bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
  858.     i2c_stop(adap);

  859.     if (adap->post_xfer)
  860.         adap->post_xfer(i2c_adap);
  861.     return ret;
  862. }

  863. 这里先做了一个判断,10位设备地址和7位设备地址分别做不同的处理,通常一条I2C总线上不会挂那么多I2C设备,所以10位地址不常用,直接看对7位地址的处理。struct i2c_msg中addr中是真正的设备地址,而这里发送的addr高7位才是设备地址,最低位为读写位,如果为读,最低位为1,如果为写,最低位为0。所以要将struct i2c_msg中addr向左移1位,如果定义了I2C_M_RD标志,就将addr或上1,前面就说过,这个标志就代表读,如果是写,这里就不用处理,因为最低位本身就是0。最后调用try_address函数将这个地址字节发送出去。
  864. static int bit_doAddress(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  865. {
  866.     unsigned short flags = msg->flags;
  867.     unsigned short nak_ok = msg->flags & I2C_M_IGNORE_NAK;
  868.     struct i2c_algo_bit_data *adap = i2c_adap->algo_data;

  869.     unsigned char addr;
  870.     int ret, retries;

  871.     retries = nak_ok ? 0 : i2c_adap->retries;

  872.     if (flags & I2C_M_TEN) {
  873.         /* a ten bit address */
  874.         addr = 0xf0 | ((msg->addr >> 7) & 0x03);
  875.         bit_dbg(2, &i2c_adap->dev, "addr0: %d\n", addr);
  876.         /* try extended address code...*/
  877.         ret = try_address(i2c_adap, addr, retries);
  878.         if ((ret != 1) && !nak_ok) {
  879.             dev_err(&i2c_adap->dev,
  880.                 "died at extended address code\n");
  881.             return -EREMOTEIO;
  882.         }
  883.         /* the remaining 8 bit address */
  884.         ret = i2c_outb(i2c_adap, msg->addr & 0x7f);
  885.         if ((ret != 1) && !nak_ok) {
  886.             /* the chip did not ack / xmission error occurred */
  887.             dev_err(&i2c_adap->dev, "died at 2nd address code\n");
  888.             return -EREMOTEIO;
  889.         }
  890.         if (flags & I2C_M_RD) {
  891.             bit_dbg(3, &i2c_adap->dev, "emitting repeated "
  892.                 "start condition\n");
  893.             i2c_repstart(adap);
  894.             /* okay, now switch into reading mode */
  895.             addr |= 0x01;
  896.             ret = try_address(i2c_adap, addr, retries);
  897.             if ((ret != 1) && !nak_ok) {
  898.                 dev_err(&i2c_adap->dev,
  899.                     "died at repeated address code\n");
  900.                 return -EREMOTEIO;
  901.             }
  902.         }
  903.     } else {        /* normal 7bit address    */
  904.         addr = msg->addr << 1;
  905.         if (flags & I2C_M_RD)
  906.             addr |= 1;
  907.         if (flags & I2C_M_REV_DIR_ADDR)
  908.             addr ^= 1;
  909.         ret = try_address(i2c_adap, addr, retries);
  910.         if ((ret != 1) && !nak_ok)
  911.             return -ENXIO;
  912.     }

  913.     return 0;
  914. }

  915. //最主要的就是调用i2c_outb发送一个字节,retries为重复次数,看前面adap->retries= 3;
  916. //如果发送失败,也就是设备没有给出应答信号,那就发送停止信号,发送起始信号,再发送这个地址字节,这就叫retries。
  917. static int try_address(struct i2c_adapter *i2c_adap,unsigned char addr, int retries)
  918. {
  919.     struct i2c_algo_bit_data *adap = i2c_adap->algo_data;
  920.     int i, ret = 0;

  921.     for (= 0; i <= retries; i++) {
  922.         ret = i2c_outb(i2c_adap, addr);
  923.         if (ret == 1 || i == retries)
  924.             break;
  925.         bit_dbg(3, &i2c_adap->dev, "emitting stop condition\n");
  926.         i2c_stop(adap);
  927.         udelay(adap->udelay);
  928.         yield();
  929.         bit_dbg(3, &i2c_adap->dev, "emitting start condition\n");
  930.         i2c_start(adap);
  931.     }
  932.     if (&& ret)
  933.         bit_dbg(1, &i2c_adap->dev, "Used %d tries to %s client at ""0x%02x: %s\n", i + 1,addr & 1 ? "read from" : "write to", addr >> 1,ret == 1 ? "success" : "failed, timeout?");
  934.     return ret;
  935. }
  936. static int readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msg)
  937. {
  938.     int inval;
  939.     int rdcount = 0;    /* counts bytes read */
  940.     unsigned char *temp = msg->buf;
  941.     int count = msg->len;
  942.     const unsigned flags = msg->flags;

  943.     while (count > 0) {
  944.         inval = i2c_inb(i2c_adap);
  945.         if (inval >= 0) {
  946.             *temp = inval;
  947.             rdcount++;
  948.         } else { /* read timed out */
  949.             break;
  950.         }

  951.         temp++;
  952.         count--;

  953.         /* Some SMBus transactions require that we receive the
  954.          transaction length as the first read byte. */
  955.         if (rdcount == 1 && (flags & I2C_M_RECV_LEN)) {
  956.             if (inval <= 0 || inval > I2C_SMBUS_BLOCK_MAX) {
  957.                 if (!(flags & I2C_M_NO_RD_ACK))
  958.                     acknak(i2c_adap, 0);
  959.                 dev_err(&i2c_adap->dev, "readbytes: invalid ""block length (%d)\n", inval);
  960.                 return -EREMOTEIO;
  961.             }

  962.             count += inval;
  963.             msg->len += inval;
  964.         }

  965.         bit_dbg(2, &i2c_adap->dev, "readbytes: 0x%02x %s\n",inval,(flags & I2C_M_NO_RD_ACK)? "(no ack/nak)": (count ? "A" : "NA"));

  966.         if (!(flags & I2C_M_NO_RD_ACK)) {
  967.             inval = acknak(i2c_adap, count);
  968.             if (inval < 0)
  969.                 return inval;
  970.         }
  971.     }
  972.     return rdcount;
  973. }
  974. 6.3 i2c的写数据

  975. static ssize_t i2cdev_write(struct file *file, const char __user *buf,size_t count, loff_t *offset)
  976. {
  977.     int ret;
  978.     char *tmp;
  979.     struct i2c_client *client = file->private_data;

  980.     if (count > 8192)
  981.         count = 8192;

  982.     tmp = memdup_user(buf, count);
  983.     if (IS_ERR(tmp))
  984.         return PTR_ERR(tmp);

  985.     pr_debug("i2c-dev: i2c-%d writing %zu bytes.\n",iminor(file->f_path.dentry->d_inode), count);

  986.     ret = i2c_master_send(client, tmp, count);
  987.     kfree(tmp);
  988.     return ret;
  989. }

  990. int i2c_master_send(struct i2c_client *client, const char *buf, int count)
  991. {
  992.     int ret;
  993.     struct i2c_adapter *adap = client->adapter;
  994.     struct i2c_msg msg;

  995.     msg.addr = client->addr;
  996.     msg.flags = client->flags & I2C_M_TEN;
  997.     msg.len = count;
  998.     msg.buf = (char *)buf;

  999.     ret = i2c_transfer(adap, &msg, 1);

  1000.     return (ret == 1) ? count : ret;
  1001. }
0 0
原创粉丝点击