0,0 → 1,298 |
; |
; Ghost Monitor - ã⨫¨â (áâà¥áá) â¥áâ¨à®¢ ¨ï ¨ ¬®¨â®à¨£ á¨á⥬ë |
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru) |
; All Right Reserved |
|
; |
; ¨¡«¨®â¥ª ¤«ï 稯®¢ Hudson |
; |
; |
; |
; | Chip name | ID Vin Fanin PWM Temp ISA SMBus |
msg_A50: db 'AMD Hudson A50', 0 ; 0x20|0x21 9 3 2 3 + + |
msg_A55: db 'AMD Hudson A55', 0 ; 0x20|0x21 9 3 2 3 + + |
|
msg_amdunk: db 'Unknown AMD', 0 ; other, non zero ;-) |
|
uglobal |
wb_fans_num db 0 |
endg |
|
;----------------------------------- |
hudson_init: |
; OUT - CF = 1 - error |
|
mov ebx, 0xF00C3000 |
mov eax, [ebx] |
cmp eax, 0x17031022 |
jne .not_found ; not a Fusion! |
|
mov byte[wb_fans_num], 3 |
mov edx, msg_A55 |
@@: mov [hwm_chip_name], edx |
mov dword[hwm_enable],1 |
mov al, 0xE6 |
mov bl, 0x0A |
call pm2write ; init PWM_Control register |
|
|
clc |
ret |
.not_found: stc |
ret |
|
;----------------------------------- |
hudson_getparam: |
call hudson_get_temp |
call hudson_get_fan_speed |
mov edi, hudson_coeff |
call hudson_get_volt |
fld dword[V12] |
fld dword[hudson_n12v_const] |
faddp st1, st0 |
fstp dword[V12] |
ret |
;----------------------------------- |
hudson_get_temp: |
; temp 1 |
mov ebx, 0xF00C3000 |
mov eax, [ebx+0xA4] |
mov edx, eax |
shr edx, 24 |
mov [hwm_temps], dl ; integer degrees |
mov edx, eax |
shr edx, 21 |
and dl, 7 ; 1/8th fractions of degree |
cmp dl, 3 ; round 3/8 upto 0.4 |
jb .corrected |
inc dl |
cmp dl, 8 ; 7/8 ~ 0.9 |
jb .corrected |
inc dl |
.corrected: |
mov [hwm_temps + 1], dl |
|
; temp 2 (3 SYSTIN) |
xor ebx, ebx |
mov al, 0x95 |
call pm2read |
mov bl, al |
mov al, 0x96 ; SB internal sensor |
call pm2read |
mov bh, al |
mov [hudson_temp_read], ebx |
fild dword[hudson_temp_read] |
fmul dword[hudson_temp_coef] |
fidiv dword[hudson_int_64] |
fadd dword[hudson_temp_offs] |
fimul dword[hudson_int_2] |
fistp dword[hudson_temp_read] |
mov bx, word[hudson_temp_read] |
mov ax, bx |
xor bh, bh |
shr eax, 1 |
mov byte[hwm_temps + 2], al |
or bl, 1 |
jz @f |
mov bh, 5 |
mov byte[hwm_temps + 3], bh |
|
|
; temp 3 (VTIN) |
xor ebx, ebx |
mov al, 0xA1 |
call pm2read |
mov bl, al |
mov al, 0xA2 ; temp sensor #2 |
call pm2read |
mov bh, al |
mov [hudson_temp_read], ebx |
fild dword[hudson_temp_read] |
fmul dword[hudson_temp_coef] |
fidiv dword[hudson_int_64] |
fadd dword[hudson_temp_offs] |
fimul dword[hudson_int_2] |
fistp dword[hudson_temp_read] |
mov bx, word[hudson_temp_read] |
mov ax, bx |
xor bh, bh |
shr eax, 1 |
mov byte[hwm_temps + 4], al |
or bl, 1 |
jz @f |
mov bh, 5 |
mov byte[hwm_temps + 5], bh |
|
|
mov ecx, 3 |
mov esi, hwm_temps |
hudson_check_temp: |
cmp word[esi + ecx * 2 - 2], 0x057F |
jne hudson_temp_ok |
mov word[esi + ecx * 2 - 2], 0 |
hudson_temp_ok: |
loop hudson_check_temp |
|
ret |
;----------------------------------- |
hudson_get_fan_speed: |
; fan1 |
mov al, 0x47 |
call [IO_Read] |
and al, 0x30 |
shr al, 4 |
mov ebx, 1 |
mov cl, al |
shl ebx, cl ; <- div1 |
xor eax, eax |
mov al, 0x28 |
call [IO_Read] |
cmp al, 255 |
jne @f |
xor eax, eax ; ??? |
ret ; ??? |
@@: mul ebx |
mov ebx, eax |
mov eax, 1350000 |
xor edx, edx |
test ebx, ebx |
jz .div0 |
div ebx |
mov [hwm_rpms], eax |
|
mov al, 0x47 |
call [IO_Read] |
shr al, 6 |
mov ebx, 1 |
mov cl, al |
shl ebx, cl ; <- div2 |
xor eax, eax |
mov al, 0x29 |
call [IO_Read] |
cmp al, 255 |
jne @f |
xor eax, eax |
.div0: |
ret |
@@: mul ebx |
mov ebx, eax |
mov eax, 1350000 |
xor edx, edx |
test ebx, ebx |
jz .div0 |
div ebx |
mov [hwm_rpms + 4], eax |
|
mov al, 0x4B |
call [IO_Read] |
shr al, 6 |
mov ebx, 1 |
mov cl, al |
shl ebx, cl ; <- div3 |
xor eax, eax |
mov al, 0x2A |
call [IO_Read] |
cmp al, 255 |
jne @f |
xor eax, eax |
ret |
@@: mul ebx |
mov ebx, eax |
mov eax, 1350000 |
xor edx, edx |
test ebx, ebx |
jz .div0 |
div ebx |
mov [hwm_rpms + 8], eax |
|
cmp byte[wb_fans_num], 3 |
jna .wb_f_e |
|
mov al, 0x59 |
call [IO_Read] |
and al, 3 |
mov ebx, 1 |
mov cl, al |
shl ebx, cl ; <- div4, ¤®¯¨á âì ãçñâ DIV_B2 |
xor eax, eax |
mov al, 0x3F |
call [IO_Read] |
cmp al, 255 |
jne @f |
xor eax, eax |
ret |
@@: mul ebx |
mov ebx, eax |
mov eax, 1350000 |
xor edx, edx |
test ebx, ebx |
jz .div0 |
div ebx |
mov [hwm_rpms + 12], eax |
|
mov al, 0x59 |
call [IO_Read] |
shr al, 2 |
and al, 3 |
mov ebx, 1 |
mov cl, al |
shl ebx, cl ; <- div5, ¤®¯¨á âì ãçñâ DIV_B2 |
xor eax, eax |
mov al, 0x4e ; ë¡¨à ¥¬ bank 5 |
mov bl, 5 |
call [IO_Write] |
mov al, 0x53 |
call [IO_Read] |
cmp al, 255 |
jne @f |
xor eax, eax |
ret |
@@: mul ebx |
mov ebx, eax |
mov eax, 1350000 |
xor edx, edx |
test ebx, ebx |
jz .wb_f_e |
div ebx |
mov [hwm_rpms + 16], eax |
|
.wb_f_e: |
ret |
;----------------------------------- |
hudson_get_volt: |
;mov edi, wb_coeff ; <-- possible differences for miscellaneous chip |
mov esi, hwm_voltages |
xor ecx, ecx |
@@: mov eax, ecx |
add al, 0x20 |
call [IO_Read] |
fld dword [edi + ecx * 4] |
push eax |
fild dword [esp] |
fmulp st1, st0 |
fstp dword [esi + ecx * 4] |
pop eax |
inc ecx |
cmp ecx, 7 |
jb @b |
ret |
|
align 4 |
hudson_coeff: dd 0.016 ; Vcore |
dd 0.016 ; Vin0 |
dd 0.016 ; Vin1 (+3.3V) |
dd 0.02688 ; AVcc (+5V) |
dd 0.0608 ; Vin2 (+12V) |
dd 0.0822857142857145 ; -12V |
dd -0.02408 ; -5V ; false |
|
hudson_n12v_const dd -14.9142857142857 |
|
hudson_temp_offs dd -273.65 |
hudson_temp_coef dd 0.517 |
hudson_temp_read dd 0 |
hudson_int_2 dd 2 |
hudson_int_64 dd 64 |
|
|
|