阅读:8267回复:44
SMBus 的base address的问题
我读取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] |
|
最新喜欢:philom... |
沙发#
发布于:2004-06-28 13:19
明白了,想知道的问我
|
|
板凳#
发布于:2004-08-06 10:25
怎么回事? :D
|
|
地板#
发布于: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. |
|
地下室#
发布于:2004-08-09 12:37
thanks,boly xd.
|
|
5楼#
发布于:2004-08-17 16:23
请问一下SmBus Controler中的Register需要如何操作来同Slave设备交互。即它的哪一个Register的相应Bit对应的是IIC的SCL(Clock)和SDA(Data).
[编辑 - 8/17/04 by bingjie] |
|
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 |
|
7楼#
发布于:2004-08-17 17:01
谢谢,那能说说各个Register的详细用法吗,比如在HST_CNT中的哪一个bit是用来表示R/W的,以及若要传输多个Byte,又该如何操作,是不是类似于一个序列:Start Address Data Data ....
或者请告知那里可以查到关于SmBus Controler的资料也可。如需分我可另开贴谢你。 |
|
8楼#
发布于:2004-08-17 17:06
你可以到intel网站上下载82801的datasheet看看
|
|
|
9楼#
发布于:2004-08-17 17:18
开了一个帖子以感谢你,请跟帖,谢谢。
|
|
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 ); |
|
11楼#
发布于:2004-08-26 18:42
附件是 SMBus1.0,1.1 specification,UDID是2.0才有,
我写代码用的是汇编,所以你的看起来不太习惯,如果看出来问题我会告诉你 |
|
|
12楼#
发布于:2004-08-26 18:45
SMBus1.0
|
|
|
13楼#
发布于:2004-08-27 09:16
谢谢,我写的是一个应用程序,所以没有用汇编。
|
|
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体现在了什么地方? 刚刚接触些基本知识,有很多不懂的地方,还望各位高手指导! 谢谢! |
|
15楼#
发布于:2005-05-24 08:36
晕了,去年的贴都翻出来了。。。。
关于这个程序想问以下几点: 说不清楚,不说了。你看个pci2.0spec先。。。有中文的 |
|
16楼#
发布于:2005-05-24 10:02
能共享一下吗?
谢谢! |
|
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 访问到? 谢谢! |
|
18楼#
发布于:2005-05-24 11:36
原来你还是没有看上面两个人的讨论和smbus的spec所。
你这些问题上面那个pdf里面都有讲哈, 先看完书嘛,莫急 |
|
19楼#
发布于:2005-05-24 14:13
sharpor:
不是我不想看,而是目前项目真的很急,我要尽快上手,不能拖住整个项目的进度。你懂的话能不能先指点我一下呢?不胜感激!后面我会把该补的东西补上去的! 谢谢! |
|
上一页
下一页