Спецификация AMD X470 SMBus
Я перепроектировал драйвер Windows SMBus, чтобы перенести код в систему Linux. Для взаимодействия с SMBus в коде используются жестко закодированные адреса портов на основе системного чипсета. В моем случае я использую AMD X470 с базовым адресом 0xB20.
Каждая транзакция 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, который использует его для предотвращения задержки ввода-вывода при записи на порт 0x80. Является ли 0xED зарезервированным адресом любого вида?