我得到了SMBus基本地址寄存器,并用DIMM SMBus地址SMBBASE 04h编写了SMBus传输从地址寄存器。
然后编程SMBus主机命令寄存器与DIMM的SPD数据偏移被读取,SMBBASE 03h。
但是主机命令寄存器(-Offset) 3h的大小是:8位(255/FF),
那么我如何读取后255个字节呢?
例如: DDR4串行存在检测表:
字节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);主机状态寄存器返回0x44,设备错误(DERR)。
发布于 2016-03-04 18:45:01
试着读DDR4 SPD?它们每个有2页256字节,您需要对一个特殊的预定义地址0x6E进行虚拟写入,以便将所有SPD芯片切换到第1页(您的字节320所在的位置),而不是将其写入0x6C,将它们切换回页0(以防止下一次引导期间SPD读取失败)。有关更多信息,请阅读这个数据表第12页。
发布于 2017-11-22 01:26:33
至少在Linux中,您需要首先编写SMBus地址0x37才能到达第1页。(允许将0写入SMbus addr 32),而不是所有DDR4 RAM SPD切换到第1页。只需使用常规函数编写和读取所需地址。之后通过写入SMBus地址0x36切换到页0。
https://stackoverflow.com/questions/35694195
复制相似问题