Subversion Repositories Kolibri OS

Rev

Rev 2434 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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