Subversion Repositories Kolibri OS

Rev

Rev 572 | 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
 
572 serge 8
 
9
AD_LOSEL   equ BIT5
10
AD_HPSEL   equ BIT10
11
 
168 serge 12
align 4
13
proc detect_codec
1340 tsdima 14
	   locals
15
	     codec_id dd ?
16
	   endl
168 serge 17
 
1340 tsdima 18
	   stdcall codec_read, dword 0x7C
19
	   shl eax, 16
20
	   mov [codec_id], eax
168 serge 21
 
1340 tsdima 22
	   stdcall codec_read, dword 0x7E
23
	   or eax, [codec_id]
168 serge 24
 
1340 tsdima 25
	   mov [codec.chip_id], eax
26
	   and eax, 0xFFFFFF00
168 serge 27
 
1340 tsdima 28
	   mov edi, codecs
168 serge 29
@@:
1340 tsdima 30
	   mov ebx, [edi]
31
	   test ebx, ebx
32
	   jz .unknown
168 serge 33
 
1340 tsdima 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
 
1340 tsdima 42
	   ret
168 serge 43
.next:
1340 tsdima 44
	   add edi, 12
45
	   jmp @B
168 serge 46
.unknown:
1340 tsdima 47
	   mov [codec.ac_vendor_ids], ac_unknown
48
	   mov [codec.chip_ids], chip_unknown
562 serge 49
 
1340 tsdima 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
 
1340 tsdima 61
	   mov eax, [codec.chip_id]
62
	   and eax, 0xFF
168 serge 63
 
1340 tsdima 64
	   mov edi, [chip_tab]
168 serge 65
@@:
1340 tsdima 66
	   mov ebx, [edi]
67
	   cmp ebx, 0xFF
68
	   je .unknown
168 serge 69
 
1340 tsdima 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:
1340 tsdima 78
	   add edi, 8
79
	   jmp @b
168 serge 80
.unknown:
1340 tsdima 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
 
1340 tsdima 93
	   xor eax, eax
94
	   stdcall codec_write, dword CODEC_AUX_VOL
168 serge 95
 
1340 tsdima 96
	   mov eax, 0x0B0B
97
	   stdcall codec_write, dword CODEC_MASTER_VOL_REG
168 serge 98
 
1340 tsdima 99
	   mov ax, 0x08
100
	   stdcall codec_write, dword 0x0C
168 serge 101
 
1340 tsdima 102
	   mov ax, 0x0808
103
	   stdcall codec_write, dword CODEC_PCM_OUT_REG
168 serge 104
 
1340 tsdima 105
	   mov ax, 0x0808
106
	   stdcall codec_write, dword 0x10
168 serge 107
 
1340 tsdima 108
	   mov ax, 0x0808
109
	   stdcall codec_write, dword 0x12
168 serge 110
 
1340 tsdima 111
	   mov ax, 0x0808
112
	   stdcall codec_write, dword 0x16
168 serge 113
 
114
 
1340 tsdima 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
 
1340 tsdima 120
	   stdcall set_sample_rate, dword 48000
168 serge 121
 
122
.init_error:
1340 tsdima 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:
1340 tsdima 133
	   cmp eax, 0
134
	   jl @F
135
	   xor eax, eax
136
	   jmp .set
168 serge 137
@@:
1340 tsdima 138
	   cmp eax, -9450
139
	   jg .set
140
	   mov eax, -9450     ;clamp into 6 bits
378 serge 141
.set:
1340 tsdima 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
 
1340 tsdima 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
1340 tsdima 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:
1340 tsdima 170
	   stdcall codec_read, 0x76
171
	   or ax, BIT5+BIT10
172
	   stdcall codec_write, 0x76
173
	   ret
572 serge 174
 
175
 
176
 
168 serge 177
align 16
178
ac_unknown     db 'unknown manufacturer',13,10,0
179
ac_Realtek     db 'Realtek Semiconductor',13,10,0
180
ac_Analog      db 'Analog Devices',13,10,0
181
ac_CMedia      db 'C-Media Electronics',13,10,0
563 serge 182
ac_Cirrus      db 'Cirrus Logic',13,10,0
1340 tsdima 183
ac_Wolfson     db 'Wolfson Microelectronics',13,10,0
563 serge 184
 
562 serge 185
chip_unknown   db 'unknown codec id ', 0
168 serge 186
 
187
CHIP_ANALOG    equ 0x41445300
188
CHIP_REALTEK   equ 0x414C4700
189
CHIP_CMEDIA    equ 0x434D4900
563 serge 190
CHIP_CIRRUS    equ 0x43525900
1340 tsdima 191
CHIP_WOLFSON   equ 0x574D4C00
168 serge 192
 
193
align 16
1340 tsdima 194
codecs	       dd CHIP_ANALOG, ac_Analog,  chips_Analog
195
	       dd CHIP_CMEDIA, ac_CMedia,  chips_CMedia
196
	       dd CHIP_REALTEK,ac_Realtek, chips_Realtek
197
	       dd CHIP_CIRRUS, ac_Cirrus,  chips_Cirrus
198
	       dd CHIP_WOLFSON,ac_Wolfson, chips_Wolfson
199
	       dd 0
168 serge 200
 
