Subversion Repositories Kolibri OS

Rev

Rev 563 | 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
562 serge 14
           locals
15
             codec_id dd ?
16
           endl
168 serge 17
 
562 serge 18
           stdcall codec_read, dword 0x7C
19
           shl eax, 16
20
           mov [codec_id], eax
168 serge 21
 
562 serge 22
           stdcall codec_read, dword 0x7E
23
           or eax, [codec_id]
168 serge 24
 
562 serge 25
           mov [codec.chip_id], eax
26
           and eax, 0xFFFFFF00
168 serge 27
 
562 serge 28
           mov edi, codecs
168 serge 29
@@:
562 serge 30
           mov ebx, [edi]
31
           test ebx, ebx
32
           jz .unknown
168 serge 33
 
562 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]
41
 
42
           ret
168 serge 43
.next:
562 serge 44
           add edi, 12
45
           jmp @B
168 serge 46
.unknown:
562 serge 47
           mov [codec.ac_vendor_ids], ac_unknown
48
           mov [codec.chip_ids], chip_unknown
49
 
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
 
562 serge 61
           mov eax, [codec.chip_id]
62
           and eax, 0xFF
168 serge 63
 
562 serge 64
           mov edi, [chip_tab]
168 serge 65
@@:
562 serge 66
           mov ebx, [edi]
563 serge 67
           cmp ebx, 0xFF
68
           je .unknown
168 serge 69
 
562 serge 70
           cmp eax,ebx
71
           jne .next
72
           mov eax, [edi+4]
73
           mov [codec.chip_ids], eax
563 serge 74
           mov esi, eax
75
           call SysMsgBoardStr
562 serge 76
           ret
168 serge 77
.next:
562 serge 78
           add edi, 8
79
           jmp @b
168 serge 80
.unknown:
562 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
 
562 serge 93
           xor eax, eax
94
           stdcall codec_write, dword CODEC_AUX_VOL
168 serge 95
 
562 serge 96
           mov eax, 0x0B0B
97
           stdcall codec_write, dword CODEC_MASTER_VOL_REG
168 serge 98
 
562 serge 99
           mov ax, 0x08
100
           stdcall codec_write, dword 0x0C
168 serge 101
 
562 serge 102
           mov ax, 0x0808
103
           stdcall codec_write, dword CODEC_PCM_OUT_REG
168 serge 104
 
562 serge 105
           mov ax, 0x0808
106
           stdcall codec_write, dword 0x10
168 serge 107
 
562 serge 108
           mov ax, 0x0808
109
           stdcall codec_write, dword 0x12
168 serge 110
 
562 serge 111
           mov ax, 0x0808
112
           stdcall codec_write, dword 0x16
168 serge 113
 
114
 
562 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
 
562 serge 120
           stdcall set_sample_rate, dword 48000
168 serge 121
 
122
.init_error:
562 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:
133
           cmp eax, 0
134
           jl @F
135
           xor eax, eax
136
           jmp .set
168 serge 137
@@:
378 serge 138
           cmp eax, -9450
139
           jg .set
140
           mov eax, -9450     ;clamp into 6 bits
141
.set:
142
           cdq
143
           mov ebx, -150
144
           idiv ebx
145
           mov ah, al
562 serge 146
           stdcall codec_write, dword CODEC_MASTER_VOL_REG
378 serge 147
           xor eax, eax
562 serge 148
           ret
168 serge 149
 
150
align 4
151
proc get_master_vol stdcall, pvol:dword
152
 
562 serge 153
           stdcall codec_read, dword CODEC_MASTER_VOL_REG
154
           and eax, 0x3F
378 serge 155
           imul eax, -150
168 serge 156
           mov ebx, [pvol]
157
           mov [ebx], eax
378 serge 158
           xor eax, eax
562 serge 159
           ret
168 serge 160
endp
161
 
162
align 4
163
proc set_sample_rate stdcall, rate:dword
562 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:
170
           stdcall codec_read, 0x76
171
           or ax, BIT5+BIT10
172
           stdcall codec_write, 0x76
173
           ret
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
183
 
562 serge 184
chip_unknown   db 'unknown codec id ', 0
168 serge 185
 
186
CHIP_ANALOG    equ 0x41445300
187
CHIP_REALTEK   equ 0x414C4700
188
CHIP_CMEDIA    equ 0x434D4900
563 serge 189
CHIP_CIRRUS    equ 0x43525900
168 serge 190
 
191
align 16
563 serge 192
codecs         dd CHIP_ANALOG, ac_Analog,  chips_Analog
562 serge 193
               dd CHIP_CMEDIA, ac_CMedia,  chips_CMedia
