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

How to read a byte of the Serial Presence Detect (SPD) data from the DIMM after 255(FF) bytes?

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

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

但主机命令寄存器 (HCMD)—偏移量 3h 的大小为:8 位 (255/FF),

那么如何读取 255 字节之后的内容?

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

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

我需要读取字节 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); 主机状态寄存器 return 0x44,设备错误 (DERR)。

正在尝试读取 DDR4 SPD? 它们有 2 页,每页 256 字节,您需要虚拟写入一个特殊的预定义地址 0x6E 以将所有 SPD 芯片切换到第 1 页(您的字节 320 所在的位置),然后写入 0x6C 将它们切换回第 0 页(以防止在下次引导期间出现 SPD 读取失败)。 阅读第 12 页的 this datasheet 了解更多信息。

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