AMD X470 SMBus规格

时间:2018-09-24 20:40:53

标签: hardware amd 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. 正在测试状态寄存器0xB20的第7位。 docs状态位5:7被保留。我读错了文档吗?有人知道这意味着什么吗?
  2. 该循环读取一个硬编码端口0xED,对此我找不到任何文档。呼叫总是返回0xFF,但该地址在我的系统上似乎无效。

关于问题2,我在chromium-os mailing list上发现了对该端口的模糊引用,该引用用于防止IO延迟写入端口0x80。 0xED是任何保留地址吗?

0 个答案:

没有答案