Linux:写入 i2c/SMBus
Linux: writing to the i2c/SMBus
我在使用 Intel Apollo Lake 处理器的 Linux 系统上遇到 i2c/SMBus 问题。我正在尝试 read/write from/to 一个 EEPROM,但我遇到了一些问题。我的 EEPROM 位于地址 0x56,我可以用我的逻辑分析仪观察总线。
当我尝试通过 i2ctools (i2cget
) 从设备读取时,系统的行为符合预期。例如,当我尝试通过 i2cset
执行写命令时,我的问题就出现了。 i2cset
以错误结束(写入失败)。因为我能够以电子方式观察总线,所以我也可以说所有线路都保持高电平并且总线未被触及。我能够激活 i2c 驱动程序 i2c_i801 中的 dev_dbg()
功能,当我执行 i2cset
时,我能够找到 (dmesg) 调试留言:
[ 765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response
当 运行 我的最小 I²C Python 代码使用 smbus2 库时,我收到以下错误消息和上述调试消息:
from smbus2 import SMBus
bus = SMBus(0)
b = bus.read_byte_data(86,10) #<- This is performed
b = bus.write_byte_data(86,10,12) #<- This is not performed
bus.close()
错误:
文件“usr/local/lib/python3.8/dist-packagers/smbus2-0.4.0-py3.8.egg/smbus/smbus2.py”,第 455 行,在 write_byte_data
ioctl(self.fd, I2C_SMBUS, 味精)
OSERROR: [Errno 6] No such device or adress
对我来说一个很大的提示是我无法在地址 space 0x50 到 0x57 中执行写命令。 我的猜测是某些驱动程序锁定地址 space 以防止向该“危险”区域写入命令。
我的问题是:“有人知道这种行为吗?是否有解决方案,以便我可以在地址 0x56 写入我的 EEPROM?或周围是否有锁i2c 地址 space 从 0x50 到 0x57 我的对手是谁?
我是整个驱动程序和内核世界的新手,所以请多多关照,我很可能犯了一个初学者错误。
我将不胜感激我可以解决我的问题的提示和技巧。
看来我找到问题的原因了。在此Forumpost中描述了Intel更改了SMBus控制器的配置位。
OK, I know what's going on.
Starting with the 8-Series/C220 chipsets, Intel introduced a new
configuration bit for the SMBus controller in register HOSTC (PCI
D31:F3 Address Offset 40h):
Bit 4 SPD Write Disable - R/WO.
0 = SPD write enabled.
1 = SPD write disabled. Writes to SMBus addresses 50h - 57h are
disabled.
配置中这个错误记录的更改解释了问题。
一个挑战是,要应用和启用对 SPD 写入位的更改,系统需要重新启动。不幸的是,在重新启动 BIOS 时会将位更改回默认值。唯一的解决办法似乎是在 BIOS 中进行适配。
对我来说,这个问题已经解决了。我只是想分享这些信息,以防有人遇到同样的问题。
我在使用 Intel Apollo Lake 处理器的 Linux 系统上遇到 i2c/SMBus 问题。我正在尝试 read/write from/to 一个 EEPROM,但我遇到了一些问题。我的 EEPROM 位于地址 0x56,我可以用我的逻辑分析仪观察总线。
当我尝试通过 i2ctools (i2cget
) 从设备读取时,系统的行为符合预期。例如,当我尝试通过 i2cset
执行写命令时,我的问题就出现了。 i2cset
以错误结束(写入失败)。因为我能够以电子方式观察总线,所以我也可以说所有线路都保持高电平并且总线未被触及。我能够激活 i2c 驱动程序 i2c_i801 中的 dev_dbg()
功能,当我执行 i2cset
时,我能够找到 (dmesg) 调试留言:
[ 765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response
当 运行 我的最小 I²C Python 代码使用 smbus2 库时,我收到以下错误消息和上述调试消息:
from smbus2 import SMBus
bus = SMBus(0)
b = bus.read_byte_data(86,10) #<- This is performed
b = bus.write_byte_data(86,10,12) #<- This is not performed
bus.close()
错误: 文件“usr/local/lib/python3.8/dist-packagers/smbus2-0.4.0-py3.8.egg/smbus/smbus2.py”,第 455 行,在 write_byte_data ioctl(self.fd, I2C_SMBUS, 味精)
OSERROR: [Errno 6] No such device or adress
对我来说一个很大的提示是我无法在地址 space 0x50 到 0x57 中执行写命令。 我的猜测是某些驱动程序锁定地址 space 以防止向该“危险”区域写入命令。
我的问题是:“有人知道这种行为吗?是否有解决方案,以便我可以在地址 0x56 写入我的 EEPROM?或周围是否有锁i2c 地址 space 从 0x50 到 0x57 我的对手是谁?
我是整个驱动程序和内核世界的新手,所以请多多关照,我很可能犯了一个初学者错误。 我将不胜感激我可以解决我的问题的提示和技巧。
看来我找到问题的原因了。在此Forumpost中描述了Intel更改了SMBus控制器的配置位。
OK, I know what's going on.
Starting with the 8-Series/C220 chipsets, Intel introduced a new configuration bit for the SMBus controller in register HOSTC (PCI D31:F3 Address Offset 40h):
Bit 4 SPD Write Disable - R/WO. 0 = SPD write enabled. 1 = SPD write disabled. Writes to SMBus addresses 50h - 57h are disabled.
配置中这个错误记录的更改解释了问题。
一个挑战是,要应用和启用对 SPD 写入位的更改,系统需要重新启动。不幸的是,在重新启动 BIOS 时会将位更改回默认值。唯一的解决办法似乎是在 BIOS 中进行适配。
对我来说,这个问题已经解决了。我只是想分享这些信息,以防有人遇到同样的问题。