Linux SMBus块事务类型

Linux SMBus块事务类型,linux,raspberry-pi,i2c,ioctl,smbus,Linux,Raspberry Pi,I2c,Ioctl,Smbus,最新的SMBus规范仅显示一种类型的块写入/读取(不包括块进程调用): 但是,从Linux用户空间界面来看,有3种块事务类型可用于ioctlI2C_SMBUSfrom: #定义I2C_SMBUS_块_数据5 #定义I2C\u SMBUS\u I2C\u块\u 6 #定义I2C_SMBUS_I2C_块_数据8 遵循其下的代码将委托给i2c_算法中的smbus_xfer/master_xfer(如果是仿真的话),这是特定于适配器/设备的 1。是否所有这些事务类型最终都遵循SMBus 3.0的blo

最新的SMBus规范仅显示一种类型的块写入/读取(不包括块进程调用):

但是,从Linux用户空间界面来看,有3种块事务类型可用于ioctl
I2C_SMBUS
from:

#定义I2C_SMBUS_块_数据5
#定义I2C\u SMBUS\u I2C\u块\u 6
#定义I2C_SMBUS_I2C_块_数据8
遵循其下的代码将委托给
i2c_算法
中的
smbus_xfer
/
master_xfer
(如果是仿真的话),这是特定于适配器/设备的

1。是否所有这些事务类型最终都遵循SMBus 3.0的block wire规范?
2。我如何决定我需要使用哪一个?

我正在Raspbian GNU/Linux 10(buster)上创建Java JNA接口

  • 是否所有这些事务类型最终都遵循SMBus 3.0的block wire规范
  • 目前我正在写答案,Linux内核中的I2C模块仍然不支持SMBus 3.0/3.1。它实现了SMBus 2.0通信

    对于这三种类型,这是无法回答的。我想不会。要了解这些命令是如何工作的,请查看KMD源代码。例如,I2C_SMBUS_I2C_BLOCK_Breaked被转换为I2C_SMBUS_I2C_BLOCK_数据,并带有以下注释:

            /* Convert old I2C block commands to the new
           convention. This preserves binary compatibility. */
    
    I2C_SMBUS_I2C_BLOCK_数据是否遵循块数据协议——这取决于用户。执行协议的命令是I2C_SMBUS_BLOCK_数据

  • 我如何决定我需要使用哪一个
  • 如果您只想使用块协议,那么只需使用I2C\U SMBUS\U块数据

    如果您想要更多的控制,或者想要克服SMBus 2.0的限制,您必须使用I2C\U SMBus\U I2C\U BLOCK\U数据。虽然在这些情况下,您可能必须手动构建SMBus消息,因为I2C_SMBus_I2C_BLOCK_数据仍然会使您受到很大限制-您将在最大消息长度中多获得一个字节,但距离255还很远


    如果您是根据SMBus 1规范编写的,请在适当的时候使用I2C_SMBus_I2C_BLOCK_breaked.

    I2C_FUNC
    ioctl returned
    I2C_FUNC_SMBus_WRITE_BLOCK_DATA,I2C_FUNC_SMBus_READ_I2C_BLOCK,I2C_FUNC_SMBus_WRITE_I2C_BLOCK
    ,所以我想我只有一个选择块读取。不过有两种写作选择。
            /* Convert old I2C block commands to the new
           convention. This preserves binary compatibility. */