首页 > 解决方案 > AMD X470 SMBus 规范

问题描述

为了将代码移植到 Linux 系统,我对 Windows SMBus 驱动程序进行了逆向工程。为了与 SMBus 交互,代码使用基于系统芯片组的硬编码端口地址。就我而言,我使用的是基地址为 0xB20 的 AMD X470。

每个 SMBus 事务都会通过调用以下函数来终止:

BOOL f_10CB0 (BYTE arg1) {
    BYTE val;

    for (int i = 0; i < 0x8000; ++i) {
        val = ReadPort(this->wPort);

        // Break on any error (bits 1:4) or bit 7 (bit 7 is reserved???)
        if (val & 0x9E)
            break;

        // Why is this port being read?
        ReadPort(0xED);
    }

    if ((val & 0x82) == 0) // 0x80 == unknown, 0x02 == Bus Interrupt
        return (val & 0x1C) == 0; // 0x04 (DeviceError) | 0x08 (BusCollision) | 0x10 (Killed)

    ReadPort(this->wPort);
    return FALSE;
}

请注意,以上是伪代码,这个问题与语言无关。

我的代码有两个问题。

  1. 它正在测试状态寄存器的第 7 位0xB20文档状态位 5 : 7 被保留。我在阅读错误的文档吗?有人知道这个位是什么意思吗?
  2. 0xED该循环读取我找不到任何文档的硬编码端口。调用总是返回0xFF,但地址在我的系统上似乎无效。

关于问题 2,我在chromium-os 邮件列表中发现了一个对端口的模糊引用,它使用它来防止 IO 延迟写入端口 0x80。0xED 是任何类型的保留地址吗?

标签: hardwareamdsmbus

解决方案


推荐阅读