为了将代码移植到 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;
}
请注意,以上是伪代码,这个问题与语言无关。
我的代码有两个问题。
- 它正在测试状态寄存器的第 7 位
0xB20
。文档状态位 5 : 7 被保留。我在阅读错误的文档吗?有人知道这个位是什么意思吗? 0xED
该循环读取我找不到任何文档的硬编码端口。调用总是返回0xFF
,但地址在我的系统上似乎无效。
关于问题 2,我在chromium-os 邮件列表中发现了一个对端口的模糊引用,它使用它来防止 IO 延迟写入端口 0x80。0xED 是任何类型的保留地址吗?