📄 smbus.inc
字号:
I2CDeviceAbsent:
popa
stc
ret
;-------------------------------
EnterSlaveAddress:
push si
push bx
push cx
BackSlaveAddress:
lea si,AddressValue
mov cx,2
WkeySlaveAddress:
push si
lea si,SearchFlag
mov ah,ds:[si]
pop si
cmp ah,KeyPgDn
jz KeyForAnotherDevice
cmp ah,KeyPgUp
jz KeyForAnotherDevice
call KeySlaveAddress
KeyForAnotherDevice:
;;>>> K.W. Thu 03-15-2001 15:10:30
cmp al,KeyEsc
jz EnterBaseAddress
;; K.W. Thu 03-15-2001 15:10:33 <<<
cmp ah,KeyF5 ;F5
jz ExitProgramF5
cmp ah,KeyF10
jz ExitProgram
cmp ah,KeyPgDn
jnz CheckNextAvailableKey
push ax
call FindDeviceDown
pop ax
jc CheckNextAvailableKey1
;;; KenWang [050702] >>>>>>
push si
lea si,KeyF10Search
cmp byte ptr ds:[si],KeyF10
mov byte ptr ds:[si],00h
pop si
jz ExitProgram
;;; KenWang [050702] <<<<<<
mov dx,SlavePosition
call SetCursor
mov al,bl
call DisplayHex
jmp short SlaveAddressToBuffer
CheckNextAvailableKey:
cmp ah,KeyPgUp
jnz CheckNextAvailableKey1
push ax
call FindDeviceUp
pop ax
jc CheckNextAvailableKey1
;;; KenWang [050702] >>>>>>
push si
lea si,KeyF10Search
cmp byte ptr ds:[si],KeyF10
mov byte ptr ds:[si],00h
pop si
jz ExitProgram
;;; KenWang [050702] <<<<<<
mov dx,SlavePosition
call SetCursor
mov al,bl
call DisplayHex
jmp short SlaveAddressToBuffer
CheckNextAvailableKey1:
mov ds:[si],al
ExitEnterSlaveAddress:
inc si
loop WkeySlaveAddress
lea si,AddressValue
mov bh,ds:[si]
mov bl,ds:[si+1]
call CharToHex ; BL=slave address
SlaveAddressToBuffer:
lea si,SlaveAddress
and bl,0feh
mov ds:[si],bl
or sp,sp
ExitProgram:
lea di,SubFuncSelect
mov al,0ffh
mov ds:[di],al
ExitSMbusProgram:
pop cx
pop bx
pop si
ret
ExitProgramF5:
call StoreScreenC
call MainMenuSelect
call RestoreScreenC
cmp sp,sp
jmp ExitSMbusProgram
;-------------------------------
EnterBaseAddress:
mov dx,SmbusPosition+03h
mov cx,4
call EmptyAddress
;;
mov dx,SmbusPosition+03h
mov cx,5
call EnterPortAddress
jc EnterSMBaseAddressFail
mov dx,SmbusPosition+03h
call CalaFixedCursorposn ;Ouput=AX
mov cx,4
call GetPortAddressFromScreen
lea si,SmbusAddress
mov word ptr ds:[si],ax
xchg ah,al
EnterSMBaseAddressFail:
mov dx,SmbusPosition
call SetCursor
lea si,SmbusAddress
mov ax,ds:[si]
xchg ah,al
call DisplayHex
xchg ah,al
call DisplayHex
mov dx,SlavePosition
call SetCursor
jmp BackSlaveAddress
; ret
;-------------------------------
KeySlaveAddress:
push cx
WWait:
call WaitOneKey
cmp al,KeyEsc
jz ExitWWait
cmp ah,KeyF5
jz ExitWWait
cmp ah,KeyF10
jz ExitWWait
cmp ah,KeyPgDn
jz ExitWWait
cmp ah,KeyPgUp
jz ExitWWait
call DisplayKeyinValue
jc WWait
ExitWWait:
pop cx
ret
;---------------------------------------
OpenSMbusController:
pusha
call OpenSMBusNeeded
popa
ret
;---------------------------------------
OpenSMBusNeeded:
mov eax,80000000h
and al,00h ;Check Vendor
mov bh,2 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
lea si,OpenSMBUSDevice
CheckOpenSMBUSLoop:
mov ebx,ds:[si]
cmp ebx,0
jz SMBUSOpenNoNeed
push ebx
and ebx,0ffff0000h
pop ebx
jz CompareVendor
jmp short CompareGo
CompareVendor:
and eax,0000ffffh
CompareGo:
cmp eax,ebx
jz SMBUSDeviceFound
add si,8
jmp CheckOpenSMBUSLoop
SMBUSDeviceFound :
mov ax,ds:[si+4]
and al,0
or eax,80000000h
mov bh,2 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
cmp eax,0h
jz SMBUSOpenNoNeed
cmp eax,0ffffffffh
jz SMBUSOpenNoNeed
;;; KenWang [040802] >>>>>>
;;; Read other pci device for this devcie ready ???
mov eax,80000000h
and al,00h ;Check Vendor
mov bh,1 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
;;; KenWang [040802] <<<<<<
mov ax,ds:[si+4]
or eax,80000000h
mov bh,0 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
push si
lea si,ICH2FunctionStatus
mov ds:[si],al
pop si
lea di,ChipsetVendorOffset
mov bx,ds:[si+4]
mov ds:[di],bx
mov bl,ds:[si+6]
and al,bl
mov bl,ds:[si+7]
or al,bl
mov cl,al
mov ax,ds:[si+4]
or eax,80000000h
mov bh,0 ;BH=0/1/2 byte/word/dword
call WritePciReg
clc
ret
SMBUSOpenNoNeed:
stc
ret
;---------------------------------------
CloseICH2Smbus:
pusha
lea si,ChipsetVendorOffset
mov ax,ds:[si]
cmp ax,0
jz SMBUSAlreadyClose
or eax,80000000h
lea si,ICH2FunctionStatus
mov cl,ds:[si]
mov bh,0 ;BH=0/1/2 byte/word/dword
call WritePciReg
SMBUSAlreadyClose:
popa
ret
;---------------------------------------
comment \
CloseIntelSMBus:
mov eax,8000f800h
and al,00h ;Check Vendor
mov bh,2 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
and eax,24008086h
cmp eax,24008086h
jnz CloseIntelSMBusExit
lea si,ICH2FunctionStatus
mov cl,ds:[si]
mov eax,8000f8f2h
mov bh,0 ;BH=0/1/2 byte/word/dword
call WritePciReg
clc
ret
CloseIntelSMBusExit:
stc
ret
;---------------------------------------
CloseSISSMBus:
mov eax,80001000h
and al,00h ;Check Vendor
mov bh,2 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;eax=Value
and eax,00001039h
cmp eax,00001039h
jnz CloseSMbusSISExit
lea si,ICH2FunctionStatus
mov cl,ds:[si]
mov eax,80001077h
mov bh,0 ;BH=0/1/2 byte/word/dword
call WritePciReg
clc
ret
CloseSMbusSISExit:
stc
ret
\
;---------------------------------------
GetSMBUSAddress:
push eax
push bx
push si
; Get SMBUS Address
xor bx,bx
lea di,SmbusDeviceNo
LoopCheckSmbus:
mov eax,ds:[di+bx]
cmp eax,00000000h
jz smbus_absent
push bx
and al,00h ;Check Vendor
mov bh,1 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;ax=Value
pop bx
push bx
mov bx,ds:[di+bx+4]
cmp ax,bx ; Compare Vendor ID
pop bx
jnz LoopCheckSmbusE
;;; KenWang [050602] >>>>>>
push si
lea si,CurrentVendorID
mov ds:[si],ax
pop si
;;; KenWang [050602] <<<<<<
mov ax,ds:[di+bx+6]
cmp ax,0ffffh
jz DonotCareDeviceID
push bx
mov eax,ds:[di+bx]
mov al,02h
mov bh,1 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;ax=Value
pop bx
push bx
mov bx,ds:[di+bx+6]
cmp ax,bx ; Compare Device ID
pop bx
jnz LoopCheckSmbusE
DonotCareDeviceID:
;;<<<K.W. Tue 11-27-2001 12:01:35
;;; KenWang [050602] >>>>>>
push si
push eax
push ebx
shl eax,16
lea si,CurrentVendorID
mov ebx,ds:[si]
or ebx,eax
mov ds:[si],ebx
pop ebx
pop eax
pop si
;;; KenWang [050602] <<<<<<
push si
mov ax,ds:[di+bx+4]
lea si,SMBUSVendorM
CheckNextMethod:
cmp ax,ds:[si] ;SIS
jz DecideMethod
add si,4
jmp short CheckNextMethod
DecideMethod:
mov al,ds:[si+2]
lea si,I2CProgramMethod
mov ds:[si],al
pop si
;;>>>K.W. Tue 11-27-2001 12:01:33
push bx
mov eax,ds:[di+bx]
mov al,04h
mov bh,0 ;BH=0/1/2 byte/word/dword
mov cl,01h
call WritePciReg ;ax=Value
mov eax,ds:[di+bx]
mov bh,1 ;BH=0/1/2 byte/word/dword
call ReadPciReg ;ax=Value
pop bx
LoopCheckSmbusE:
add bx,8
cmp ax,0ffffh
jz LoopCheckSmbus
cmp ax,0000h
jz LoopCheckSmbus
mov dx,ax
and dl,0feh
lea si,SmbusAddress
mov ds:[si],dx
pop si
pop bx
pop eax
clc
ret
smbus_absent:
pop si
pop bx
pop eax
stc
ret
;---------------------------------------
GetSMBAddressFromScreen:
mov dx,SmbusPosition+3
call CalaFixedCursorposn ;Ouput=AX
mov cx,4
call GetPortAddressFromScreen
lea si,SmbusAddress
mov ds:[si],ax
mov dx,SlavePosition+1
call CalaFixedCursorposn ;Ouput=AX
mov cx,2
call GetPortAddressFromScreen
lea si,SlaveAddress
and al,0feh
mov ds:[si],al
ret
;---------------------------------------
GetBlockSendCounts:
mov cx,128
mov dx,(ValueStartCol+ValueStartRow)+072Dh
LoopCountBlockBytes:
push cx
call CalaFixedCursorposn ;AX= offset B segment
call GetFixCursorValue
pop cx
push es
mov bx,ax
mov ax,0b800h
mov es,ax
xor si,si
add si,bx
mov al,es:[si+1]
mov ah,es:[si+3]
pop es
cmp al,Red+LightColor
jz GetBlockBytesOK
cmp ah,Red+LightColor
jz GetBlockBytesOK
sub dl,3
cmp dl,ValueStartCol
jae NextDifferentValue
mov dl,ValueStartCol+2dh
dec dh
NextDifferentValue:
loop LoopCountBlockBytes
mov al,0
ret
GetBlockBytesOK:
mov ax,cx
ret
;---------------------------------------
DisplaySMBusInformation:
ret
;---------------------------------------
DisplayFixedSMbusAddress:
mov dx,SmbusPosition
call SetCursor
lea si,SmbusAddress
mov ax,ds:[si]
xchg ah,al
call DisplayHex
xchg ah,al
call DisplayHex
mov dx,SlavePosition
call SetCursor
lea si,SlaveAddress
mov ax,ds:[si]
; xchg ah,al
; call DisplayHex
; xchg ah,al
call DisplayHex
ret
;---------------------------------------
SMBUSAccessMethod:
;;Intel/VIA
dw read_i2c_data_byte
dw write_i2c_data_byte
dw read_i2c_data_block
dw write_i2c_data_block
;;SIS
dw SISread_i2c_data_byte
dw SISwrite_i2c_data_byte
dw sis_read_i2c_data_block
dw sis_write_i2c_data_block
;---------------------------------------
include i2c.inc
include sisi2c.inc
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -