以byte方式讀取SPD的數據(SMBus Controller在PCH中)
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中)的更多相关文章
- 在Android中afinal框架下實現sqlite數據庫版本升級的辦法
public abstract void onUpgrade(SQLiteDatabase db,int oldVersion,int new Version) 這個方法在實現時需要重寫. pub ...
- ionic 向後台請求json 數據 在頁面上的顯示問題
我向服務器請求數據,獲取到的數據竟然不能顯示在頁面上 我那個氣啊..... <ul> <!-- <li ng-repeat="phone in phones&quo ...
- Grafana展示報表數據的配置(二)
一.Grafana以圖表的形式展示KPI報表的結果數據1.按照日期顯示數據達標量與未達標量2.顯示當前報表的最大值.最小值.平均值.總量3.報表結果數據的鏈接分享與頁面嵌入,用戶無需登錄直接訪問報表統 ...
- Scrapy——將數據保存到MySQL數據庫
Scrapy--將數據保存到MySQL數據庫 1. 在MySQL中創建數據庫表job_inf: 1 Create table job_inf( 2 id int(11) not null auto_i ...
- PHPExcel讀取excel數據
require_once 'PHPExcel.php'; $PHPReader = new PHPExcel_Reader_Excel2007(); $filePath = 'wjyl.xlsx'; ...
- 設定 gpio 為 讀取用途,需注意的參數
Schematic 解說 上面的 線路圖, R1 R2 只能有一個被接上, R3 R4 只能有一個被接上, 是使用 gpio 讀取 電壓 判斷為0 或是 1 這時的 gpio 設定,其中一個參數需設為 ...
- C#、VSTO讀取Excel類
之前寫的類存在Excel進程不能結束的Bug,重寫ExcelReader類,類實例清理時Excel進程自動結束. class ExcelReader { // Excel Object public ...
- Android Training精要(五)讀取Bitmap對象實際的尺寸和類型
讀取Bitmap對象實際的尺寸和類型 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecode ...
- 【转载】ASP.NET以Post方式抓取远程网页内容类似爬虫功能
使用HttpWebRequest等Http相关类,可以在应用程序中或者网站中模拟浏览器发送Post请求,在请求带入相应的Post参数值,而后请求回远程网页信息.实现这一功能也很简单,主要是依靠Http ...
随机推荐
- Java:使用 Java 开发的一个异常处理框架
背景 这篇文章介绍的异常处理思路不错,本文试图给出一种具体实现,当然可能和作者的思路有所不同. 框架地址:https://github.com/happyframework/HappyFramewor ...
- Appium+python自动化15-在Mac上环境搭建
前言 mac上搭建appium+python的环境还是有点复杂的,需要准备的软件 1.nodejs 2.npm 3.cnpm 4.appium 5.pip 6.Appium-Python-Client ...
- 第八章openwrt 703N使用HUB(集线器)插U盘等设备
在这里就要吐槽一下了,在网上一搜索竟然没有一篇详细的关于703N使用hub后挂载u盘的文章,想了很久问了别人还弄了一天晚上终于弄好了.好吧下面开始言归正传: 1.其实一般质量可以的集线器例如SSK这类 ...
- [android] Activity 的生命周期 以及横屏竖屏切换时 Activity 的状态变化
生命周期Android 系统在Activity 生命周期中加入一些钩子,我们可以在这些系统预留的钩子中做一些事情.例举了 7 个常用的钩子:protected void onCreate(Bundle ...
- Spring3.0.5jar包用法详解 [转载]
Spring3.X以后jar包进行了重构,取消了原来2.X版本中的总的spring.jar包,而是把总包中的功能全部分开打包.正在向osgi靠拢. 各个jar包详解如下: 1. org.springf ...
- OpenShift负载分区策略(Router Shading)
在很多场景下,单靠几个在Infra节点上的Router进行服务请求的转发是不够的,项目中很多时候都有流量隔离的需求,主要场景在于: 一个集群中的不同的环境的流量隔离需求,比如开发走几个Router,生 ...
- 对 getaddrinfo Android 返回错误 EAI_BADFLAGS
我们尝试使用 getaddrinfo 对 Android API 14 及以上 (在 c + + 代码使用 NDK r12) 从 IPV4 获得合成的 IPV6 地址 address .这是在 IPV ...
- idea maven 报-source 1.5 中不支持 diamond 运算符
需要修改 project setting 中的
- Python MongoDB Spatial Query
//引入Pymongo >>> from pymongo import MongoClient,GEO2D // 链接数据库gis >>> db = MongoCl ...
- iOS7 UIKit动力学-重力特性UIGravityBehavior
续文 在iOS7中事实上新加了非常多新的特性.之前看过,也了解过一些新的内容.如新的动力学特性,TextKit的图文混排,还有自己定义的动画跳转等.那段时间也比較忙,没时间整理.如今项目也弄完了,打算 ...