Linux SMBus 块事务类型
Linux SMBus Block transaction types
最新的SMBus规范V3.0 20th Dec 2014只显示了一种类型的块write/read(不包括块过程调用):
6.5.7 Block Write/Read
Write: Address(Wr), Command, Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]
Read: Address(Wr), Command, Address(Rd), Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]
但是,查看 Linux 用户-space 界面,有 3 种块事务类型可与来自 uapi/linux/i2c.h 的 ioctl I2C_SMBUS
一起使用:
#define I2C_SMBUS_BLOCK_DATA 5
#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
#define I2C_SMBUS_I2C_BLOCK_DATA 8
遵循 drivers/i2c/* 下的代码,它委托给 i2c_algorithm
中的 smbus_xfer
/master_xfer
(如果模拟),这是特定于 adapter/device 的。
1.所有这些事务类型最终都遵循 SMBus 3.0 的块线规范吗?
2。我将如何决定我需要使用哪一个?
我正在 Raspbian GNU/Linux 10 (buster)
上创建一个 Java JNA 接口
- Do all these transaction types end up following the block wire spec for SMBus 3.0?
目前我正在写答案,Linux 内核中的 I2C 模块仍然不支持 SMBus 3.0/3.1。它实现了SMBus 2.0通信。
对于这 3 种类型 - 这无法回答。我觉得不是。要了解这些命令的工作原理,请查看 KMD 源代码。例如,I2C_SMBUS_I2C_BLOCK_BROKEN 被转换为 I2C_SMBUS_I2C_BLOCK_DATA 并带有以下注释:
/* Convert old I2C block commands to the new
convention. This preserves binary compatibility. */
以及 I2C_SMBUS_I2C_BLOCK_DATA 是否遵循块数据协议 - 这取决于用户。执行协议的命令是 I2C_SMBUS_BLOCK_DATA.
- And how would I decide which one I need to use?
如果你只想使用块协议,那么就使用I2C_SMBUS_BLOCK_DATA。
如果您想要更多的控制,或者想要克服 SMBus 2.0 的限制,您将不得不使用 I2C_SMBUS_I2C_BLOCK_DATA。尽管在这些情况下,您可能不得不转向手动构建 SMBus 消息,因为 I2C_SMBUS_I2C_BLOCK_DATA 仍然使您受到很大限制 - 您将在最大消息长度中多获得一个字节,但距离 255 还很远。
如果您根据 SMBus 1 规范编写,请在适当的时候使用 I2C_SMBUS_I2C_BLOCK_BROKEN。
最新的SMBus规范V3.0 20th Dec 2014只显示了一种类型的块write/read(不包括块过程调用):
6.5.7 Block Write/Read
Write: Address(Wr), Command, Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]
Read: Address(Wr), Command, Address(Rd), Count = N, Byte 1, Byte 2, ..., Byte N [, PEC]
但是,查看 Linux 用户-space 界面,有 3 种块事务类型可与来自 uapi/linux/i2c.h 的 ioctl I2C_SMBUS
一起使用:
#define I2C_SMBUS_BLOCK_DATA 5
#define I2C_SMBUS_I2C_BLOCK_BROKEN 6
#define I2C_SMBUS_I2C_BLOCK_DATA 8
遵循 drivers/i2c/* 下的代码,它委托给 i2c_algorithm
中的 smbus_xfer
/master_xfer
(如果模拟),这是特定于 adapter/device 的。
1.所有这些事务类型最终都遵循 SMBus 3.0 的块线规范吗?
2。我将如何决定我需要使用哪一个?
我正在 Raspbian GNU/Linux 10 (buster)
上创建一个 Java JNA 接口
- Do all these transaction types end up following the block wire spec for SMBus 3.0?
目前我正在写答案,Linux 内核中的 I2C 模块仍然不支持 SMBus 3.0/3.1。它实现了SMBus 2.0通信。
对于这 3 种类型 - 这无法回答。我觉得不是。要了解这些命令的工作原理,请查看 KMD 源代码。例如,I2C_SMBUS_I2C_BLOCK_BROKEN 被转换为 I2C_SMBUS_I2C_BLOCK_DATA 并带有以下注释:
/* Convert old I2C block commands to the new
convention. This preserves binary compatibility. */
以及 I2C_SMBUS_I2C_BLOCK_DATA 是否遵循块数据协议 - 这取决于用户。执行协议的命令是 I2C_SMBUS_BLOCK_DATA.
- And how would I decide which one I need to use?
如果你只想使用块协议,那么就使用I2C_SMBUS_BLOCK_DATA。
如果您想要更多的控制,或者想要克服 SMBus 2.0 的限制,您将不得不使用 I2C_SMBUS_I2C_BLOCK_DATA。尽管在这些情况下,您可能不得不转向手动构建 SMBus 消息,因为 I2C_SMBUS_I2C_BLOCK_DATA 仍然使您受到很大限制 - 您将在最大消息长度中多获得一个字节,但距离 255 还很远。
如果您根据 SMBus 1 规范编写,请在适当的时候使用 I2C_SMBUS_I2C_BLOCK_BROKEN。