PCIe 总线上的 SMBus/I2C

PCIe 总线上的 SMBus/I2C

免责声明,我远非 CentOS/Linux 专家,而且我一直很难使用 Google fu 自己找到这些。我正在开发一种产品,该产品可插入运行 CentOS 的 PC 中的 PCIe 插槽。在 PCIe 互连的侧通道上有一个 SMBus(即 I2C),用于收集重要产品数据 (VPD) 表。我正在尝试找到一种方法来测试此接口,但迄今为止失败了。我知道有一些工具可以尝试读取 VPD 和 I2C 设备,它们是:

LM-Tools (I2C),使用sudo yum install i2c-tools dmidecode 安装,使用sudo yum install dmidecode

dmidecode 中的工具有一个“vpddecode”,它没有返回任何内容,我怀疑它正在寻找内存中的某些东西,但我真的不知道。LM-Tools 有 i2cdetect,但尝试执行“sudo i2cdetect -y 0”不起作用并报告:

错误:无法打开文件 /dev/i2c-2 或 /dev/i2c/2:没有此文件或目录

如果我查看/dev,则没有包含 i2c 的项目。所以,我想我需要加载一个模块或类似的东西?

所以,我的问题是:

  1. 这些工具能与 PCIe SMBus 上的设备通信吗?
  2. 如果这些实用程序可与 PCIe SMBus 上的我的设备配合使用,我需要采取什么操作才能使它们正常工作?
  3. 如果这些实用程序无法与 PCIe SMBus 上的我的设备配合使用,那么哪些实用程序可以配合使用?

任何帮助都将不胜感激。我有谷歌,但我的谷歌搜索大多会提供 LM 模块的信息来读取温度和类似的项目,即使我尝试过滤它们。

谢谢,马克

答案1

据我所知,SMBus 控制器在 Linux 下表示为 I²C 设备。(由于 SMBus 是 I²C 的子集,因此这些设备不会支持所有 I²C 命令,而只支持与 SMBus 相关的命令。)因此,/dev/i2c-X任何用户空间程序都必须将主板的 SMBus 控制器显示为设备,才能与 PCIe SMBus 设备进行通信。

为了拥有/dev/i2c-X设备,您必须加载i2c-dev模块。您可以通过modprobe i2c-dev在 shell 上执行或向文件中添加仅包含模块名称的行来手动执行此操作/etc/modules。后者将在每次系统启动时自动加载模块。

此外,您需要在主板上加载特定 SMBus 控制器的驱动程序(如果它没有自动加载)。我不知道您使用的是哪种主板(芯片组)。大多数 Intel 芯片组的 SMBus 控制器都受i2c-i801Linux 内核模块支持。

如果您已加载两个模块,则系统应该有一个或多个 I²C 总线可用。对于每条总线,都有一个/dev/i2c-X设备和一个/sys/bus/i2c/devices/同名条目。

为了缩小哪个总线属于您的 PCIe 设备,您可以尝试:

$ grep . /sys/bus/i2c/devices/i2c-*/name

这将为您提供所有总线的列表并打印每条总线的驱动程序名称。由于您已安装 i2c-tools,因此您也可以使用它i2cdetect -l来获取类似的列表。

编辑:似乎有一个与 ACPI 相关的i2c-i801某些主板上的 Intel C220 芯片组问题导致 SMBus 模块无法使用。

答案2

在命令行中传递 acpi_enforce_resources=lax 将解决 ACPI 资源冲突。

i2c /dev 条目驱动程序
ACPI 警告:SystemIO 范围 0x0000000000003000-0x000000000000301F 与 OpRegion 0x000000000003000-0x00000000000300F (_SB_.PCI0.SBUS.SMBI) 冲突 (20150930/utaddress-254)
ACPI:此冲突可能会导致随机问题和系统不稳定
ACPI:如果此设备有可用的 ACPI 驱动程序,则应使用它而不是本机驱动程序 i801_smbus 0000:00:1f.3:使用 PCI 中断的 SMBus

检查本机驱动程序和 ACPI OperationRegions 之间的资源干扰(仅限 SystemIO 和系统内存)。ACPI 中声明的 IO 端口和内存可能会被 ACPI 子系统在任意 AML 代码中使用,并且可能会干扰旧式驱动程序。acpi_enforce_resources= 可以设置为:

  • 严格(默认)(2)-> 尝试访问资源的后续驱动程序将不会加载
  • lax (1) -> 尝试访问资源的进一步驱动程序将会加载,但是您会收到一条系统消息,提示可能出现问题...

  • 否 (0) -> ACPI 操作区域资源将不会被注册

相关内容