Subversion Repositories Kolibri OS

Rev

Rev 168 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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