;
; Ghost Monitor - óòèëèòà (ñòðåññ) òåñòèðîâàíèÿ è ìîíèòîðèíãà ñèñòåìû
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
; All Right Reserved

;
; HWM abstract interface, provide:
;  hwm_init, hwm_get_params, hwm_enable, hwm_temps, hwm_rpms, hwm_voltages, hwm_chip_name
;


if SMBus eq yes
 include	'SMBus.inc'
end if

include		'hwm_wb.inc'
include		'hwm_it87.inc'
include		'hwm_uguru.inc'
;include	'hwm_hudson.inc'

uglobal
	hwm_enable:
		dd	0		; 0 - no, 1 - Winbond, 2 - ITE, ... see HWMProbe list
	hwm_temps:
		db	0,0, 0,0, 0,0	; ãðàäóñ, äåñÿòûå, ãðàäóñ, ...
	hwm_rpms:
		dd	0, 0, 0, 0, 0	; fan1, fan2, fan3, ...
	hwm_voltages:
	Vcore 	dd	0.0
	Vin0	dd	0.0
	Vin1	dd	0.0
	AVcc	dd	0.0
	Vin2	dd	0.0
	V12	dd	0.0
	V5	dd	0.0
	vol8	dd	0.0
	vol9	dd	0.0
	vol10	dd	0.0
	vol11	dd	0.0
	acc_type db	0		; 0 - ISA Bus, 1 - SMBus, 2 - other
endg

IO_Read		dd	isaRead		; In : al - addr, out : al - value
IO_Write	dd	isaWrite	; In : al - addr, bl - value

hwm_unk		db	'Not found', 0
hwm_chip_name	dd	hwm_unk

; NOTE !!!
; HWMProbe - ñïèñîê, ïðîöåäóð ïðîâåðêè ÷èïîâ, çàêàí÷èâàåòñÿ
; íóëåâûì äâîéíûì ñëîâîì
; HWMGetParam - ñïèñîê, ïðîöåäóð ïîëó÷åíèÿ ïàðàìåòðîâ
; îáà ýòè ñïèñêà äîëæíû ñîîòâåòñòâîâàòü äðóã äðóãó ïî
; ïî ïîðÿäêó ïðîöåäóð
HWMProbe:	
        dd	wb_init
		dd	it87_init
		dd	uGuru_init
;        dd  hudson_init
		dd	0		; <- êîíåö ñïèñêà
		
HWMGetParam:	
        dd	wb_getparam
		dd	it87_getparam
		dd	uGuru_getparam
;        dd  hudson_getparam
		
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
hwm_init:
; Ïðîâåðêà íàëè÷èÿ è èíèöèàëèçàöèÿ
	pusha
	; Èùåì äàò÷èêè íà øèíå ISA
	call	isaInit
	jc	@f
	call	chips_probe
	cmp	byte[hwm_enable], 0
	jne	.exit
@@:	call	isaClose

	; Èùåì äàò÷èêè íà øèíå SMBus
	inc	byte [acc_type]
if SMBus eq yes
	call	smbInit
	jc	@f
	call	chips_probe
	cmp	byte[hwm_enable], 0
	jne	.exit
@@:	call	smbClose
end if
	; Èùåì äàò÷èêè íà ñîáñòâåííîé øèíå (LPC etc)
	inc	byte [acc_type]
	call	chips_probe

.exit:	popa
	ret
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=	
chips_probe:
; Íàõîäèì íóæíûé ÷èï
; Out : hwm_enable = !0 if found, else hwm_enable not changed
	cld			; Paranoia
	mov	esi, HWMProbe
@@:	lodsd
	test	eax, eax
	jz	@f		; Êîíåö ñïèñêà
	call	eax
	jc	@b
	sub	esi, HWMProbe
	shr	esi, 2
	mov	dword[hwm_enable], esi
@@:	ret
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
hwm_get_params:
	pusha
	mov	eax, [hwm_enable]
	test	eax, eax
	jz	@f
	dec	eax
	sal	eax, 2
	call	dword[eax + HWMGetParam]
@@:	popa
	ret

;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
; ISA interface
;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
isaRead:
	push	edx
	mov	dx, 0x295
	out	dx, al
	inc	edx
	in	al, dx
	pop	edx
	ret
	
isaWrite:
	push	edx
	mov	dx, 0x295
	out	dx, al
	inc	edx
	mov	al, bl
	out	dx, al
	pop	edx
	ret

isaInit:
	; Out : CF = 0 if Ok
	; ðåçåðâèðóåì 0x295 è 0x296 ïîðòû
	mov	ecx, 0x295
	mov	edx, 0x296
	call	ReservePorts
	; jc	@f
	; mov	[IO_Read], isaRead
	; mov	[IO_Write], isaWrite
	; @@:	
	ret

isaClose:
	; îñâîáîæäàåì 0x295 è 0x296 ïîðòû
	mov	ecx, 0x295
	mov	edx, 0x296
	call	FreePorts
	ret