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 中进行适配。

对我来说,这个问题已经解决了。我只是想分享这些信息,以防有人遇到同样的问题。