Subversion Repositories Kolibri OS

Rev

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

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