Subversion Repositories Kolibri OS

Rev

Rev 239 | Rev 500 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
;
313 Ghost 2
; Ghost Monitor - утилита (стресс) тестирования и мониторинга системы
3
; Copyright (C) 2005, 2006, 2007 Mihailov Ilia (ghost.nsk@mail.ru)
4
; All Right Reserved
5
 
6
;
205 heavyiron 7
; Библиотека для чипов WinBond
8
;
9
;
10
;    Дописать получение инфы с других датчиков
239 Ghost 11
;    W83627DHG мониторинг аналогичен W83627EHF, дописать учёт DIV_B2
205 heavyiron 12
;  + 16.03.06 Исправлена ошибка в wb_get_cpu_temper с десятых градуса (было 30.5 30.0 31.5 ...)
13
;
14
;
239 Ghost 15
;    О маркировке (?) : H - H/W Monitor, G - Pb-free package, T - ACPI, S - Smart Card Reader Interface
16
;      D - SuperIO supporting Intel* PECI* & SST* interfaces, U - UART
17
;
223 Ghost 18
;		      | Chip name	| ID		Vin	Fanin	PWM	Temp   ISA   SMBus
19
msg_wb27HF:	db 8, 'W83627HF'	; 0x20|0x21	 9	  3	 2	 3      +      +
20
msg_wb27THF:	db 9, 'W83627THF'	; 0x90|0x91	 7	  3	 3	 3      +      +
21
msg_wb37THF:	db 9, 'W83637THF'	; 0x80		 7	  3	 3	 3      +      +
22
msg_wb97HF:	db 8, 'W83697HF'	; 0x60|0x61	 8	  2	 2	 2      +      -
205 heavyiron 23
msg_wb27THFA:	db 11,'W83627THF-A'	; 0x1A
239 Ghost 24
 
25
msg_w83627DHG:	db 9, 'W83627DHG'	; 0xC1		 ?	  5	 ?	 3      +      +
26
msg_w83627EHF:	db 9, 'W83627EHF'	; 0x88		 10	  5	 3	 3      +      +
27
msg_w83627EHG:	db 9, 'W83627EHG'	; 0xA1		 10	  5	 3	 3      +      +
28
 
29
 
223 Ghost 30
;		db 7, 'W83781D'		; 0x10|0x11	 7	  	 3	 3      +      +
31
;		db 7, 'W83782D'		; 0x30		 9	   	 3	 3      +      +
32
;		db 8, 'AS99127F'	; 0x31           7               3       3      -      +
33
;		db 7, 'W83783S'		; 0x40|0x41	 5-6	   	 3	 1-2    -      +
34
;		db 7, 'W83791D'		; 0x70|0x71	 10	   	 5	 3      -      +
205 heavyiron 35
msg_wbunk:	db 15,'Unknown Winbond'	; other, non zero ;-)
36
 
239 Ghost 37
uglobal
38
wb_fans_num	db	0
39
endg
40
 
205 heavyiron 41
;-----------------------------------
42
wb_init:
43
; Проверка наличия и инициализация
44
; OUT - CF = 1 - error
223 Ghost 45
	cmp	byte[acc_type], 2	; Only ISA and SMBus
46
	jae	wb_no
47
 
205 heavyiron 48
	mov	al, 0x4e
223 Ghost 49
	xor	bl, bl
50
	call	[IO_Write]
205 heavyiron 51
	mov	al, 0x4f
223 Ghost 52
	call	[IO_Read]
205 heavyiron 53
	mov	ah, al		;!
54
	mov	al, 0x4e
223 Ghost 55
	mov	bl, 0x80
56
	call	[IO_Write]
205 heavyiron 57
	mov	al, 0x4f
223 Ghost 58
	call	[IO_Read]
205 heavyiron 59
	cmp	ax, 0xa35c
60
	jne	wb_no		; это не Winbond !!!
239 Ghost 61
 
223 Ghost 62
	; --- узнаём идентификатор чипа --
205 heavyiron 63
	mov	al, 0x58
223 Ghost 64
	call	[IO_Read]
65
	and	al, 0xFE	; 0x20 = 0x21, 0x60 = 0x61, etc
239 Ghost 66
	mov	byte[wb_fans_num], 3
223 Ghost 67
	mov	edx, msg_wb27HF
68
	cmp	al, 0x20
69
	je	@f
70
	mov	edx, msg_wb27THF
