为了将代码移植到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;
}
注意,以上是伪代码,这个问题与语言无关。
我的代码有两个问题。
0xB20
的第7位。 docs状态位5:7被保留。我读错了文档吗?有人知道这意味着什么吗?0xED
,对此我找不到任何文档。呼叫总是返回0xFF
,但该地址在我的系统上似乎无效。关于问题2,我在chromium-os mailing list上发现了对该端口的模糊引用,该引用用于防止IO延迟写入端口0x80。 0xED是任何保留地址吗?