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