71
	cmp	al, 0x90
72
	je	@f
73
	mov	edx, msg_wb37THF
74
	cmp	al, 0x80
75
	je	@f
76
	mov	edx, msg_wb97HF
77
	cmp	al, 0x60
78
	je	@f
79
	mov	edx, msg_wb27THFA
80
	cmp	al, 0x1A
81
	je	@f
239 Ghost 82
	mov	byte[wb_fans_num], 5
83
	mov	edx, msg_w83627EHF
84
	cmp	al, 0x88
85
	je	@f
86
	mov	edx, msg_w83627EHG
87
	cmp	al, 0xA0
88
	je	@f
89
	mov	edx, msg_w83627DHG
90
	cmp	al, 0xC0
91
	je	@f
92
	mov	byte[wb_fans_num], 3
223 Ghost 93
	mov	edx, msg_wbunk
94
@@:	mov	[hwm_chip_name], edx
205 heavyiron 95
	clc
96
	ret
97
wb_no:	stc
98
	ret
99
 
100
;-----------------------------------
223 Ghost 101
wb_getparam:
102
	call	wb_get_temp
103
	call	wb_get_fan_speed
104
	mov	edi, wb_coeff
105
	call	wb_get_volt
106
	fld	dword[V12]
107
	fld	dword[wb_n12v_const]
108
	faddp	st1, st0
109
	fstp	dword[V12]
110
	ret
111
;-----------------------------------
205 heavyiron 112
wb_get_temp:
113
	; temp 1
223 Ghost 114
	mov	al, 0x4e	; Выбираем bank 1
115
	mov	bl, 1
116
	call	[IO_Write]
117
	mov	al, 0x50	; Получаем старший байт температуры (градусы)
118
	call	[IO_Read]
119
	mov	[hwm_temps], al
120
	mov	al, 0x51	; Получаем младший байт температуры  (x.5`C)
121
	call	[IO_Read]
122
	cmp	al, 0		; if al == 0 then x.0, else x.5
205 heavyiron 123
	je	@f
124
	mov	al, 5
223 Ghost 125
@@:	mov	[hwm_temps + 1], al
126
 
205 heavyiron 127
	; temp 2 (3 SYSTIN)
223 Ghost 128
	mov	al, 0x4e	; Выбираем bank 0
129
	xor	bl, bl
130
	call	[IO_Write]
131
	mov	al, 0x27	; Получаем старший байт температуры (градусы)
132
	call	[IO_Read]
133
	mov	[hwm_temps + 2], al
134
 
205 heavyiron 135
	; temp 3 (VTIN)
223 Ghost 136
	mov	al, 0x4e	; Выбираем bank 2
137
	mov	bl, 2
138
	call	[IO_Write]
139
	mov	al, 0x50	; Получаем старший байт температуры (градусы)
140
	call	[IO_Read]
141
	mov	[hwm_temps + 4], al
142
	mov	al, 0x51	; Получаем младший байт температуры  (x.5`C)
143
	call	[IO_Read]
144
	cmp	al, 0		; if al == 0 then x.0, else x.5
205 heavyiron 145
	je	@f
146
	mov	al, 5
223 Ghost 147
@@:	mov	[hwm_temps + 5], al
148
 
