Subversion Repositories Kolibri OS

Rev

Rev 223 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
205 heavyiron 1
;
2
; Библиотека для чипов WinBond
3
;
4
;
5
;    Дописать получение инфы с других датчиков
6
;  + 16.03.06 Исправлена ошибка в wb_get_cpu_temper с десятых градуса (было 30.5 30.0 31.5 ...)
7
;
8
;
9
uglobal
10
wb_chip_id:	db 0    		; Идентификатор чипа (если нашли)
11
endg
12
;		      | Chip name	| ID		Vin	Fanin	PWM	Temp
13
msg_wb27HF:	db 8, 'W83627HF'	; 0x20|0x21	 9	  3	 2	 3
14
msg_wb27THF:	db 9, 'W83627THF'	; 0x90|0x91	 7	  3	 3	 3
15
msg_wb37THF:	db 9, 'W83637THF'	; 0x80		 7	  3	 3	 3
16
msg_wb97HF:	db 8, 'W83697HF'	; 0x60|0x61	 8	  2	 2	 2
17
msg_wb27EHF:	db 11,'W83627EHF-A'	; 0x88
18
msg_wb27THFA:	db 11,'W83627THF-A'	; 0x1A
19
;		db 7, 'W83781D'		; 0x10|0x11	 7	  	 3	 3
20
;		db 7, 'W83782D'		; 0x30		 9	   	 3	 3
21
;		db 8, 'AS99127F'	; 0x31
22
;		db 7, 'W83783S'		; 0x40|0x41	 5-6	   	 3	 1-2
23
;		db 7, 'W83791D'		; 0x70|0x71	 10	   	 5	 3
24
msg_wbunk:	db 15,'Unknown Winbond'	; other, non zero ;-)
25
 
26
;-----------------------------------
27
wb_init:
28
; Проверка наличия и инициализация
29
; OUT - CF = 1 - error
30
	mov	dx, 0x295
31
	mov	al, 0x4e
32
	out	dx, al
33
	inc	edx
34
	xor	al, al
35
	out	dx, al
36
	dec	edx
37
	mov	al, 0x4f
38
	out	dx, al
39
	inc	edx
40
	in	al, dx
41
	mov	ah, al		;!
42
	dec	edx
43
	mov	al, 0x4e
44
	out	dx, al
45
	inc	edx
46
	mov	al, 0x80
47
	out	dx, al
48
	dec	edx
49
	mov	al, 0x4f
50
	out	dx, al
51
	inc	edx
52
	in	al, dx
53
	cmp	ax, 0xa35c
54
	jne	wb_no		; это не Winbond !!!
55
	dec	edx		; --- узнаём идентификатор чипа --
56
	mov	al, 0x58
57
	out	dx, al
58
	inc	edx
59
	in	al, dx
60
	mov	byte[wb_chip_id], al
61
	clc
62
	ret
63
wb_no:	stc
64
	ret
65
 
66
;-----------------------------------
67
wb_get_temp:
68
	; temp 1
69
	mov	dx, 0x295	; Выбираем bank 1
70
	mov	al, 0x4e
71
	out	dx, al
72
	inc	edx
73
	mov	al, 1
74
	out	dx, al
75
 
76
	dec	edx		; Получаем старший байт температуры (градусы)
77
	mov	al, 0x50
78
	out	dx, al
79
	inc	edx
80
	in	al, dx
81
	mov	[temps], al
82
	dec	edx		; Получаем младший байт температуры  (0.5`C)
83
	mov	al, 0x51
84
	out	dx, al
85
	inc	edx
86
	in	al, dx		; if al == 0 then 0.0, else 0.5
87
	cmp	al, 0
88
	je	@f
89
	mov	al, 5
90
@@:	mov	[temps + 1], al
91
	; temp 2 (3 SYSTIN)
92
	dec	edx		; Выбираем bank 0
93
	mov	al, 0x4e
94
	out	dx, al
95
	inc	edx
96
	mov	al, 0
97
	out	dx, al
98
 
99
	dec	edx		; Получаем старший байт температуры (градусы)
100
	mov	al, 0x27
101
	out	dx, al
102
	inc	edx
103
	in	al, dx
104
	mov	[temps + 2], al
105
	; temp 3 (VTIN)
106
	dec	edx		; Выбираем bank 2
107
	mov	al, 0x4e
108
	out	dx, al
109
	inc	edx
110
	mov	al, 2
111
	out	dx, al
112
 
113
	dec	edx		; Получаем старший байт температуры (градусы)
114
	mov	al, 0x50
115
	out	dx, al
116
	inc	edx
117
	in	al, dx
118
	mov	[temps + 4], al
119
	dec	edx		; Получаем младший байт температуры  (0.5`C)
