第一步 将HST_D0寄存器清零
第二部 确定HST_STS (SMB_BASE 00h)寄存器裡面的所有狀態位是清除的(写1清零)
第三步 往XMIT_SLVA(SMB_BASE 04h)寄存器写入SPD的slave address A0,同时将bit0置1
(假设当前内存条插在DIMMA1槽上,此时XMIT_SLVA的bit0 若置1,表示read;若置0,表示write)
第四步 往SPD的HST_CMD(SMB_BASE 03h)寄存器写入SPD的Index。当写0x00时,表示要读取SPD的00h处的数据。
第六步 往SPD的HST_CNT(SMB_BASE 02h)寄存器写入48h,表示以byte的方式读取数据,并Start( bit6置1)
其中 bit 6: START 即,开始执行指令
Bit 4-2 : SMB_CMD 010 Byte Data
011 Word Data
101 Block
111 Block Process
第七步 侦测状态位,判断HST_STS的bit0是否为0,如为1,则表示忙,继续等待。
第八步 从SPD的HST_D0(SMB_BASE 05h)寄存器读取数据
eg:訪問spd(WIN-TC编译通过)
#include
unsigned SearchBAR(unsigned long int address_s)
{
unsigned long int val;
asm mov dx,0xcf8
asm db 0x66
asm mov ax,word ptr address_s
asm db 0x66
asm out dx,ax
asm mov dx,0xcfc
asm db 0x66
asm in ax,dx
asm db 0x66
asm mov val,ax
return val;
}
unsigned char ReadByte(unsigned long int address_r)
{
unsigned char val;
outportb(addr_r,0x1e);
outportb((addr_r 4),0xa7);
outportb((addr_r 3),0x00);
outportb((addr_r 2),0x48);
return val;
}
void main()
{
unsigned long int addr_s,addr_r,i,bus,dev,func,offset;
unsigned char ch;
bus=0x00;
dev=0x1f;
func=0x03;
offset=0x20;
addr_s=(0x80000000 (bus<<16) (dev<<11) (func<<8) offset);
addr_r=SearchBAR(addr_s)&0xffe0;
printf("%x",addr_s>>16);
printf("%x\n",addr_s);
printf("use IO :%x\n",addr_r);
ch=ReadByte(addr_r);
printf("Read Byte :%x\n",ch);
getchar();
}
转载:http://blog.sina.com.cn/s/blog_870045320102v60t.html