Как прочитать байт данных обнаружения серийного присутствия (SPD) из модуля DIMM после 255(FF) байтов?

У меня есть регистр базовых адресов SMBus, и я запрограммировал регистр адресов передачи SMBus Slave с адресом DIMM SMBus, SMBBASE 04h.

Затем запрограммируйте регистр команд хоста SMBus со смещением данных SPD модуля DIMM для чтения, SMBBASE 03h.

Но регистр команд хоста (HCMD) - смещение 3h имеет размер: 8 бит (255/FF),

Итак, как я могу прочитать после 255 байтов?

Например: таблица обнаружения серийного присутствия (SPD) DDR4:

Байт 320: Идентификационный код производителя модуля

Мне нужно прочитать Байт 320.

Мой код такой

unsigned ReadByte(unsigned SMBase_addr,unsigned i)   
{
    unsigned val;   

    outportb(SMBase_addr,0x1e);   

    outportb(SMBase_addr 0x04,0xa7);   

    outportb(SMBase_addr 0x03,i);   

    outportb(SMBase_addr 0x02,0x48);   

    while((inportb(SMBase_addr))&0x01){   
        delay(10);   
    }   

    val=inportb(SMBase_addr 0x05);   

    return val;   
} 
for(i=0;i<383;i )
{
   data=ReadByte(SMBase_addr,i);
   printf("%4x",data);   
}  

и я меняю outportb(SMBase_addr 0x03,i);

в

outportw(SMBase_addr 0x03,i); Регистр состояния хоста возвращает 0x44, ошибка устройства (DERR).

2 ответа

Решение

Пытаетесь читать DDR4 SPD? Они имеют 2 страницы по 256 байт каждая, и вам нужна фиктивная запись на специальный предопределенный адрес 0x6E, чтобы переключить все микросхемы SPD на страницу 1 (где находится ваш байт 320), а затем запись на 0x6C переключить их обратно на страницу 0 (для предотвращения сбоя чтения SPD во время следующей загрузки). Прочитайте этот лист данных на странице 12 для получения дополнительной информации.

По крайней мере, в Linux PC, вам нужно сначала написать адрес SMBus 0x37, чтобы перейти на страницу 1. (Пусть запись 0 в SMbus addr 32) Когда ВСЕ из вашего SPD DDR4 RAM переключаются на страницу 1. Просто используйте обычные функции для записи и чтения требуемых адресов, Затем перейдите на страницу 0, написав адрес SMBus 0x36 после.

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