205 heavyiron 149
	; Проверка температуры, датчики с 127.5`C не используются
150
	mov	ecx, 3
223 Ghost 151
	mov	esi, hwm_temps
205 heavyiron 152
wb_check_temp:
153
	cmp	word[esi + ecx * 2 - 2], 0x057F
154
	jne	wb_temp_ok
155
	mov	word[esi + ecx * 2 - 2], 0
156
wb_temp_ok:
157
	loop	wb_check_temp
158
 
159
	ret
160
;-----------------------------------
161
wb_get_fan_speed:
162
	; fan1
163
	mov	al, 0x47
223 Ghost 164
	call	[IO_Read]
205 heavyiron 165
	and	al, 0x30
166
	shr	al, 4
167
	mov	ebx, 1
168
	mov	cl, al
169
	shl	ebx, cl	; <- div1
170
	xor	eax, eax
223 Ghost 171
	mov	al,  0x28
172
	call	[IO_Read]
205 heavyiron 173
	cmp	al, 255
174
	jne	@f
223 Ghost 175
	xor	eax, eax	; ???
176
	ret			; ???
205 heavyiron 177
@@:	mul	ebx
178
	mov	ebx, eax
179
	mov	eax, 1350000
180
	xor	edx, edx
181
	div	ebx
223 Ghost 182
	mov	[hwm_rpms], eax
239 Ghost 183
 
205 heavyiron 184
	mov	al, 0x47
223 Ghost 185
	call	[IO_Read]
205 heavyiron 186
	shr	al, 6
187
	mov	ebx, 1
188
	mov	cl, al
189
	shl	ebx, cl	; <- div2
190
	xor	eax, eax
223 Ghost 191
	mov	al,  0x29
192
	call	[IO_Read]
205 heavyiron 193
	cmp	al, 255
194
	jne	@f
195
	xor	eax, eax
196
	ret
197
@@:	mul	ebx
198
	mov	ebx, eax
199
	mov	eax, 1350000
200
	xor	edx, edx
201
	div	ebx
223 Ghost 202
	mov	[hwm_rpms + 4], eax
239 Ghost 203
 
204
	mov	al, 0x4B
205
	call	[IO_Read]
206
	shr	al, 6
207
	mov	ebx, 1
208
	mov	cl, al
209
	shl	ebx, cl	; <- div3
210
	xor	eax, eax
211
	mov	al,  0x2A
212
	call	[IO_Read]
213
	cmp	al, 255
214
	jne	@f
215
	xor	eax, eax
205 heavyiron 216
	ret
239 Ghost 217
@@:	mul	ebx
218
	mov	ebx, eax
219
	mov	eax, 1350000
220
	xor	edx, edx
221
	div	ebx
222
	mov	[hwm_rpms + 8], eax
223
 
224
	cmp	byte[wb_fans_num], 3
225
	jna	.wb_f_e
226
 
227
	mov	al, 0x59
228
	call	[IO_Read]
229
	and	al, 3
230
	mov	ebx, 1
231
	mov	cl, al
232
	shl	ebx, cl	; <- div4, дописать учёт DIV_B2
233
	xor	eax, eax
234
	mov	al,  0x3F
235
	call	[IO_Read]
236
	cmp	al, 255
237
	jne	@f
238
	xor	eax, eax
239
	ret
240
@@:	mul	ebx
241
	mov	ebx, eax
242
	mov	eax, 1350000
243
	xor	edx, edx
244
	div	ebx
245
	mov	[hwm_rpms + 12], eax
246
 
247
	mov	al, 0x59
248
	call	[IO_Read]
249
	shr	al, 2
250
	and	al, 3
251
	mov	ebx, 1
252
	mov	cl, al
253
	shl	ebx, cl	; <- div5, дописать учёт DIV_B2
254
	xor	eax, eax
255
	mov	al, 0x4e	; Выбираем bank 5
256
	mov	bl, 5
257
	call	[IO_Write]
258
	mov	al,  0x53
259
	call	[IO_Read]
260
	cmp	al, 255
261
	jne	@f
262
	xor	eax, eax
263
	ret
264
@@:	mul	ebx
265
	mov	ebx, eax
266
	mov	eax, 1350000
267
	xor	edx, edx
268
	div	ebx
269
	mov	[hwm_rpms + 16], eax
270
 
271
.wb_f_e:
272
	ret
205 heavyiron 273
;-----------------------------------
274
wb_get_volt:
223 Ghost 275
	;mov	edi, wb_coeff		; <-- possible differences for miscellaneous chip
276
	mov	esi, hwm_voltages
277
	xor	ecx, ecx
205 heavyiron 278
@@:	mov	eax, ecx
279
	add	al, 0x20
223 Ghost 280
	call	[IO_Read]
205 heavyiron 281
	fld	dword [edi + ecx * 4]
282
	push	eax
283
	fild	dword [esp]
284
	fmulp	st1, st0
285
	fstp	dword [esi + ecx * 4]
286
	pop	eax
287
	inc	ecx
288
	cmp	ecx, 7
289
	jb	@b
290
	ret
291
 
292
wb_coeff:	dd 0.016		; Vcore
293
		dd 0.016		; Vin0
294
		dd 0.016		; Vin1 (+3.3V)
295
		dd 0.02688		; AVcc (+5V)
296
		dd 0.0608		; Vin2 (+12V)
297
		dd 0.0822857142857145	; -12V
298
		dd -0.02408		; -5V ; false
299
 
300
wb_n12v_const	dd -14.9142857142857
223 Ghost 301