Reading A Byte of SMBus EEPROM Data
The following steps have to be followed for the System BIOS to read a byte of the Serial Presence Detect (SPD) data from the DIMM.
1.Program the SMBus Base Address Register, D31:F3:20h.
2.Set the I/O Space enable bit, D31:F3:04h[0].
3.Set the HST_EN bit, D31:F3:40h[0].
4.Clear the status bits by programming SMBBASE 00h to 1Eh.
5.Program the SMBus Transmit Slave Address Register with the DIMM SMBus address, SMBBASE 04h. For example: If the DIMM address is A2h and a byte is to be read from the DIMM, program SMBBASE 04h to A3h (A2h OR’ed with 1 (Read/Write bit)).
6.Program the SMBus Host Command Register with the DIMM’s SPD data offset to be read, SMBBASE 03h. For example: If reading from offset 04h in the DIMM’s SPD, this register will have a value of 04h (Offset of SPD data to be read).
7.Program the SMBus Host Control Register, SMBBASE 02h[7:0] to 48h.
8.Wait on the Host Busy (HOST_BUSY) bit to be clear in the Host Status Register, SMBBASE 00h[0]. The System BIOS should use the INTR bit, SMBBASE 00h[1] and the other error indicator bits in the SMBus Host Status Register to indicate the end of the operation before reading the SMBus data register.
9.After the HOST_BUSY bit is clear, check the DEV_ERR bit in the Host Status Register, SMBBASE 00h[2] = 0, if the HOST_BUSY bit is clear and the DEV_ERR bit is clear the BIOS can read the byte value from the SMBus Data 0 Register, SMBBASE 05h.
Step #1 to Step #3 will be programmed only once. The BIOS can follow Step #4 through Step#9 multiple times to get all the necessary EEPROM data from the SMBus devices.

源码(WIN-TC编译通过):

#include

#include

unsigned SearchBAR(unsigned long address_s)

{

unsigned long int val;

asm mov dx,0xcf8

asm db 0x66

asm mov ax,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;

}

void WriteFlags(unsigned long pci_addr,unsigned data)

{

asm mov dx,0xcf8

asm db 0x66

asm mov ax,pci_addr

asm db 0x66

asm out dx,ax

asm mov dx,0xcfc

asm mov al,data

asm out dx,al

}

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();

}

val=inportb(SMBase_addr 0x05);

return val;

}

void main()

{

unsigned long pci_addr,SMBase_addr,bus,dev,func,offset;

unsigned i,data;

bus=0x00;

dev=0x1f;

func=0x03;

pci_addr=) (dev<<) (func<<);

WriteFlags(pci_addr 0x04,0x03);

WriteFlags(pci_addr 0x40,0x11);

SMBase_addr=SearchBAR(pci_addr 0x20)&0xffe0;

printf("PCI Address:%x",pci_addr>>);

printf("%x\n",pci_addr);

printf("use IO :%x\n",SMBase_addr);

printf("Read Byte:\n");

for(i=;i<</SPAN>;i ){

data=ReadByte(SMBase_addr,i);

printf("%4x",data);

if(i%==)

printf("\n");

}

getchar();

}

转载:http://blog.sina.com.cn/s/blog_870045320102v60u.html

以byte方式讀取SPD的數據(SMBus Controller在PCH中)的更多相关文章

  1. 在Android中afinal框架下實現sqlite數據庫版本升級的辦法

    public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫.   pub ...

  2. ionic 向後台請求json 數據 在頁面上的顯示問題

    我向服務器請求數據,獲取到的數據竟然不能顯示在頁面上  我那個氣啊..... <ul> <!-- <li ng-repeat="phone in phones&quo ...

  3. Grafana展示報表數據的配置(二)

    一.Grafana以圖表的形式展示KPI報表的結果數據1.按照日期顯示數據達標量與未達標量2.顯示當前報表的最大值.最小值.平均值.總量3.報表結果數據的鏈接分享與頁面嵌入,用戶無需登錄直接訪問報表統 ...

  4. Scrapy——將數據保存到MySQL數據庫

    Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...

  5. PHPExcel讀取excel數據

    require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...

  6. 設定 gpio 為 讀取用途,需注意的參數

    Schematic 解說 上面的 線路圖, R1 R2 只能有一個被接上, R3 R4 只能有一個被接上, 是使用 gpio 讀取 電壓 判斷為0 或是 1 這時的 gpio 設定,其中一個參數需設為 ...

  7. C#、VSTO讀取Excel類

    之前寫的類存在Excel進程不能結束的Bug,重寫ExcelReader類,類實例清理時Excel進程自動結束. class ExcelReader { // Excel Object public ...

  8. Android Training精要(五)讀取Bitmap對象實際的尺寸和類型

    讀取Bitmap對象實際的尺寸和類型 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecode ...

  9. 【转载】ASP.NET以Post方式抓取远程网页内容类似爬虫功能

    使用HttpWebRequest等Http相关类,可以在应用程序中或者网站中模拟浏览器发送Post请求,在请求带入相应的Post参数值,而后请求回远程网页信息.实现这一功能也很简单,主要是依靠Http ...

随机推荐

  1. mysql TO_DAYS()函数

    TO_DAYS(date)给定一个日期date, 返回一个天数 (从年份0开始的天数 ).   例: select TO_DAYS(NOW()); +----------------+ | TO_DA ...

  2. 关于TagHelper的那些事情——自定义TagHelper(格式化输出、依赖注入使用)

    自定义TagHelper的最后一步就是在Process方法或ProcessAsync方法中添加展现代码.熟悉WebControl开发的朋友都知道Render方法,在这个方法中会添加展现的Html元素和 ...

  3. Linux下C获取所有可用网卡信息

    在Linux下开发网络程序时,经常会遇到需要取本地网络接口名.IP.广播地址.子网掩码或者MAC地址等信息的需求,最常见的办法是配合宏SIOCGIFHWADDR.SIOCGIFADDR.SIOCGIF ...

  4. 第三章 consul服务注册与服务查询

    1.定义一个服务 https://www.consul.io/docs/agent/services.html 该方法是服务注册中提供服务的最常用的方法. 关于服务的定义:服务的属性我们会在后边每出现 ...

  5. go语言基础之全局变量

    1.全局变量 示例: package main import "fmt" func test() { fmt.Println("test a =", a) } ...

  6. 如何在Django1.6结合Python3.4版本中使用MySql

    唉,最近赶了个新潮,用起了Python3.4跟Django1.6,数据库依然是互联网企业常见的MySql. 悲催的是在Python2.7时代连接MySql的MySQLdb还不支持Python3.4,还 ...

  7. VS中的代码拖放

    平时数据操作中,我们经常在选择文件,由于数据太多.数据目录太深,选择数据文件到TextBox中非常不方便,于是就想让控件支持拖放数据,很多软件都支持这个功能,非常实用. 在ArcGIS10.x开发平台 ...

  8. STL - C++ 11的Lambda表达式(上)

    Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式. 你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式). eg: std:transf ...

  9. Adobe Audition3.0 找不到所支持的音频设备 请检查您的音频设置

      Adobe Audition 找不到所支持的音频设备 请检查您的音频设置   解决方案:   运行regedit,打开注册表编辑器,定位到 HKEY_CLASSES_ROOT\CLSID\{AB7 ...

  10. JUnit单元测试基础要点

    JUnit单元测试基础要点 1.JUnit是一种测试代码的框架,测试的目的是:保证代码没错,而不是保证代码正确. 2.测试类一般不要和目标类放在一起,但编译成的class文件是放在一起的. 3.单元测 ...