120
	mov	al, 0x51
121
	out	dx, al
122
	inc	edx
123
	in	al, dx		; if al == 0 then 0.0, else 0.5
124
	cmp	al, 0
125
	je	@f
126
	mov	al, 5
127
@@:	mov	[temps + 5], al
128
	; Проверка температуры, датчики с 127.5`C не используются
129
	mov	ecx, 3
130
	mov	esi, temps
131
wb_check_temp:
132
	cmp	word[esi + ecx * 2 - 2], 0x057F
133
	jne	wb_temp_ok
134
	mov	word[esi + ecx * 2 - 2], 0
135
wb_temp_ok:
136
	loop	wb_check_temp
137
 
138
	ret
139
;-----------------------------------
140
wb_get_fan_speed:
141
	; fan1
142
	mov	al, 0x47
143
	mov	dx, 0x295
144
	out	dx, al
145
	inc	edx
146
	in	al, dx
147
	and	al, 0x30
148
	shr	al, 4
149
	mov	ebx, 1
150
	mov	cl, al
151
	shl	ebx, cl	; <- div1
152
	dec	edx
153
	mov	al, 0x28
154
	out	dx, al
155
	inc	edx
156
	xor	eax, eax
157
	in	al, dx
158
	cmp	al, 255
159
	jne	@f
160
	xor	eax, eax
161
	ret
162
@@:	mul	ebx
163
	mov	ebx, eax
164
	mov	eax, 1350000
165
	xor	edx, edx
166
	div	ebx
167
	mov	[rpms], eax
168
 
169
	mov	al, 0x47
170
	mov	dx, 0x295
171
	out	dx, al
172
	inc	edx
173
	in	al, dx
174
	shr	al, 6
175
	mov	ebx, 1
176
	mov	cl, al
177
	shl	ebx, cl	; <- div2
178
	dec	edx
179
	mov	al, 0x29
180
	out	dx, al
181
	inc	edx
182
	xor	eax, eax
183
	in	al, dx
184
	cmp	al, 255
185
	jne	@f
186
	xor	eax, eax
187
	ret
188
@@:	mul	ebx
189
	mov	ebx, eax
190
	mov	eax, 1350000
191
	xor	edx, edx
192
	div	ebx
193
	mov	[rpms + 4], eax
194
	ret
195
;-----------------------------------
196
wb_get_volt:
197
	mov	dx, 0x295
198
	;mov	edi, vcoeff		; <-- possible differences for miscellaneous chip
199
	mov	esi, Vcore
200
	xor	ecx, ecx
201
@@:	mov	eax, ecx
202
	add	al, 0x20
203
	out	dx, al
204
	inc	edx
205
	in	al, dx
206
	fld	dword [edi + ecx * 4]
207
	push	eax
208
	fild	dword [esp]
209
	fmulp	st1, st0
210
	fstp	dword [esi + ecx * 4]
211
	pop	eax
212
	inc	ecx
213
	dec	edx
214
	cmp	ecx, 7
215
	jb	@b
216
	ret
217
 
218
wb_coeff:	dd 0.016		; Vcore
219
		dd 0.016		; Vin0
220
		dd 0.016		; Vin1 (+3.3V)
221
		dd 0.02688		; AVcc (+5V)
222
		dd 0.0608		; Vin2 (+12V)
223
		dd 0.0822857142857145	; -12V
224
		dd -0.02408		; -5V ; false
225
 
226
wb_n12v_const	dd -14.9142857142857
227
;-----------------------------------
228
wb_get_name:
229
; Возвращает имя чипа
230
; Out : EDX - pointer to string (size:string - Pascal style)
231
	mov	al, [wb_chip_id]
232
	and	al, 0xFE	; 0x20 = 0x21, 0x60 = 0x61, etc
233
	mov	edx, msg_wb27HF
234
	cmp	al, 0x20
235
	je	@f
236
	mov	edx, msg_wb27THF
237
	cmp	al, 0x90
238
	je	@f
239
	mov	edx, msg_wb37THF
240
	cmp	al, 0x80
241
	je	@f
242
	mov	edx, msg_wb97HF
243
	cmp	al, 0x60
244
	je	@f
245
	mov	edx, msg_wb27EHF
246
	cmp	al, 0x88
247
	je	@f
248
	mov	edx, msg_wb27THFA
249
	cmp	al, 0x1A
250
	je	@f
251
	mov	edx, msg_wbunk
252
@@:	ret
253