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