Subversion Repositories Kolibri OS

Rev

Go to most recent revision | 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