Спецификация 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;
}

Обратите внимание, что приведенный выше псевдокод, и этот вопрос не зависит от языка.

У меня две проблемы с кодом.

  1. Тестирует бит 7 регистра статуса 0xB20, Биты состояния документов 5:7 зарезервированы. Я читаю не те документы? Кто-нибудь знает, что означает этот бит?
  2. Цикл читает жестко закодированный порт 0xED для которого я не могу найти какую-либо документацию. Звонок всегда возвращается 0xFF но адрес не является действительным в моей системе.

Что касается проблемы 2, я нашел неясную ссылку на порт в списке рассылки chromium-os, который использует его для предотвращения задержки ввода-вывода при записи на порт 0x80. Является ли 0xED зарезервированным адресом любого вида?

0 ответов

Другие вопросы по тегам