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