forked from KolibriOS/kolibrios
new sound driver added
git-svn-id: svn://kolibrios.org@1340 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
9eba566c5c
commit
21ee3e96a8
@ -11,117 +11,117 @@ AD_HPSEL equ BIT10
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc detect_codec
|
proc detect_codec
|
||||||
locals
|
locals
|
||||||
codec_id dd ?
|
codec_id dd ?
|
||||||
endl
|
endl
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7C
|
stdcall codec_read, dword 0x7C
|
||||||
shl eax, 16
|
shl eax, 16
|
||||||
mov [codec_id], eax
|
mov [codec_id], eax
|
||||||
|
|
||||||
stdcall codec_read, dword 0x7E
|
stdcall codec_read, dword 0x7E
|
||||||
or eax, [codec_id]
|
or eax, [codec_id]
|
||||||
|
|
||||||
mov [codec.chip_id], eax
|
mov [codec.chip_id], eax
|
||||||
and eax, 0xFFFFFF00
|
and eax, 0xFFFFFF00
|
||||||
|
|
||||||
mov edi, codecs
|
mov edi, codecs
|
||||||
@@:
|
@@:
|
||||||
mov ebx, [edi]
|
mov ebx, [edi]
|
||||||
test ebx, ebx
|
test ebx, ebx
|
||||||
jz .unknown
|
jz .unknown
|
||||||
|
|
||||||
cmp eax, ebx
|
cmp eax, ebx
|
||||||
jne .next
|
jne .next
|
||||||
mov eax, [edi+4]
|
mov eax, [edi+4]
|
||||||
mov [codec.ac_vendor_ids], eax
|
mov [codec.ac_vendor_ids], eax
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
stdcall detect_chip, [edi+8]
|
stdcall detect_chip, [edi+8]
|
||||||
|
|
||||||
ret
|
ret
|
||||||
.next:
|
.next:
|
||||||
add edi, 12
|
add edi, 12
|
||||||
jmp @B
|
jmp @B
|
||||||
.unknown:
|
.unknown:
|
||||||
mov [codec.ac_vendor_ids], ac_unknown
|
mov [codec.ac_vendor_ids], ac_unknown
|
||||||
mov [codec.chip_ids], chip_unknown
|
mov [codec.chip_ids], chip_unknown
|
||||||
|
|
||||||
mov esi, chip_unknown
|
mov esi, chip_unknown
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
mov eax, [codec.chip_id]
|
mov eax, [codec.chip_id]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc detect_chip stdcall, chip_tab:dword
|
proc detect_chip stdcall, chip_tab:dword
|
||||||
|
|
||||||
mov eax, [codec.chip_id]
|
mov eax, [codec.chip_id]
|
||||||
and eax, 0xFF
|
and eax, 0xFF
|
||||||
|
|
||||||
mov edi, [chip_tab]
|
mov edi, [chip_tab]
|
||||||
@@:
|
@@:
|
||||||
mov ebx, [edi]
|
mov ebx, [edi]
|
||||||
cmp ebx, 0xFF
|
cmp ebx, 0xFF
|
||||||
je .unknown
|
je .unknown
|
||||||
|
|
||||||
cmp eax,ebx
|
cmp eax,ebx
|
||||||
jne .next
|
jne .next
|
||||||
mov eax, [edi+4]
|
mov eax, [edi+4]
|
||||||
mov [codec.chip_ids], eax
|
mov [codec.chip_ids], eax
|
||||||
mov esi, eax
|
mov esi, eax
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
.next:
|
.next:
|
||||||
add edi, 8
|
add edi, 8
|
||||||
jmp @b
|
jmp @b
|
||||||
.unknown:
|
.unknown:
|
||||||
mov [codec.chip_ids], chip_unknown
|
mov [codec.chip_ids], chip_unknown
|
||||||
mov esi, chip_unknown
|
mov esi, chip_unknown
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
mov eax, [codec.chip_id]
|
mov eax, [codec.chip_id]
|
||||||
call dword2str
|
call dword2str
|
||||||
call SysMsgBoardStr
|
call SysMsgBoardStr
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc setup_codec
|
proc setup_codec
|
||||||
|
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
stdcall codec_write, dword CODEC_AUX_VOL
|
stdcall codec_write, dword CODEC_AUX_VOL
|
||||||
|
|
||||||
mov eax, 0x0B0B
|
mov eax, 0x0B0B
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
||||||
|
|
||||||
mov ax, 0x08
|
mov ax, 0x08
|
||||||
stdcall codec_write, dword 0x0C
|
stdcall codec_write, dword 0x0C
|
||||||
|
|
||||||
mov ax, 0x0808
|
mov ax, 0x0808
|
||||||
stdcall codec_write, dword CODEC_PCM_OUT_REG
|
stdcall codec_write, dword CODEC_PCM_OUT_REG
|
||||||
|
|
||||||
mov ax, 0x0808
|
mov ax, 0x0808
|
||||||
stdcall codec_write, dword 0x10
|
stdcall codec_write, dword 0x10
|
||||||
|
|
||||||
mov ax, 0x0808
|
mov ax, 0x0808
|
||||||
stdcall codec_write, dword 0x12
|
stdcall codec_write, dword 0x12
|
||||||
|
|
||||||
mov ax, 0x0808
|
mov ax, 0x0808
|
||||||
stdcall codec_write, dword 0x16
|
stdcall codec_write, dword 0x16
|
||||||
|
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
|
stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
|
||||||
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1)
|
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1)
|
||||||
or eax, BIT0 ; set VRA (BIT0)
|
or eax, BIT0 ; set VRA (BIT0)
|
||||||
stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
|
stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
|
||||||
|
|
||||||
stdcall set_sample_rate, dword 48000
|
stdcall set_sample_rate, dword 48000
|
||||||
|
|
||||||
.init_error:
|
.init_error:
|
||||||
xor eax, eax ; exit with error
|
xor eax, eax ; exit with error
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
|
|
||||||
@ -130,47 +130,47 @@ endp
|
|||||||
|
|
||||||
align 4
|
align 4
|
||||||
set_master_vol:
|
set_master_vol:
|
||||||
cmp eax, 0
|
cmp eax, 0
|
||||||
jl @F
|
jl @F
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
jmp .set
|
jmp .set
|
||||||
@@:
|
@@:
|
||||||
cmp eax, -9450
|
cmp eax, -9450
|
||||||
jg .set
|
jg .set
|
||||||
mov eax, -9450 ;clamp into 6 bits
|
mov eax, -9450 ;clamp into 6 bits
|
||||||
.set:
|
.set:
|
||||||
cdq
|
cdq
|
||||||
mov ebx, -150
|
mov ebx, -150
|
||||||
idiv ebx
|
idiv ebx
|
||||||
mov ah, al
|
mov ah, al
|
||||||
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
stdcall codec_write, dword CODEC_MASTER_VOL_REG
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc get_master_vol stdcall, pvol:dword
|
proc get_master_vol stdcall, pvol:dword
|
||||||
|
|
||||||
stdcall codec_read, dword CODEC_MASTER_VOL_REG
|
stdcall codec_read, dword CODEC_MASTER_VOL_REG
|
||||||
and eax, 0x3F
|
and eax, 0x3F
|
||||||
imul eax, -150
|
imul eax, -150
|
||||||
mov ebx, [pvol]
|
mov ebx, [pvol]
|
||||||
mov [ebx], eax
|
mov [ebx], eax
|
||||||
xor eax, eax
|
xor eax, eax
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
align 4
|
align 4
|
||||||
proc set_sample_rate stdcall, rate:dword
|
proc set_sample_rate stdcall, rate:dword
|
||||||
mov eax, [rate]
|
mov eax, [rate]
|
||||||
stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
|
stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
|
||||||
ret
|
ret
|
||||||
endp
|
endp
|
||||||
|
|
||||||
patch_AD:
|
patch_AD:
|
||||||
stdcall codec_read, 0x76
|
stdcall codec_read, 0x76
|
||||||
or ax, BIT5+BIT10
|
or ax, BIT5+BIT10
|
||||||
stdcall codec_write, 0x76
|
stdcall codec_write, 0x76
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -180,6 +180,7 @@ ac_Realtek db 'Realtek Semiconductor',13,10,0
|
|||||||
ac_Analog db 'Analog Devices',13,10,0
|
ac_Analog db 'Analog Devices',13,10,0
|
||||||
ac_CMedia db 'C-Media Electronics',13,10,0
|
ac_CMedia db 'C-Media Electronics',13,10,0
|
||||||
ac_Cirrus db 'Cirrus Logic',13,10,0
|
ac_Cirrus db 'Cirrus Logic',13,10,0
|
||||||
|
ac_Wolfson db 'Wolfson Microelectronics',13,10,0
|
||||||
|
|
||||||
chip_unknown db 'unknown codec id ', 0
|
chip_unknown db 'unknown codec id ', 0
|
||||||
|
|
||||||
@ -187,97 +188,108 @@ CHIP_ANALOG equ 0x41445300
|
|||||||
CHIP_REALTEK equ 0x414C4700
|
CHIP_REALTEK equ 0x414C4700
|
||||||
CHIP_CMEDIA equ 0x434D4900
|
CHIP_CMEDIA equ 0x434D4900
|
||||||
CHIP_CIRRUS equ 0x43525900
|
CHIP_CIRRUS equ 0x43525900
|
||||||
|
CHIP_WOLFSON equ 0x574D4C00
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
codecs dd CHIP_ANALOG, ac_Analog, chips_Analog
|
codecs dd CHIP_ANALOG, ac_Analog, chips_Analog
|
||||||
dd CHIP_CMEDIA, ac_CMedia, chips_CMedia
|
dd CHIP_CMEDIA, ac_CMedia, chips_CMedia
|
||||||
dd CHIP_REALTEK,ac_Realtek, chips_Realtek
|
dd CHIP_REALTEK,ac_Realtek, chips_Realtek
|
||||||
dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus
|
dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus
|
||||||
dd 0
|
dd CHIP_WOLFSON,ac_Wolfson, chips_Wolfson
|
||||||
|
dd 0
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
chips_Analog dd 0x03, chip_AD1819
|
chips_Analog dd 0x03, chip_AD1819
|
||||||
dd 0x40, chip_AD1881
|
dd 0x40, chip_AD1881
|
||||||
dd 0x48, chip_AD1881A
|
dd 0x48, chip_AD1881A
|
||||||
dd 0x60, chip_AD1884
|
dd 0x60, chip_AD1884
|
||||||
dd 0x61, chip_AD1886
|
dd 0x61, chip_AD1886
|
||||||
dd 0x62, chip_AD1887
|
dd 0x62, chip_AD1887
|
||||||
dd 0x63, chip_AD1886A
|
dd 0x63, chip_AD1886A
|
||||||
dd 0x70, chip_AD1980
|
dd 0x70, chip_AD1980
|
||||||
dd 0x75, chip_AD1985
|
dd 0x75, chip_AD1985
|
||||||
dd 0xFF
|
dd 0xFF
|
||||||
|
|
||||||
chips_Realtek:
|
chips_Realtek:
|
||||||
dd 0x20, chip_ALC650
|
dd 0x10, chip_ALC201a
|
||||||
dd 0x21, chip_ALC650D
|
dd 0x20, chip_ALC650
|
||||||
dd 0x22, chip_ALC650E
|
dd 0x21, chip_ALC650D
|
||||||
dd 0x23, chip_ALC650F
|
dd 0x22, chip_ALC650E
|
||||||
dd 0x60, chip_ALC655
|
dd 0x23, chip_ALC650F
|
||||||
dd 0x80, chip_ALC658
|
dd 0x60, chip_ALC655
|
||||||
dd 0x81, chip_ALC658D
|
dd 0x80, chip_ALC658
|
||||||
dd 0x90, chip_ALC850
|
dd 0x81, chip_ALC658D
|
||||||
dd 0xFF
|
dd 0x90, chip_ALC850
|
||||||
|
dd 0xFF
|
||||||
|
|
||||||
chips_CMedia dd 0x41, chip_CM9738
|
chips_CMedia dd 0x41, chip_CM9738
|
||||||
dd 0x61, chip_CM9739
|
dd 0x61, chip_CM9739
|
||||||
dd 0x69, chip_CM9780
|
dd 0x69, chip_CM9780
|
||||||
dd 0x78, chip_CM9761
|
dd 0x78, chip_CM9761
|
||||||
dd 0x82, chip_CM9761
|
dd 0x82, chip_CM9761
|
||||||
dd 0x83, chip_CM9761
|
dd 0x83, chip_CM9761
|
||||||
dd 0xFF
|
dd 0xFF
|
||||||
|
|
||||||
chips_Cirrus dd 0x00, chip_CS4297
|
chips_Cirrus dd 0x00, chip_CS4297
|
||||||
dd 0x10, chip_CS4297A
|
dd 0x10, chip_CS4297A
|
||||||
dd 0x20, chip_CS4298
|
dd 0x20, chip_CS4298
|
||||||
dd 0x28, chip_CS4294
|
dd 0x28, chip_CS4294
|
||||||
dd 0x30, chip_CS4299
|
dd 0x30, chip_CS4299
|
||||||
dd 0x34, chip_CS4299D
|
dd 0x34, chip_CS4299D
|
||||||
dd 0x48, chip_CS4201
|
dd 0x48, chip_CS4201
|
||||||
dd 0x58, chip_CS4205
|
dd 0x58, chip_CS4205
|
||||||
dd 0x60, chip_CS4291
|
dd 0x60, chip_CS4291
|
||||||
dd 0x70, chip_CS4202
|
dd 0x70, chip_CS4202
|
||||||
dd 0xFF
|
dd 0xFF
|
||||||
|
|
||||||
|
chips_Wolfson dd 0x00, chip_WM9700
|
||||||
|
dd 0x03, chip_WM9703
|
||||||
|
dd 0x04, chip_WM9704
|
||||||
|
dd 0xFF
|
||||||
|
|
||||||
align 16
|
align 16
|
||||||
;Analog Devices
|
;Analog Devices
|
||||||
chip_AD1819 db 'AD1819 ',0dh,0ah,00h
|
chip_AD1819 db 'AD1819 ',0dh,0ah,00h
|
||||||
chip_AD1881 db 'AD1881 ',0dh,0ah,00h
|
chip_AD1881 db 'AD1881 ',0dh,0ah,00h
|
||||||
chip_AD1881A db 'AD1881A',0dh,0ah,00h
|
chip_AD1881A db 'AD1881A',0dh,0ah,00h
|
||||||
chip_AD1884 db 'AD1885 ',0dh,0ah,00h
|
chip_AD1884 db 'AD1885 ',0dh,0ah,00h
|
||||||
chip_AD1885 db 'AD1885 ',0dh,0ah,00h
|
chip_AD1885 db 'AD1885 ',0dh,0ah,00h
|
||||||
chip_AD1886 db 'AD1886 ',0dh,0ah,00h
|
chip_AD1886 db 'AD1886 ',0dh,0ah,00h
|
||||||
chip_AD1886A db 'AD1886A',0dh,0ah,00h
|
chip_AD1886A db 'AD1886A',0dh,0ah,00h
|
||||||
chip_AD1887 db 'AD1887 ',0dh,0ah,00h
|
chip_AD1887 db 'AD1887 ',0dh,0ah,00h
|
||||||
chip_AD1980 db 'AD1980 ',0dh,0ah,00h
|
chip_AD1980 db 'AD1980 ',0dh,0ah,00h
|
||||||
chip_AD1985 db 'AD1985 ',0dh,0ah,00h
|
chip_AD1985 db 'AD1985 ',0dh,0ah,00h
|
||||||
|
|
||||||
;Realtek
|
;Realtek
|
||||||
chip_ALC650 db 'ALC650 ',0dh,0ah,00h
|
chip_ALC201a db 'ALC201a',0dh,0ah,00h
|
||||||
chip_ALC650D db 'ALC650D',0dh,0ah,00h
|
chip_ALC650 db 'ALC650 ',0dh,0ah,00h
|
||||||
chip_ALC650E db 'ALC650E',0dh,0ah,00h
|
chip_ALC650D db 'ALC650D',0dh,0ah,00h
|
||||||
chip_ALC650F db 'ALC650F',0dh,0ah,00h
|
chip_ALC650E db 'ALC650E',0dh,0ah,00h
|
||||||
chip_ALC655 db 'ALC655 ',0dh,0ah,00h
|
chip_ALC650F db 'ALC650F',0dh,0ah,00h
|
||||||
chip_ALC658 db 'ALC658 ',0dh,0ah,00h
|
chip_ALC655 db 'ALC655 ',0dh,0ah,00h
|
||||||
chip_ALC658D db 'ALC658D',0dh,0ah,00h
|
chip_ALC658 db 'ALC658 ',0dh,0ah,00h
|
||||||
chip_ALC850 db 'ALC850 ',0dh,0ah,00h
|
chip_ALC658D db 'ALC658D',0dh,0ah,00h
|
||||||
|
chip_ALC850 db 'ALC850 ',0dh,0ah,00h
|
||||||
|
|
||||||
;CMedia
|
;CMedia
|
||||||
chip_CM9738 db 'CMI9738', 0dh,0ah,0
|
chip_CM9738 db 'CMI9738', 0dh,0ah,0
|
||||||
chip_CM9739 db 'CMI9739', 0dh,0ah,0
|
chip_CM9739 db 'CMI9739', 0dh,0ah,0
|
||||||
chip_CM9780 db 'CMI9780', 0dh,0ah,0
|
chip_CM9780 db 'CMI9780', 0dh,0ah,0
|
||||||
chip_CM9761 db 'CMI9761', 0dh,0ah,0
|
chip_CM9761 db 'CMI9761', 0dh,0ah,0
|
||||||
|
|
||||||
;Cirrus
|
;Cirrus
|
||||||
chip_CS4297 db 'CS4297',13,10,0
|
chip_CS4297 db 'CS4297',13,10,0
|
||||||
chip_CS4297A db 'CS4297A',13,10,0
|
chip_CS4297A db 'CS4297A',13,10,0
|
||||||
chip_CS4298 db 'CS4298',13,10,0
|
chip_CS4298 db 'CS4298',13,10,0
|
||||||
chip_CS4294 db 'CS4294',13,10,0
|
chip_CS4294 db 'CS4294',13,10,0
|
||||||
chip_CS4299 db 'CS4299',13,10,0
|
chip_CS4299 db 'CS4299',13,10,0
|
||||||
chip_CS4299D db 'CS4299D',13,10,0
|
chip_CS4299D db 'CS4299D',13,10,0
|
||||||
chip_CS4201 db 'CS4201',13,10,0
|
chip_CS4201 db 'CS4201',13,10,0
|
||||||
chip_CS4205 db 'CS4205',13,10,0
|
chip_CS4205 db 'CS4205',13,10,0
|
||||||
chip_CS4291 db 'CS4291',13,10,0
|
chip_CS4291 db 'CS4291',13,10,0
|
||||||
chip_CS4202 db 'CS4202',13,10,0
|
chip_CS4202 db 'CS4202',13,10,0
|
||||||
|
|
||||||
|
|
||||||
|
;Wolfson
|
||||||
|
chip_WM9700 db 'WM9704',13,10,0
|
||||||
|
chip_WM9703 db 'WM9703/9704',13,10,0
|
||||||
|
chip_WM9704 db 'WM9704 (quad)',13,10,0
|
||||||
|
1061
kernel/trunk/drivers/fm801.asm
Normal file
1061
kernel/trunk/drivers/fm801.asm
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user