Rev 2434 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
431 | serge | 1 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
2 | ;; ;; |
||
2465 | Serge | 3 | ;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; |
431 | serge | 4 | ;; Distributed under terms of the GNU General Public License ;; |
5 | ;; ;; |
||
6 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
||
168 | serge | 7 | |
572 | serge | 8 | |
9 | AD_LOSEL equ BIT5 |
||
10 | AD_HPSEL equ BIT10 |
||
11 | |||
168 | serge | 12 | align 4 |
13 | proc detect_codec |
||
2434 | Serge | 14 | locals |
15 | codec_id dd ? |
||
16 | endl |
||
168 | serge | 17 | |
2434 | Serge | 18 | stdcall codec_read, dword 0x7C |
19 | shl eax, 16 |
||
20 | mov [codec_id], eax |
||
168 | serge | 21 | |
2434 | Serge | 22 | stdcall codec_read, dword 0x7E |
23 | or eax, [codec_id] |
||
168 | serge | 24 | |
2434 | Serge | 25 | mov [codec.chip_id], eax |
26 | and eax, 0xFFFFFF00 |
||
168 | serge | 27 | |
2434 | Serge | 28 | mov edi, codecs |
168 | serge | 29 | @@: |
2434 | Serge | 30 | mov ebx, [edi] |
31 | test ebx, ebx |
||
32 | jz .unknown |
||
168 | serge | 33 | |
2434 | Serge | 34 | cmp eax, ebx |
35 | jne .next |
||
36 | mov eax, [edi+4] |
||
37 | mov [codec.ac_vendor_ids], eax |
||
38 | mov esi, eax |
||
39 | call SysMsgBoardStr |
||
40 | stdcall detect_chip, [edi+8] |
||
562 | serge | 41 | |
2434 | Serge | 42 | ret |
168 | serge | 43 | .next: |
2434 | Serge | 44 | add edi, 12 |
45 | jmp @B |
||
168 | serge | 46 | .unknown: |
2434 | Serge | 47 | mov [codec.ac_vendor_ids], ac_unknown |
48 | mov [codec.chip_ids], chip_unknown |
||
562 | serge | 49 | |
2434 | Serge | 50 | mov esi, chip_unknown |
51 | call SysMsgBoardStr |
||
52 | mov eax, [codec.chip_id] |
||
53 | call dword2str |
||
54 | call SysMsgBoardStr |
||
55 | ret |
||
168 | serge | 56 | endp |
57 | |||
58 | align 4 |
||
59 | proc detect_chip stdcall, chip_tab:dword |
||
60 | |||
2434 | Serge | 61 | mov eax, [codec.chip_id] |
62 | and eax, 0xFF |
||
168 | serge | 63 | |
2434 | Serge | 64 | mov edi, [chip_tab] |
168 | serge | 65 | @@: |
2434 | Serge | 66 | mov ebx, [edi] |
67 | cmp ebx, 0xFF |
||
68 | je .unknown |
||
168 | serge | 69 | |
2434 | Serge | 70 | cmp eax, ebx |
71 | jne .next |
||
72 | mov eax, [edi+4] |
||
73 | mov [codec.chip_ids], eax |
||
74 | mov esi, eax |
||
75 | call SysMsgBoardStr |
||
76 | ret |
||
168 | serge | 77 | .next: |
2434 | Serge | 78 | add edi, 8 |
79 | jmp @b |
||
168 | serge | 80 | .unknown: |
2434 | Serge | 81 | mov [codec.chip_ids], chip_unknown |
82 | mov esi, chip_unknown |
||
83 | call SysMsgBoardStr |
||
84 | mov eax, [codec.chip_id] |
||
85 | call dword2str |
||
86 | call SysMsgBoardStr |
||
87 | ret |
||
168 | serge | 88 | endp |
89 | |||
90 | align 4 |
||
91 | proc setup_codec |
||
92 | |||
2434 | Serge | 93 | xor eax, eax |
94 | stdcall codec_write, dword CODEC_AUX_VOL |
||
168 | serge | 95 | |
2434 | Serge | 96 | mov eax, 0x0B0B |
97 | stdcall codec_write, dword CODEC_MASTER_VOL_REG |
||
168 | serge | 98 | |
2434 | Serge | 99 | mov ax, 0x08 |
100 | stdcall codec_write, dword 0x0C |
||
168 | serge | 101 | |
2434 | Serge | 102 | mov ax, 0x0808 |
103 | stdcall codec_write, dword CODEC_PCM_OUT_REG |
||
168 | serge | 104 | |
2434 | Serge | 105 | mov ax, 0x0808 |
106 | stdcall codec_write, dword 0x10 |
||
168 | serge | 107 | |
2434 | Serge | 108 | mov ax, 0x0808 |
109 | stdcall codec_write, dword 0x12 |
||
168 | serge | 110 | |
2434 | Serge | 111 | mov ax, 0x0808 |
112 | stdcall codec_write, dword 0x16 |
||
168 | serge | 113 | |
114 | |||
2434 | Serge | 115 | stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG |
116 | and eax, 0FFFFh - BIT1 ; clear DRA (BIT1) |
||
117 | or eax, BIT0 ; set VRA (BIT0) |
||
118 | stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG |
||
168 | serge | 119 | |
2434 | Serge | 120 | stdcall set_sample_rate, dword 48000 |
168 | serge | 121 | |
122 | .init_error: |
||
2434 | Serge | 123 | xor eax, eax ; exit with error |
124 | ret |
||
168 | serge | 125 | endp |
126 | |||
378 | serge | 127 | |
128 | ; param |
||
129 | ; eax= volume -10000 - 0 for both channels |
||
130 | |||
168 | serge | 131 | align 4 |
378 | serge | 132 | set_master_vol: |
2434 | Serge | 133 | cmp eax, 0 |
134 | jl @F |
||
135 | xor eax, eax |
||
136 | jmp .set |
||
168 | serge | 137 | @@: |
2434 | Serge | 138 | cmp eax, -9450 |
139 | jg .set |
||
140 | mov eax, -9450 ;clamp into 6 bits |
||
378 | serge | 141 | .set: |
2434 | Serge | 142 | cdq |
143 | mov ebx, -150 |
||
144 | idiv ebx |
||
145 | mov ah, al |
||
146 | stdcall codec_write, dword CODEC_MASTER_VOL_REG |
||
147 | xor eax, eax |
||
148 | ret |
||
168 | serge | 149 | |
150 | align 4 |
||
151 | proc get_master_vol stdcall, pvol:dword |
||
152 | |||
2434 | Serge | 153 | stdcall codec_read, dword CODEC_MASTER_VOL_REG |
154 | and eax, 0x3F |
||
155 | imul eax, -150 |
||
156 | mov ebx, [pvol] |
||
157 | mov [ebx], eax |
||
158 | xor eax, eax |
||
159 | ret |
||
168 | serge | 160 | endp |
161 | |||
162 | align 4 |
||
163 | proc set_sample_rate stdcall, rate:dword |
||
2434 | Serge | 164 | mov eax, [rate] |
165 | stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG |
||
166 | ret |
||
168 | serge | 167 | endp |
168 | |||
572 | serge | 169 | patch_AD: |
2434 | Serge | 170 | stdcall codec_read, 0x76 |
171 | or ax, BIT5+BIT10 |
||
172 | stdcall codec_write, 0x76 |
||
173 | ret |
||
572 | serge | 174 | |
175 | |||
168 | serge | 176 | align 16 |
177 | ac_unknown db 'unknown manufacturer',13,10,0 |
||
178 | ac_Realtek db 'Realtek Semiconductor',13,10,0 |
||
179 | ac_Analog db 'Analog Devices',13,10,0 |
||
180 | ac_CMedia db 'C-Media Electronics',13,10,0 |
||
563 | serge | 181 | ac_Cirrus db 'Cirrus Logic',13,10,0 |
1340 | tsdima | 182 | ac_Wolfson db 'Wolfson Microelectronics',13,10,0 |
2434 | Serge | 183 | ac_VIA db 'VIA Technologies',13,10,0 |
1546 | Asper | 184 | ac_SigmaTel db 'SigmaTel',13,10,0 |
185 | ac_eMicro db 'eMicro',13,10,0 |
||
563 | serge | 186 | |
562 | serge | 187 | chip_unknown db 'unknown codec id ', 0 |
168 | serge | 188 | |
189 | CHIP_ANALOG equ 0x41445300 |
||
190 | CHIP_REALTEK equ 0x414C4700 |
||
191 | CHIP_CMEDIA equ 0x434D4900 |
||
563 | serge | 192 | CHIP_CIRRUS equ 0x43525900 |
1340 | tsdima | 193 | CHIP_WOLFSON equ 0x574D4C00 |
1546 | Asper | 194 | CHIP_VIA equ 0x56494100 |
195 | CHIP_SIGMATEL equ 0x83847600 |
||
196 | CHIP_EMICRO equ 0x454D4300 |
||
168 | serge | 197 | |
198 | align 16 |
||
2434 | Serge | 199 | codecs dd CHIP_ANALOG, ac_Analog, chips_Analog |
200 | dd CHIP_CMEDIA, ac_CMedia, chips_CMedia |
||
201 | dd CHIP_REALTEK,ac_Realtek, chips_Realtek |
||
202 | dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus |
||
203 | dd CHIP_WOLFSON,ac_Wolfson, chips_Wolfson |
||
204 | dd CHIP_VIA, ac_VIA, chips_VIA |
||
205 | dd CHIP_SIGMATEL, ac_SigmaTel, chips_SigmaTel |
||
206 | dd CHIP_EMICRO, ac_eMicro, chips_eMicro |
||
207 | dd 0 |
||
168 | serge | 208 | |
209 | align 16 |
||
210 | chips_Analog dd 0x03, chip_AD1819 |
||
2434 | Serge | 211 | dd 0x40, chip_AD1881 |
212 | dd 0x48, chip_AD1881A |
||
213 | dd 0x60, chip_AD1884 |
||
214 | dd 0x61, chip_AD1886 |
||
215 | dd 0x62, chip_AD1887 |
||
216 | dd 0x63, chip_AD1886A |
||
217 | dd 0x70, chip_AD1980 |
||
218 | dd 0x72, chip_AD1981A |
||
219 | dd 0x74, chip_AD1981B |
||
220 | dd 0x75, chip_AD1985 |
||
221 | dd 0xFF |
||
168 | serge | 222 | |
562 | serge | 223 | chips_Realtek: |
2434 | Serge | 224 | dd 0x10, chip_ALC201a |
225 | dd 0x20, chip_ALC650 |
||
226 | dd 0x21, chip_ALC650D |
||
227 | dd 0x22, chip_ALC650E |
||
228 | dd 0x23, chip_ALC650F |
||
229 | dd 0x60, chip_ALC655 |
||
230 | dd 0x80, chip_ALC658 |
||
231 | dd 0x81, chip_ALC658D |
||
232 | dd 0x90, chip_ALC850 |
||
233 | dd 0xFF |
||
168 | serge | 234 | |
235 | chips_CMedia dd 0x41, chip_CM9738 |
||
2434 | Serge | 236 | dd 0x61, chip_CM9739 |
237 | dd 0x69, chip_CM9780 |
||
238 | dd 0x78, chip_CM9761 |
||
239 | dd 0x82, chip_CM9761 |
||
240 | dd 0x83, chip_CM9761 |
||
241 | dd 0xFF |
||
168 | serge | 242 | |
563 | serge | 243 | chips_Cirrus dd 0x00, chip_CS4297 |
2434 | Serge | 244 | dd 0x10, chip_CS4297A |
245 | dd 0x20, chip_CS4298 |
||
246 | dd 0x28, chip_CS4294 |
||
247 | dd 0x30, chip_CS4299 |
||
248 | dd 0x34, chip_CS4299D |
||
249 | dd 0x48, chip_CS4201 |
||
250 | dd 0x58, chip_CS4205 |
||
251 | dd 0x60, chip_CS4291 |
||
252 | dd 0x70, chip_CS4202 |
||
253 | dd 0xFF |
||
563 | serge | 254 | |
1340 | tsdima | 255 | chips_Wolfson dd 0x00, chip_WM9700 |
2434 | Serge | 256 | dd 0x03, chip_WM9703 |
257 | dd 0x04, chip_WM9704 |
||
258 | dd 0xFF |
||
563 | serge | 259 | |
1546 | Asper | 260 | chips_VIA dd 0x61, chip_VIA1612A |
2434 | Serge | 261 | dd 0xFF |
1546 | Asper | 262 | |
263 | chips_SigmaTel dd 0x58, chip_STAC9758 |
||
2434 | Serge | 264 | dd 0xFF |
1546 | Asper | 265 | |
266 | chips_eMicro dd 0x28, chip_EM28028 |
||
2434 | Serge | 267 | dd 0xFF |
1546 | Asper | 268 | |
168 | serge | 269 | align 16 |
270 | ;Analog Devices |
||
2434 | Serge | 271 | chip_AD1819 db 'AD1819 ',0dh,0ah,00h |
272 | chip_AD1881 db 'AD1881 ',0dh,0ah,00h |
||
273 | chip_AD1881A db 'AD1881A',0dh,0ah,00h |
||
274 | chip_AD1884 db 'AD1885 ',0dh,0ah,00h |
||
275 | chip_AD1885 db 'AD1885 ',0dh,0ah,00h |
||
276 | chip_AD1886 db 'AD1886 ',0dh,0ah,00h |
||
277 | chip_AD1886A db 'AD1886A',0dh,0ah,00h |
||
278 | chip_AD1887 db 'AD1887 ',0dh,0ah,00h |
||
279 | chip_AD1980 db 'AD1980 ',0dh,0ah,00h |
||
280 | chip_AD1981A db 'AD1981A',0dh,0ah,00h |
||
281 | chip_AD1981B db 'AD1981B',0dh,0ah,00h |
||
282 | chip_AD1985 db 'AD1985 ',0dh,0ah,00h |
||
168 | serge | 283 | |
284 | ;Realtek |
||
2434 | Serge | 285 | chip_ALC201a db 'ALC201a',0dh,0ah,00h |
286 | chip_ALC650 db 'ALC650 ',0dh,0ah,00h |
||
287 | chip_ALC650D db 'ALC650D',0dh,0ah,00h |
||
288 | chip_ALC650E db 'ALC650E',0dh,0ah,00h |
||
289 | chip_ALC650F db 'ALC650F',0dh,0ah,00h |
||
290 | chip_ALC655 db 'ALC655 ',0dh,0ah,00h |
||
291 | chip_ALC658 db 'ALC658 ',0dh,0ah,00h |
||
292 | chip_ALC658D db 'ALC658D',0dh,0ah,00h |
||
293 | chip_ALC850 db 'ALC850 ',0dh,0ah,00h |
||
168 | serge | 294 | |
295 | ;CMedia |
||
2434 | Serge | 296 | chip_CM9738 db 'CMI9738', 0dh,0ah,0 |
297 | chip_CM9739 db 'CMI9739', 0dh,0ah,0 |
||
298 | chip_CM9780 db 'CMI9780', 0dh,0ah,0 |
||
299 | chip_CM9761 db 'CMI9761', 0dh,0ah,0 |
||
168 | serge | 300 | |
563 | serge | 301 | ;Cirrus |
2434 | Serge | 302 | chip_CS4297 db 'CS4297',13,10,0 |
303 | chip_CS4297A db 'CS4297A',13,10,0 |
||
304 | chip_CS4298 db 'CS4298',13,10,0 |
||
305 | chip_CS4294 db 'CS4294',13,10,0 |
||
306 | chip_CS4299 db 'CS4299',13,10,0 |
||
307 | chip_CS4299D db 'CS4299D',13,10,0 |
||
308 | chip_CS4201 db 'CS4201',13,10,0 |
||
309 | chip_CS4205 db 'CS4205',13,10,0 |
||
310 | chip_CS4291 db 'CS4291',13,10,0 |
||
311 | chip_CS4202 db 'CS4202',13,10,0 |
||
563 | serge | 312 | |
1340 | tsdima | 313 | ;Wolfson |
2434 | Serge | 314 | chip_WM9700 db 'WM9704',13,10,0 |
315 | chip_WM9703 db 'WM9703/9704',13,10,0 |
||
316 | chip_WM9704 db 'WM9704 (quad)',13,10,0 |
||
1546 | Asper | 317 | |
318 | ;VIA |
||
2434 | Serge | 319 | chip_VIA1612A db 'VIA1612A',13,10,0 |
1546 | Asper | 320 | |
321 | ;SigmaTel |
||
2434 | Serge | 322 | chip_STAC9758 db 'STAC9758,59',13,10,0 |
1546 | Asper | 323 | |
324 | ;eMicro |
||
2434 | Serge | 325 | chip_EM28028 db 'EM28028',13,10,0 |
1546 | Asper | 326 |