Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15356
  • 博文数量: 4
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 50
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-02 10:13
文章分类

全部博文(4)

文章存档

2011年(4)

我的朋友

分类: C/C++

2011-05-06 00:36:16

/******************************/
//  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)
{

unsigned int    dwPortVal;

/*==============================================*/
// 使能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);
 
             if (dwPortVal == 0x42)
             break;
     }
             GetPortVal(Smbase rData0,&dwPortVal,1);
  return dwPortVal;
}

阅读(5610) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:c学习

给主人留下些什么吧!~~