;
; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
; All Right Reserved

;
; Библиотека для чипов WinBond
;
;
;    Дописать получение инфы с других датчиков
;    W83627DHG мониторинг аналогичен W83627EHF, дописать учёт DIV_B2
;  + 16.03.06 Исправлена ошибка в wb_get_cpu_temper с десятых градуса (было 30.5 30.0 31.5 ...)
;
;
;    О маркировке (?) : H - H/W Monitor, G - Pb-free package, T - ACPI, S - Smart Card Reader Interface
;      D - SuperIO supporting Intel* PECI* & SST* interfaces, U - UART
;
;		   | Chip name  	 | ID		Vin	Fanin	PWM	Temp   ISA   SMBus
msg_wb27HF:	db 'W83627HF', 0	; 0x20|0x21	 9	  3	 2	 3      +      +
msg_wb27THF:	db 'W83627THF', 0	; 0x90|0x91	 7	  3	 3	 3      +      +
msg_wb37THF:	db 'W83637THF', 0	; 0x80		 7	  3	 3	 3      +      +
msg_wb97HF:	db 'W83697HF', 0	; 0x60|0x61	 8	  2	 2	 2      +      -
msg_wb27THFA:	db 'W83627THF-A', 0	; 0x1A

msg_w83627DHG:	db 'W83627DHG', 0	; 0xC1		 ?	  5	 ?	 3      +      +
msg_w83627EHF:	db 'W83627EHF', 0	; 0x88		 10	  5	 3	 3      +      +
msg_w83627EHG:	db 'W83627EHG', 0	; 0xA1		 10	  5	 3	 3      +      +


;		db 'W83781D', 0		; 0x10|0x11	 7	  	 3	 3      +      +
;		db 'W83782D', 0		; 0x30		 9	   	 3	 3      +      +
;		db 'AS99127F', 0	; 0x31           7               3       3      -      +
;		db 'W83783S', 0		; 0x40|0x41	 5-6	   	 3	 1-2    -      +
;		db 'W83791D', 0		; 0x70|0x71	 10	   	 5	 3      -      +
msg_wbunk:	db 'Unknown Winbond', 0	; other, non zero ;-)

uglobal
wb_fans_num	db	0
endg

;-----------------------------------
wb_init:
; Проверка наличия и инициализация
; OUT - CF = 1 - error
	cmp	byte[acc_type], 2	; Only ISA and SMBus
	jae	wb_no

	mov	al, 0x4e
	xor	bl, bl
	call	[IO_Write]
	mov	al, 0x4f
	call	[IO_Read]
	mov	ah, al		;!
	mov	al, 0x4e
	mov	bl, 0x80
	call	[IO_Write]	
	mov	al, 0x4f
	call	[IO_Read]
	cmp	ax, 0xa35c
	jne	wb_no		; это не Winbond !!!

	; --- узнаём идентификатор чипа --
	mov	al, 0x58
	call	[IO_Read]
	and	al, 0xFE	; 0x20 = 0x21, 0x60 = 0x61, etc
	mov	byte[wb_fans_num], 3
	mov	edx, msg_wb27HF
	cmp	al, 0x20
	je	@f
	mov	edx, msg_wb27THF
	cmp	al, 0x90
	je	@f
	mov	edx, msg_wb37THF
	cmp	al, 0x80
	je	@f
	mov	edx, msg_wb97HF
	cmp	al, 0x60
	je	@f
	mov	edx, msg_wb27THFA
	cmp	al, 0x1A
	je	@f
	mov	byte[wb_fans_num], 5
	mov	edx, msg_w83627EHF
	cmp	al, 0x88
	je	@f
	mov	edx, msg_w83627EHG
	cmp	al, 0xA0
	je	@f
	mov	edx, msg_w83627DHG
	cmp	al, 0xC0
	je	@f
	mov	byte[wb_fans_num], 3
	mov	edx, msg_wbunk
@@:	mov	[hwm_chip_name], edx
	clc
	ret
wb_no:	stc
	ret

;-----------------------------------
wb_getparam:
	call	wb_get_temp
	call	wb_get_fan_speed
	mov	edi, wb_coeff
	call	wb_get_volt
	fld	dword[V12]
	fld	dword[wb_n12v_const]
	faddp	st1, st0
	fstp	dword[V12]
	ret
;-----------------------------------
wb_get_temp:
	; temp 1
	mov	al, 0x4e	; Выбираем bank 1
	mov	bl, 1
	call	[IO_Write]
	mov	al, 0x50	; Получаем старший байт температуры (градусы)
	call	[IO_Read]
	mov	[hwm_temps], al
	mov	al, 0x51	; Получаем младший байт температуры  (x.5`C)
	call	[IO_Read]
	cmp	al, 0		; if al == 0 then x.0, else x.5
	je	@f
	mov	al, 5
@@:	mov	[hwm_temps + 1], al

	; temp 2 (3 SYSTIN)
	mov	al, 0x4e	; Выбираем bank 0
	xor	bl, bl
	call	[IO_Write]
	mov	al, 0x27	; Получаем старший байт температуры (градусы)
	call	[IO_Read]
	mov	[hwm_temps + 2], al
	
	; temp 3 (VTIN)
	mov	al, 0x4e	; Выбираем bank 2
	mov	bl, 2
	call	[IO_Write]
	mov	al, 0x50	; Получаем старший байт температуры (градусы)
	call	[IO_Read]
	mov	[hwm_temps + 4], al
	mov	al, 0x51	; Получаем младший байт температуры  (x.5`C)
	call	[IO_Read]
	cmp	al, 0		; if al == 0 then x.0, else x.5
	je	@f
	mov	al, 5
@@:	mov	[hwm_temps + 5], al

	; Проверка температуры, датчики с 127.5`C не используются
	mov	ecx, 3
	mov	esi, hwm_temps
wb_check_temp:
	cmp	word[esi + ecx * 2 - 2], 0x057F
	jne	wb_temp_ok
	mov	word[esi + ecx * 2 - 2], 0
wb_temp_ok:
	loop	wb_check_temp
	
	ret
;-----------------------------------
wb_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
	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
	ret
@@:	mul	ebx
	mov	ebx, eax
	mov	eax, 1350000
	xor	edx, edx
	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
	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
	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
	div	ebx
	mov	[hwm_rpms + 16], eax

.wb_f_e:
	ret
;-----------------------------------
wb_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

wb_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
		
wb_n12v_const	dd -14.9142857142857

	
	
