Subversion Repositories Kolibri OS

Rev

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