Как прочитать байт данных обнаружения серийного присутствия (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 после.