Linux I2C框架 —— struct i2c_msg 解析

在 Linux I2C 驱动中,struct i2c_msg 结构体用于描述 I2C 传输中的一条消息。每个消息都包含从设备地址、操作标志、数据长度以及数据缓冲区指针。结构体中的 flags 字段可以设置多个标志位,来控制 I2C 传输的行为。以下是 flags 可能的宏定义及其对应的操作:

1. I2C_M_RD (0x0001)

  • 作用:表示该消息是一个读取操作(从从设备读取数据到主设备)。
  • 说明:如果未设置该标志,则默认是写操作(主设备向从设备发送数据)。

2. I2C_M_TEN (0x0010)

  • 作用:使用 10 位地址模式,而不是默认的 7 位地址模式。
  • 说明:I2C 设备通常使用 7 位地址,但某些设备可能使用 10 位地址,此标志用于启用 10 位地址模式。

3. I2C_M_DMA_SAFE (0x0200)

  • 作用:表示该消息的缓冲区是 DMA 安全的(即可以安全地用于 DMA 传输)。
  • 说明:在内核空间使用 DMA 进行高效传输时,该标志表示数据缓冲区已正确分配,可以用于 DMA 传输。但在用户空间,此标志无意义,因为用户空间的数据通常会被复制到内核缓冲区。

4. I2C_M_RECV_LEN (0x0400)

  • 作用:用于特定的 I2C 设备,该设备在读取时,第一个字节表示接下来数据的长度。
  • 说明
    • 该标志必须与 I2C_M_RD(读取标志)一起使用。
    • 驱动程序会在第一个字节读取后,根据该字节的值调整实际读取的字节数。

5. I2C_M_NO_RD_ACK (0x0800)

  • 作用:用于不标准的 I2C 设备,表示在读取时不发送 ACK(确认信号)。
  • 说明:如果设置了这个标志,I2C 控制器在接收数据时不会发送 ACK,这在某些特殊设备或协议中可能有用。

6. I2C_M_IGNORE_NAK (0x1000)

  • 作用:忽略从设备的 NACK(非应答)。
  • 说明:通常,当 I2C 设备返回 NACK 时,传输会终止。但在某些情况下(例如某些 EEPROM),可能需要忽略 NACK 继续传输。

7. I2C_M_REV_DIR_ADDR (0x2000)

  • 作用:反向数据方向的地址操作(与正常的 I2C 地址传输顺序相反)。
  • 说明:该标志用于某些需要特殊协议的 I2C 设备,通常用于协议调整。

8. I2C_M_NOSTART (0x4000)

  • 作用:不发送起始信号(START),用于特定的 I2C 事务。
  • 说明
    • 通常 I2C 传输会先发送 START 信号,但某些设备可能不需要 START 信号,或者已经手动管理了总线状态,此标志用于此类情况。

9. I2C_M_STOP (0x8000)

  • 作用:强制在本消息结束后发送停止信号(STOP)。
  • 说明
    • 通常,I2C 传输在最后一条消息后发送 STOP 信号,但在某些情况下,驱动程序可能需要手动控制 STOP 发送行为。
    • 例如,在多消息事务中,某些消息可能希望保持总线活跃,而最后一条消息才发送 STOP。

总结:

宏定义作用
I2C_M_RD读取操作(从设备 -> 主机)
I2C_M_TEN使用 10 位地址模式
I2C_M_DMA_SAFE缓冲区可安全用于 DMA 传输
I2C_M_RECV_LEN读取数据时,第一个字节表示数据长度
I2C_M_NO_RD_ACK读取时不发送 ACK
I2C_M_IGNORE_NAK忽略从设备的 NACK
I2C_M_REV_DIR_ADDR反向地址传输顺序
I2C_M_NOSTART不发送 START 信号
I2C_M_STOP发送 STOP 信号

这些标志可以单独使用或组合使用,以实现各种 I2C 设备通信需求。在实际开发中,可以根据设备的数据手册选择合适的标志来确保通信正常。

Linux I2C框架 核心层简介
DRM显示框架下驱动编写