194
               dd CHIP_REALTEK,ac_Realtek, chips_Realtek
563 serge 195
               dd CHIP_CIRRUS, ac_Cirrus,  chips_Cirrus
196
               dd 0
168 serge 197
 
198
align 16
199
chips_Analog   dd 0x03, chip_AD1819
562 serge 200
               dd 0x40, chip_AD1881
201
               dd 0x48, chip_AD1881A
202
               dd 0x60, chip_AD1884
203
               dd 0x61, chip_AD1886
204
               dd 0x62, chip_AD1887
205
               dd 0x63, chip_AD1886A
206
               dd 0x70, chip_AD1980
207
               dd 0x75, chip_AD1985
563 serge 208
               dd 0xFF
168 serge 209
 
562 serge 210
chips_Realtek:
211
               dd 0x20, chip_ALC650
212
               dd 0x21, chip_ALC650D
213
               dd 0x22, chip_ALC650E
214
               dd 0x23, chip_ALC650F
215
               dd 0x60, chip_ALC655
216
               dd 0x80, chip_ALC658
217
               dd 0x81, chip_ALC658D
218
               dd 0x90, chip_ALC850
563 serge 219
               dd 0xFF
168 serge 220
 
221
chips_CMedia   dd 0x41, chip_CM9738
562 serge 222
               dd 0x61, chip_CM9739
223
               dd 0x69, chip_CM9780
224
               dd 0x78, chip_CM9761
225
               dd 0x82, chip_CM9761
226
               dd 0x83, chip_CM9761
563 serge 227
               dd 0xFF
168 serge 228
 
563 serge 229
chips_Cirrus   dd 0x00, chip_CS4297
230
               dd 0x10, chip_CS4297A
231
               dd 0x20, chip_CS4298
232
               dd 0x28, chip_CS4294
233
               dd 0x30, chip_CS4299
234
               dd 0x34, chip_CS4299D
235
               dd 0x48, chip_CS4201
236
               dd 0x58, chip_CS4205
237
               dd 0x60, chip_CS4291
238
               dd 0x70, chip_CS4202
239
               dd 0xFF
240
 
241
 
168 serge 242
align 16
243
;Analog Devices
244
chip_AD1819      db 'AD1819 ',0dh,0ah,00h
245
chip_AD1881      db 'AD1881 ',0dh,0ah,00h
246
chip_AD1881A     db 'AD1881A',0dh,0ah,00h
247
chip_AD1884      db 'AD1885 ',0dh,0ah,00h
248
chip_AD1885      db 'AD1885 ',0dh,0ah,00h
249
chip_AD1886      db 'AD1886 ',0dh,0ah,00h
250
chip_AD1886A     db 'AD1886A',0dh,0ah,00h
251
chip_AD1887      db 'AD1887 ',0dh,0ah,00h
252
chip_AD1980      db 'AD1980 ',0dh,0ah,00h
253
chip_AD1985      db 'AD1985 ',0dh,0ah,00h
254
 
255
;Realtek
563 serge 256
chip_ALC650      db 'ALC650 ',0dh,0ah,00h
257
chip_ALC650D     db 'ALC650D',0dh,0ah,00h
258
chip_ALC650E     db 'ALC650E',0dh,0ah,00h
259
chip_ALC650F     db 'ALC650F',0dh,0ah,00h
260
chip_ALC655      db 'ALC655 ',0dh,0ah,00h
261
chip_ALC658      db 'ALC658 ',0dh,0ah,00h
262
chip_ALC658D     db 'ALC658D',0dh,0ah,00h
263
chip_ALC850      db 'ALC850 ',0dh,0ah,00h
168 serge 264
 
265
;CMedia
563 serge 266
chip_CM9738      db 'CMI9738', 0dh,0ah,0
267
chip_CM9739      db 'CMI9739', 0dh,0ah,0
268
chip_CM9780      db 'CMI9780', 0dh,0ah,0
269
chip_CM9761      db 'CMI9761', 0dh,0ah,0
168 serge 270
 
563 serge 271
;Cirrus
272
chip_CS4297      db 'CS4297',13,10,0
273
chip_CS4297A     db 'CS4297A',13,10,0
274
chip_CS4298      db 'CS4298',13,10,0
275
chip_CS4294      db 'CS4294',13,10,0
276
chip_CS4299      db 'CS4299',13,10,0
277
chip_CS4299D     db 'CS4299D',13,10,0
278
chip_CS4201      db 'CS4201',13,10,0
279
chip_CS4205      db 'CS4205',13,10,0
280
chip_CS4291      db 'CS4291',13,10,0
281
chip_CS4202      db 'CS4202',13,10,0
282