我在一个英特尔阿波罗湖处理器的Linux系统上遇到了i2c/SMBus的问题。我试图从EEPROM中读/写,但我面临一些问题。我的EEPROM位于地址0x56,我可以用我的逻辑分析器观看总线。
当我试图通过i2ctools (i2cget)从设备中读取数据时,系统运行正常。例如,当我试图通过i2cset执行写命令时,就会出现问题。i2cset以一个错误结束(写失败)。因为我能用电子方式观看公共汽车,所以我也可以说所有的线路都保持高,公交车没有被碰过。我能够在i2c驱动程序i2c_i801中激活函数,当我执行i2cset时,我能够找到(dmesg)调试消息:
[ 765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response当使用smbus2库运行最小的I代码时,将得到以下错误消息和上面提到的调试消息:
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,msg)中
OSERROR: [Errno 6] No such device or adress给我的一个很大的提示是,我无法在地址空间形式0x50到0x57中执行写命令。我的猜测是,一些驱动程序锁定了地址空间,以防止将写命令写入到“危险”区域。
我的问题是:“有人知道这种行为吗?是否有一个解决方案,以便我可以在地址0x56上写信给我的EEPROM?或,在0x50到0x57之间的i2c入口空间是否有一个锁,我的对手是谁?”
我是一个新手,对整个驱动程序和内核世界,所以请仁慈,这是很可能我犯了一个初学者的错误。我很感激围绕我的问题所能提供的提示和建议。
发布于 2021-01-13 09:51:45
看来我找到了问题的原因。在这篇论坛文章中,描述了Intel在SMBus控制器上更改了一个配置位。
好吧,我知道发生了什么。 从8系列/C 220芯片组开始,Intel在寄存器HOSTC中为SMBus控制器引入了一种新的配置位(PCI d 31:f3地址偏移量40h): 位4 SPD写禁用- R/WO。0= SPD已启用写入。1= SPD写禁用。禁用对SMBus地址50h - 57h的写入。
配置中这种记录不清的更改解释了这些问题。
一个挑战是,要应用和启用对SPD-写入位的更改,系统需要重新启动。不幸的是,当重新启动BIOS时,BIOS会将比特更改为默认的。唯一的解决方案似乎是BIOS中的一种适应。
对我来说,这个问题已经解决了。我只是想分享这个信息,以防有人面临同样的问题。
https://stackoverflow.com/questions/65337912
复制相似问题