/******************************/
// SharkSir
// copyleft
//
// SMBus Spec
// 在 下载
// Intel ICH9/ICH8/ICH7...DataSheet 关于 SMBus Control的变化不是太大
// 在 下载:)
// Winio lib
// 在 下载
//
// PCI 的config端口 0xCF8
// PCI 的data 端口 0xCFC
//
// 打开自己的设备管理器-->系统设备-->SMBus control->资源
// 输入输出范围的首地址即为SMBUS的基地址
// 在机器上调试的时候
// 直接看就行了 不用再麻烦去在PCI中读取
// 需要修改 Smbus 的宏定义 0x1c00是我机器上的Smbus基值
#include "winio.h"
#inlcude "stdio.h"
#inlcude "stdlib.h"
/*****************************
SMBus Control
*****************************/
#define PCI_BASE 0x80000000
#define SMBUS_BASE 0x80000000 0*0x10000 31*0x100*8 3*0x100 0*0x4
#define Smbase 0x1c00
#define rStatu 0x0
#define rControl 0x2
#define rCommand 0x3
#define rSlaveAddr 0x4
#define rData0 0x5
#define rData1 0x6
void delay(int i)
{
while(i)
{
i--;
}
}
unsigned long readSpd(int dev_num)
{
/*==============================================*/
// 使能SMBus Host controller.
SetPortVal(0xcf8,SMBUS_BASE 0x40,4);
SetPortVal(0xcfc,0x1,4);
/*==============================================*/
// 重置寄存器状态.
SetPortVal(Smbase rStatu,0x42,2);
/*==============================================*/
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 一定要注意这一步 读和写的区别
// 否则你的内存变成白痴
// 装作不认识你了.
// 你的BIOS也认不出它来了
// 本人曾一不小心写错了参数 直接改了内存类型
// 内存报废
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// 0xA1 = 0xA0 1 (read)
// bit 0 read==1 write==0
SetPortVal(Smbase rSlaveAddr,0xa1,1);
/*==============================================*/
// 写入要读取的从设备内部的寄存器
SetPortVal(Smbase rCommand,dev_num,1);
/*==============================================*/
// 发送命令并执行
SetPortVal(Smbase rControl,0x48,1);
delay(120);
/*==============================================*/
// 读取数据.
while(1)
{
GetPortVal(Smbase rStatu,&dwPortVal,1);
break;
}
GetPortVal(Smbase rData0,&dwPortVal,1);
return dwPortVal;
}
阅读(5610) | 评论(0) | 转发(0) |