我们已经设计了一个windows系统驱动程序。为了与SMBus交互,代码使用基于系统芯片组的硬编码端口地址。在我的例子中,我使用的是基址为0xB20的amdx470。
每个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
. 这个
docs
保留状态位5:7。我是不是看错了文件?有人知道这是什么意思吗?
-
0xED
我找不到任何文件。呼叫总是返回
0xFF
关于问题2,我发现在
chromium-os mailing list
它使用它来防止IO延迟写入端口0x80。0xED是任何类型的保留地址吗?