Subversion Repositories Kolibri OS

Rev

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