首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Linux:写入i2c/SMBus

Linux:写入i2c/SMBus
EN

Stack Overflow用户
提问于 2020-12-17 09:27:11
回答 1查看 1.9K关注 1票数 0

我在一个英特尔阿波罗湖处理器的Linux系统上遇到了i2c/SMBus的问题。我试图从EEPROM中读/写,但我面临一些问题。我的EEPROM位于地址0x56,我可以用我的逻辑分析器观看总线。

当我试图通过i2ctools (i2cget)从设备中读取数据时,系统运行正常。例如,当我试图通过i2cset执行写命令时,就会出现问题。i2cset以一个错误结束(写失败)。因为我能用电子方式观看公共汽车,所以我也可以说所有的线路都保持高,公交车没有被碰过。我能够在i2c驱动程序i2c_i801中激活函数,当我执行i2cset时,我能够找到(dmesg)调试消息:

代码语言:javascript
复制
[  765.095591] [2753] i2c_i801:i801_check_post:433: i801_smbus 0000:00:1f.1: No response

当使用smbus2库运行最小的I代码时,将得到以下错误消息和上面提到的调试消息:

代码语言:javascript
复制
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)中

代码语言:javascript
复制
OSERROR: [Errno 6] No such device or adress

给我的一个很大的提示是,我无法在地址空间形式0x50到0x57中执行写命令。我的猜测是,一些驱动程序锁定了地址空间,以防止将写命令写入到“危险”区域。

我的问题是:“有人知道这种行为吗?是否有一个解决方案,以便我可以在地址0x56上写信给我的EEPROM?或,在0x50到0x57之间的i2c入口空间是否有一个锁,我的对手是谁?”

我是一个新手,对整个驱动程序和内核世界,所以请仁慈,这是很可能我犯了一个初学者的错误。我很感激围绕我的问题所能提供的提示和建议。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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中的一种适应。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65337912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档