boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
阅读:8267回复:44

SMBus 的base address的问题

楼主#
更多 发布于:2004-06-28 12:15
我读取SMBus 的 PCI配置寄存器得到他的io base address是500h,但是对500h好像访问不了,不管我写进什么读出来都是0ffffh,请高手看看我的代码有什么问题

mov eax, 8000fb20h    ;base address
                                             ;寄存器地址
mov edx, 0cf8h
out dx, eax
jcxz $+2
jcxz $+2
mov edx, 0cfch
in eax, dx            ;eax == 5001h

          shr eax,5           ;5~15位为ICH4 的SMB base io
          mov dx, ax
          in ax,dx                           ;ax == 0ffffh


[编辑 -  6/28/04 by  boly81]

[编辑 -  6/28/04 by  boly81]

最新喜欢:

philomanphilom...
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-28 13:19
明白了,想知道的问我
jasonell
驱动牛犊
驱动牛犊
  • 注册日期2004-08-05
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-06 10:25
怎么回事? :D
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-06 10:41
shr eax,5 ;5~15位为ICH4 的SMB base io
这句错了,改为
          or ax, 1
xor ax, 1


15:5 Base Address ― R/W. Provides the 32-byte system I/O base address for the ICH4 SMB logic.

4:1 Reserved ― RO

0 I/O Space Indicator ― RO. This read-only bit is always1, ndicating that the SMB logic is I/O
mapped.
jasonell
驱动牛犊
驱动牛犊
  • 注册日期2004-08-05
  • 最后登录2004-08-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-09 12:37
thanks,boly xd.
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-17 16:23
请问一下SmBus Controler中的Register需要如何操作来同Slave设备交互。即它的哪一个Register的相应Bit对应的是IIC的SCL(Clock)和SDA(Data).

[编辑 -  8/17/04 by  bingjie]
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-17 16:44
没有哪个寄存器与SCL(Clock)和SDA(Data)对应
smbus的各寄存器存放的都是要发到i2c上的数据,比如XMIT_SLVA寄存器存放的是i2c总线上要传递的slave address,HST_CNT用来发R/W和start命令的
Offset Mnemonic Register Name/Function Default Access
00h HST_STS Host Status 00h R/W
02h HST_CNT Host Control 00h R/W
03h HST_CMD Host Command 00h R/W
04h XMIT_SLVA Transmit Slave Address 00h R/W
05h HST_D0 Host Data 0 00h R/W
06h HST_D1 Host Data 1 00h R/W
07h BLOCK_DB Block Data Byte 00h R/W
08h ― Reserved 00h RO
09h RCV_SLVA Receive Slave Address 44h R/W
0Ah SLV_DATA Slave Data 0000h R/W
0Bh
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-17 17:01
    谢谢,那能说说各个Register的详细用法吗,比如在HST_CNT中的哪一个bit是用来表示R/W的,以及若要传输多个Byte,又该如何操作,是不是类似于一个序列:Start Address Data Data ....
    或者请告知那里可以查到关于SmBus Controler的资料也可。如需分我可另开贴谢你。
    
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-17 17:06
你可以到intel网站上下载82801的datasheet看看
附件名称/大小 下载次数 最后更新
2004-08-17_smbus.pdf (79KB)  80
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-17 17:18
开了一个帖子以感谢你,请跟帖,谢谢。
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-26 10:00
不好意思,又来打扰你了,这几天调试SmBus很不顺利,我写了一个小程序来枚举本机所有连接SmBus的设备,方法是依次对所有SlaveAddress发送QUIK_WRITE给对方,如果成功则认为该设备存在。利用这方法读取找到了一些设备,但是就是无法获取他们的UDID,另外也无法获取数据,对方总是返回DEV_ERR。不知道问题出在什么地方,如果你有时间,请帮我看看下面的代码。另外我还想问一下Smbus1.0规范你有没,Smbus的官方网站我现在上不去了。不知道Smbus1.0的设备是否有UDID
I_8( &pRegOffset->HST_STS, &Value );
O_8( &pRegOffset->HST_STS, Value );
I_8( &pRegOffset->HST_STS, &Value );
if( Value &  HOST_BUSY )
{
pSmbRequest->Status = SMB_BUS_BUSY;
return FALSE;
}

