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 接口
  1. 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.

  1. 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。