I2C系统的重要结构体

Posted 韦东山

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了I2C系统的重要结构体相关的知识,希望对你有一定的参考价值。

I2C系统的重要结构体

参考资料:

  • Linux驱动程序: drivers/i2c/i2c-dev.c
  • I2CTools: https://mirrors.edge.kernel.org/pub/software/utils/i2c-tools/

1. I2C硬件框架

2. I2C传输协议

  • 写操作

  • 读操作

3. Linux软件框架

4. 重要结构体

使用一句话概括I2C传输:APP通过I2C Controller与I2C Device传输数据。

在Linux中:

  • 怎么表示I2C Controller

    • 一个芯片里可能有多个I2C Controller,比如第0个、第1个、……

    • 对于使用者,只要确定是第几个I2C Controller即可

    • 使用i2c_adapter表示一个I2C BUS,或称为I2C Controller

    • 里面有2个重要的成员:

      • nr:第几个I2C BUS(I2C Controller)

      • i2c_algorithm,里面有该I2C BUS的传输函数,用来收发I2C数据

    • i2c_adapter

  • i2c_algorithm

  • 怎么表示I2C Device

    • 一个I2C Device,一定有设备地址
    • 它连接在哪个I2C Controller上,即对应的i2c_adapter是什么
    • 使用i2c_client来表示一个I2C Device
  • 怎么表示要传输的数据

    • 在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg

    • i2c_msg

    • i2c_msg中的flags用来表示传输方向:bit 0等于I2C_M_RD表示读,bit 0等于0表示写

    • 一个i2c_msg要么是读,要么是写

    • 举例:设备地址为0x50的EEPROM,要读取它里面存储地址为0x10的一个字节,应该构造几个i2c_msg?

      • 要构造2个i2c_msg

      • 第一个i2c_msg表示写操作,把要访问的存储地址0x10发给设备

      • 第二个i2c_msg表示读操作

      • 代码如下

        u8 data_addr = 0x10;
        i8 data;
        struct i2c_msg msgs[2];
        
        msgs[0].addr   = 0x50;
        msgs[0].flags  = 0;
        msgs[0].len    = 1;
        msgs[0].buf    = &data_addr;
        
        msgs[1].addr   = 0x50;
        msgs[1].flags  = I2C_M_RD;
        msgs[1].len    = 1;
        msgs[1].buf    = &data;
        

5. 内核里怎么传输数据

使用一句话概括I2C传输:

  • APP通过I2C Controller与I2C Device传输数据

  • APP通过i2c_adapter与i2c_client传输i2c_msg

  • 内核函数i2c_transfer

    • i2c_msg里含有addr,所以这个函数里不需要i2c_client

以上是关于I2C系统的重要结构体的主要内容,如果未能解决你的问题,请参考以下文章

2.2.I2C编程实践

gslx680触摸屏驱动源码码分析(gslX680.c)

Linux的i2c驱动详解

Linux——Linux驱动之玩转I2C(下)I2C driver驱动程序框架实现总结(i2c_driver结构体框架实现步骤驱动中读写I2C设备实测)

Linux——Linux驱动之玩转I2C(下)I2C driver驱动程序框架实现总结(i2c_driver结构体框架实现步骤驱动中读写I2C设备实测)

linux驱动之I2C子系统