如何在255(FF)字节后从DIMM读取串行存在检测(SPD)数据的字节?

时间:2016-02-29 07:38:53

标签: bios pci chipset

我有SMBus基地址寄存器, 并使用DIMM SMBus地址SMBBASE 04h对SMBus发送从地址寄存器进行编程。

然后使用要读取的DIMM的SPD数据偏移对SMBus主机命令寄存器进行编程,SMBBASE 03h。

但是主机命令寄存器(HCMD)-Offset 3h是大小:8位(255 / FF),

那么如何读取255个字节后的数据?

例如: DDR4串行存在检测(SPD)表:

字节320:模块制造商ID代码

我需要阅读Byte 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 个答案:

答案 0 :(得分:0)

试图读取DDR4 SPD? 它们有2页,每页256字节,你需要一个虚拟写入一个特殊的预定义地址0x6E来将所有SPD芯片切换到第1页(你的字节320所在的位置),然后写入0x6C将它们切换回第0页(防止下次启动时SPD读取失败)。 有关详情,请参阅第12页的this datasheet

答案 1 :(得分:0)

至少在Linux PC中, 您需要先写SMBus地址0x37才能到达第1页。(让我们向SMbus addr 32写0) 比所有DDR4 RAM SPD切换到第1页。 只需使用常规函数进行编写和阅读所需地址。 然后通过写入SMBus地址0x36切换到第0页。