嵌入式Linux驱动开发(I2C专题)(二)

I2C系统的重要结构体

参考资料:

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

1. I2C硬件框架

嵌入式Linux驱动开发(I2C专题)(二)_第1张图片

2. I2C传输协议

嵌入式Linux驱动开发(I2C专题)(二)_第2张图片

3. Linux软件框架

嵌入式Linux驱动开发(I2C专题)(二)_第3张图片

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
      嵌入式Linux驱动开发(I2C专题)(二)_第4张图片

    • i2c_algorithm
      嵌入式Linux驱动开发(I2C专题)(二)_第5张图片

  • 怎么表示I2C Device
    • 一个I2C Device,一定有设备地址
    • 它连接在哪个I2C Controller上,即对应的i2c_adapter是什么
    • 使用i2c_client来表示一个I2C Device
      嵌入式Linux驱动开发(I2C专题)(二)_第6张图片
  • 怎么表示要传输的数据
    • 在上面的i2c_algorithm结构体中可以看到要传输的数据被称为:i2c_msg

    • i2c_msg
      嵌入式Linux驱动开发(I2C专题)(二)_第7张图片

    • 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
      在这里插入图片描述

你可能感兴趣的:(Linux,驱动以及裸机,linux,驱动开发,运维)