Value = 0x3;
O_8( &pRegOffset->AUX_CTL, Value );
switch( pSmbRequest->Protocol )
{
case SMB_WRITE_QUICK :
Address = (UCHAR)( pSmbRequest->Address & 0xFE );
O_8( &pRegOffset->XMIT_SLVA, Address );
Value = ( UCHAR )( CMD_QUICK | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_READ_QUICK  :
Address = (UCHAR)( pSmbRequest->Address | 0x1 );
O_8( &pRegOffset->XMIT_SLVA, Address );
Value = ( UCHAR )( CMD_QUICK | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_RECEIVE_BYTE:
Address = (UCHAR)( pSmbRequest->Address | 0x1 );
O_8( &pRegOffset->XMIT_SLVA, Address );

Value = ( UCHAR )( CMD_BYTE | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_SEND_BYTE   :
Address = (UCHAR)( pSmbRequest->Address & 0xFE );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Data[ 0 ];
O_8( &pRegOffset->HST_CMD, Command );

Value = ( UCHAR )( CMD_BYTE | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_WRITE_BYTE  :
Address = (UCHAR)( pSmbRequest->Address & 0xFE );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

Value = pSmbRequest->Data[ 0 ];
O_8( &pRegOffset->HST_D0, Value );

Value = ( UCHAR )( CMD_BDATA | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_READ_BYTE   :
Address = (UCHAR)( pSmbRequest->Address | 0x1 );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

Value = ( UCHAR )( CMD_BDATA | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_WRITE_WORD  :
case SMB_PROCESS_CALL:
Address = (UCHAR)( pSmbRequest->Address & 0xFE );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

O_8( &pRegOffset->HST_D0, pSmbRequest->Data[ 0 ] );
O_8( &pRegOffset->HST_D1, pSmbRequest->Data[ 1 ] );

if( pSmbRequest->Protocol == SMB_WRITE_WORD )
Value = ( UCHAR )( CMD_WORD | CNT_START );
else
Value = ( UCHAR )( CMD_PROCESS | CNT_START );

O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_READ_WORD   :
Address = (UCHAR)( pSmbRequest->Address | 0x1 );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

Value = ( UCHAR )( CMD_WORD | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );
break;
case SMB_WRITE_BLOCK :
Address = (UCHAR)( pSmbRequest->Address & 0xFE );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

Value = pSmbRequest->BlockLength;
O_8( &pRegOffset->HST_D0, Value );

Value = 0x3;
O_8( &pRegOffset->AUX_CTL, Value );

for( i = 0; i < pSmbRequest->BlockLength; i++ )
{
O_8( &pRegOffset->HST_BLOCK_DB, pSmbRequest->Data[ i ] );
}

I_8( &pRegOffset->HST_CNT, &Value );
Value |= ( UCHAR )( CMD_BLOCK | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );

break;
case SMB_READ_BLOCK  :
Address = (UCHAR)( pSmbRequest->Address | 1 );
O_8( &pRegOffset->XMIT_SLVA, Address );

Command = pSmbRequest->Command;
O_8( &pRegOffset->HST_CMD, Command );

I_8( &pRegOffset->HST_CNT, &Value );

Value |= ( UCHAR )( CMD_BLOCK | CNT_START );
O_8( &pRegOffset->HST_CNT, Value );

break;
default:
O_8( &pRegOffset->HST_STS, ( UCHAR )INUSE_STS );
pSmbRequest->Status = SMB_UNSUPPORTED_PROTOCOL;
return FALSE;
}// switch

// wait command complete
msDelay( 10 );
for( i = 0; i < 2000; i++ )
{
Value = 0;
I_8( &pRegOffset->HST_STS, &Value );
O_8( &pRegOffset->HST_STS, ( UCHAR )( Value & ~INUSE_STS ) ); // clear the interrupt
if(  Value & HOST_BUSY )
msDelay( 1 );
else
break;
}

if( i >= 2000 )
{
Value = CNT_KILL; // cancel the command
O_8( &pRegOffset->HST_CNT, Value );
pSmbRequest->Status = SMB_TIMEOUT;
return FALSE;
}

if( Value & ( BUS_ERR | DEV_ERR | STS_FAILED ) )
{
if( Value & STS_FAILED ) pSmbRequest->Status = SMB_UNKNOWN_FAILURE;
if( Value & BUS_ERR ) pSmbRequest->Status = SMB_COMMAND_ACCESS_DENIED;
if( Value & DEV_ERR ) pSmbRequest->Status = SMB_DEVICE_ERROR;
O_8( &pRegOffset->HST_STS, ( UCHAR )INUSE_STS );
return FALSE;
}
else
pSmbRequest->Status = SMB_STATUS_OK;

switch( pSmbRequest->Protocol )
{
case SMB_RECEIVE_BYTE:
I_8( &pRegOffset->HST_CMD, &Value );
pSmbRequest->Data[ 0 ] = Value;
break;
case SMB_READ_BYTE   :
I_8( &pRegOffset->HST_D0, &Value );
pSmbRequest->Data[ 0 ] = Value;
break;
case SMB_READ_WORD   :
case SMB_PROCESS_CALL:
I_8( &pRegOffset->HST_D0, &Value );
pSmbRequest->Data[ 0 ] = Value;
I_8( &pRegOffset->HST_D1, &Value );
pSmbRequest->Data[ 1 ] = Value;
break;
case SMB_READ_BLOCK  :
I_8( &pRegOffset->HST_D0, &Value );
pSmbRequest->BlockLength = Value;

for( i = 0; i < pSmbRequest->BlockLength; i++ )
{
if( i == pSmbRequest->BlockLength - 1 )
{
I_8( &pRegOffset->HST_CNT, &Value );
Value |= ( UCHAR )LAST_BYTE;
O_8( &pRegOffset->HST_CNT, Value );
}

I_8( &pRegOffset->HST_BLOCK_DB, &Value );
pSmbRequest->Data[ i ] = Value;
}
break;
default:
break;
}// switch

O_8( &pRegOffset->HST_STS, ( UCHAR )INUSE_STS );
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-26 18:42
附件是 SMBus1.0,1.1 specification,UDID是2.0才有,
我写代码用的是汇编,所以你的看起来不太习惯,如果看出来问题我会告诉你
附件名称/大小 下载次数 最后更新
2004-08-26_smbus110.pdf (159KB)  38
boly81
驱动小牛
驱动小牛
  • 注册日期2004-06-25
  • 最后登录2012-06-08
  • 粉丝0
  • 关注0
  • 积分490分
  • 威望73点
  • 贡献值0点
  • 好评度49点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-26 18:45
SMBus1.0
附件名称/大小 下载次数 最后更新
2004-08-26_smbb10.pdf (134KB)  27
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-27 09:16
谢谢,我写的是一个应用程序,所以没有用汇编。
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2005-05-23 21:00
关于这个程序想问以下几点:
 
mov eax, 8000fb20h ;base address  //这个地址怎么得来的?
;寄存器地址
mov edx, 0cf8h
out dx, eax         //为什么把地址写到端口上?
jcxz $+2
jcxz $+2
mov edx, 0cfch            
in eax, dx ;eax == 5001h  //读进的值代表什么意思?

shr eax,5 ;5~15位为ICH4 的SMB base io
mov dx, ax
in ax,dx ;ax == 0ffffh

还有就是500h体现在了什么地方?
刚刚接触些基本知识,有很多不懂的地方,还望各位高手指导!
谢谢!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2005-05-24 08:36
晕了,去年的贴都翻出来了。。。。
关于这个程序想问以下几点:
 
mov eax, 8000fb20h ;base address  //这个地址怎么得来的?
这是pci配置空间的访问方式决定的:
31:1
30-24:reversed
23-16:bus number
15-11:device number
10-8:function number
7-2:register number
;寄存器地址
mov edx, 0cf8h
out dx, eax         //为什么把地址写到端口上?
jcxz $+2
jcxz $+2
mov edx, 0cfch            
in eax, dx ;eax == 5001h  //读进的值代表什么意思?

shr eax,5 ;5~15位为ICH4 的SMB base io
mov dx, ax
in ax,dx ;ax == 0ffffh

还有就是500h体现在了什么地方?
刚刚接触些基本知识,有很多不懂的地方,还望各位高手指导!
谢谢!


说不清楚,不说了。你看个pci2.0spec先。。。有中文的
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2005-05-24 10:02
能共享一下吗?
谢谢!
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2005-05-24 10:50
假如知道smbus的base address为0x5000 ,知道想要通讯的slave device address是0x5c,想要读取slave device 上的0x24寄存器,该怎么办啊?还有,这个slave address是怎么确定的呢?会不会出现设备间的冲突?
slave address 是不是可以直接加在base address上呢?上面那个例子可不可以用in ax,505ch 访问到?

谢谢!
sharpor
驱动小牛
驱动小牛
  • 注册日期2005-04-04
  • 最后登录2007-05-10
  • 粉丝0
  • 关注0
  • 积分127分
  • 威望17点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2005-05-24 11:36
原来你还是没有看上面两个人的讨论和smbus的spec所。
你这些问题上面那个pdf里面都有讲哈,
先看完书嘛,莫急
xyz332
驱动牛犊
驱动牛犊
  • 注册日期2005-05-10
  • 最后登录2006-03-31
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2005-05-24 14:13
sharpor:
       不是我不想看,而是目前项目真的很急,我要尽快上手,不能拖住整个项目的进度。你懂的话能不能先指点我一下呢?不胜感激!后面我会把该补的东西补上去的!
  谢谢!
上一页
游客

返回顶部