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 |
||