new sound driver added

git-svn-id: svn://kolibrios.org@1340 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
tsdima 2009-12-29 20:09:28 +00:00
parent 9eba566c5c
commit 21ee3e96a8
2 changed files with 1248 additions and 175 deletions

View File

@ -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

File diff suppressed because it is too large Load Diff