201
align 16
202
chips_Analog   dd 0x03, chip_AD1819
1340 tsdima 203
	       dd 0x40, chip_AD1881
204
	       dd 0x48, chip_AD1881A
205
	       dd 0x60, chip_AD1884
206
	       dd 0x61, chip_AD1886
207
	       dd 0x62, chip_AD1887
208
	       dd 0x63, chip_AD1886A
209
	       dd 0x70, chip_AD1980
210
	       dd 0x75, chip_AD1985
211
	       dd 0xFF
168 serge 212
 
562 serge 213
chips_Realtek:
1340 tsdima 214
	       dd 0x10, chip_ALC201a
215
	       dd 0x20, chip_ALC650
216
	       dd 0x21, chip_ALC650D
217
	       dd 0x22, chip_ALC650E
218
	       dd 0x23, chip_ALC650F
219
	       dd 0x60, chip_ALC655
220
	       dd 0x80, chip_ALC658
221
	       dd 0x81, chip_ALC658D
222
	       dd 0x90, chip_ALC850
223
	       dd 0xFF
168 serge 224
 
225
chips_CMedia   dd 0x41, chip_CM9738
1340 tsdima 226
	       dd 0x61, chip_CM9739
227
	       dd 0x69, chip_CM9780
228
	       dd 0x78, chip_CM9761
229
	       dd 0x82, chip_CM9761
230
	       dd 0x83, chip_CM9761
231
	       dd 0xFF
168 serge 232
 
563 serge 233
chips_Cirrus   dd 0x00, chip_CS4297
1340 tsdima 234
	       dd 0x10, chip_CS4297A
235
	       dd 0x20, chip_CS4298
236
	       dd 0x28, chip_CS4294
237
	       dd 0x30, chip_CS4299
238
	       dd 0x34, chip_CS4299D
239
	       dd 0x48, chip_CS4201
240
	       dd 0x58, chip_CS4205
241
	       dd 0x60, chip_CS4291
242
	       dd 0x70, chip_CS4202
243
	       dd 0xFF
563 serge 244
 
1340 tsdima 245
chips_Wolfson  dd 0x00, chip_WM9700
246
               dd 0x03, chip_WM9703
247
               dd 0x04, chip_WM9704
248
	       dd 0xFF
563 serge 249
 
168 serge 250
align 16
251
;Analog Devices
1340 tsdima 252
chip_AD1819	 db 'AD1819 ',0dh,0ah,00h
253
chip_AD1881	 db 'AD1881 ',0dh,0ah,00h
254
chip_AD1881A	 db 'AD1881A',0dh,0ah,00h
255
chip_AD1884	 db 'AD1885 ',0dh,0ah,00h
256
chip_AD1885	 db 'AD1885 ',0dh,0ah,00h
257
chip_AD1886	 db 'AD1886 ',0dh,0ah,00h
258
chip_AD1886A	 db 'AD1886A',0dh,0ah,00h
259
chip_AD1887	 db 'AD1887 ',0dh,0ah,00h
260
chip_AD1980	 db 'AD1980 ',0dh,0ah,00h
261
chip_AD1985	 db 'AD1985 ',0dh,0ah,00h
168 serge 262
 
263
;Realtek
1340 tsdima 264
chip_ALC201a	 db 'ALC201a',0dh,0ah,00h
265
chip_ALC650	 db 'ALC650 ',0dh,0ah,00h
266
chip_ALC650D	 db 'ALC650D',0dh,0ah,00h
267
chip_ALC650E	 db 'ALC650E',0dh,0ah,00h
268
chip_ALC650F	 db 'ALC650F',0dh,0ah,00h
269
chip_ALC655	 db 'ALC655 ',0dh,0ah,00h
270
chip_ALC658	 db 'ALC658 ',0dh,0ah,00h
271
chip_ALC658D	 db 'ALC658D',0dh,0ah,00h
272
chip_ALC850	 db 'ALC850 ',0dh,0ah,00h
168 serge 273
 
274
;CMedia
1340 tsdima 275
chip_CM9738	 db 'CMI9738', 0dh,0ah,0
276
chip_CM9739	 db 'CMI9739', 0dh,0ah,0
277
chip_CM9780	 db 'CMI9780', 0dh,0ah,0
278
chip_CM9761	 db 'CMI9761', 0dh,0ah,0
168 serge 279
 
563 serge 280
;Cirrus
1340 tsdima 281
chip_CS4297	 db 'CS4297',13,10,0
282
chip_CS4297A	 db 'CS4297A',13,10,0
283
chip_CS4298	 db 'CS4298',13,10,0
284
chip_CS4294	 db 'CS4294',13,10,0
285
chip_CS4299	 db 'CS4299',13,10,0
286
chip_CS4299D	 db 'CS4299D',13,10,0
287
chip_CS4201	 db 'CS4201',13,10,0
288
chip_CS4205	 db 'CS4205',13,10,0
289
chip_CS4291	 db 'CS4291',13,10,0
290
chip_CS4202	 db 'CS4202',13,10,0
563 serge 291
 
1340 tsdima 292
;Wolfson
293
chip_WM9700      db 'WM9704',13,10,0
294
chip_WM9703      db 'WM9703/9704',13,10,0
295
chip_WM9704      db 'WM9704 (quad)',13,10,0