update sis.asm

git-svn-id: svn://kolibrios.org@579 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
Sergey Semyonov (Serge) 2007-07-13 16:12:43 +00:00
parent 8f49b3612a
commit 5f63bc470b

View File

@ -12,9 +12,24 @@ include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
DEBUG equ 1 DEBUG equ 1
DEBUG_IRQ equ 0
CPU_FREQ equ 2000d ;cpu freq in MHz USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
IRQ_REMAP equ 0
IRQ_LINE equ 0
;irq 0,1,2,8,12,13 íåäîñòóïíû
; FEDCBA9876543210
VALID_IRQ equ 1100111011111000b
ATTCH_IRQ equ 0000111010100000b
if USE_COM_IRQ
ATTCH_IRQ equ 0000111010111000b
end if
CPU_FREQ equ 2600d
BIT0 EQU 0x00000001 BIT0 EQU 0x00000001
BIT1 EQU 0x00000002 BIT1 EQU 0x00000002
@ -65,13 +80,12 @@ RR equ BIT1 ; reset registers. Nukes all regs
CODEC_MASTER_VOL_REG equ 0x02 CODEC_MASTER_VOL_REG equ 0x02
CODEC_AUX_VOL equ 0x04 ; CODEC_AUX_VOL equ 0x04 ;
CODEC_PCM_OUT_REG equ 18h ; PCM output volume CODEC_PCM_OUT_REG equ 0x18 ; PCM output volume
CODEC_EXT_AUDIO_REG equ 28h ; extended audio CODEC_EXT_AUDIO_REG equ 0x28 ; extended audio
CODEC_EXT_AUDIO_CTRL_REG equ 2ah ; extended audio control CODEC_EXT_AUDIO_CTRL_REG equ 0x2a ; extended audio control
CODEC_PCM_FRONT_DACRATE_REG equ 2ch ; PCM out sample rate CODEC_PCM_FRONT_DACRATE_REG equ 0x2c ; PCM out sample rate
CODEC_PCM_SURND_DACRATE_REG equ 2eh ; surround sound sample rate CODEC_PCM_SURND_DACRATE_REG equ 0x2e ; surround sound sample rate
CODEC_PCM_LFE_DACRATE_REG equ 30h ; LFE sample rate CODEC_PCM_LFE_DACRATE_REG equ 0x30 ; LFE sample rate
GLOB_CTRL equ 0x2C ; Global Control GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status CTRL_STAT equ 0x30 ; Global Status
@ -251,9 +265,6 @@ end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
OS_BASE equ 0x80000000
SLOT_BASE equ OS_BASE+0x0080000
public START public START
public service_proc public service_proc
public version public version
@ -279,43 +290,68 @@ proc START stdcall, state:dword
call SysMsgBoardStr call SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr call SysMsgBoardStr
end if end if
call init_controller call init_controller
test eax, eax test eax, eax
jz .fail jz .fail
if DEBUG
mov esi, msgInitCodec
call SysMsgBoardStr
end if
call init_codec call init_codec
test eax, eax test eax, eax
jz .fail jz .fail
if DEBUG
mov esi, [codec.ac_vendor_ids]
call SysMsgBoardStr
mov esi, [codec.chip_ids]
call SysMsgBoardStr
end if
call reset_controller call reset_controller
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr call SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone
stdcall AttachIntHandler, [ctrl.int_line], ac97_irq
stdcall RegService, sz_sound_srv, service_proc
mov esi, msgOk
call SysMsgBoardStr call SysMsgBoardStr
if IRQ_REMAP
pushf
cli
mov ebx, [ctrl.int_line]
in al, 0xA1
mov ah, al
in al, 0x21
test ebx, ebx
jz .skip
bts ax, bx ;mask old line
.skip
bts ax, IRQ_LINE ;mask new ine
out 0x21, al
mov al, ah
out 0xA1, al
;remap IRQ
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
mov dx, 0x4d0 ;8259 ELCR1
in al, dx
bts ax, IRQ_LINE
out dx, al ;set level-triggered mode
mov [ctrl.int_line], IRQ_LINE
popf
mov esi, msgRemap
call SysMsgBoardStr
end if
mov eax, VALID_IRQ
mov ebx, [ctrl.int_line]
mov esi, msgInvIRQ
bt eax, ebx
jnc .fail_msg
mov eax, ATTCH_IRQ
mov esi, msgAttchIRQ
bt eax, ebx
jnc .fail_msg
stdcall AttachIntHandler, ebx, ac97_irq
.reg:
stdcall RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
@ -324,6 +360,10 @@ proc START stdcall, state:dword
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg:
call SysMsgBoardStr
xor eax, eax
ret
.stop: .stop:
call stop call stop
xor eax, eax xor eax, eax
@ -412,10 +452,10 @@ restore out_size
align 4 align 4
proc ac97_irq proc ac97_irq
; if DEBUG if DEBUG_IRQ
; mov esi, msgIRQ mov esi, msgIRQ
; call SysMsgBoardStr call SysMsgBoardStr
; end if end if
mov edx, PCM_OUT_CR_REG mov edx, PCM_OUT_CR_REG
mov al, 0x10 mov al, 0x10
@ -484,18 +524,25 @@ proc create_primary_buff
@@: @@:
mov [edi], eax mov [edi], eax
mov [edi+4], ebx mov [edi+4], ebx
mov [edi+32], eax mov [edi+32], eax
mov [edi+4+32], ebx mov [edi+4+32], ebx
mov [edi+64], eax mov [edi+64], eax
mov [edi+4+64], ebx mov [edi+4+64], ebx
mov [edi+96], eax mov [edi+96], eax
mov [edi+4+96], ebx mov [edi+4+96], ebx
mov [edi+128], eax mov [edi+128], eax
mov [edi+4+128], ebx mov [edi+4+128], ebx
mov [edi+160], eax mov [edi+160], eax
mov [edi+4+160], ebx mov [edi+4+160], ebx
mov [edi+192], eax mov [edi+192], eax
mov [edi+4+192], ebx mov [edi+4+192], ebx
mov [edi+224], eax mov [edi+224], eax
mov [edi+4+224], ebx mov [edi+4+224], ebx
@ -569,6 +616,7 @@ proc detect_controller
jz .next jz .next
cmp eax, -1 cmp eax, -1
je .next je .next
mov edi, devices mov edi, devices
@@: @@:
mov ebx, [edi] mov ebx, [edi]
@ -579,7 +627,6 @@ proc detect_controller
je .found je .found
add edi, 12 add edi, 12
jmp @B jmp @B
.next: .next:
inc [devfn] inc [devfn]
cmp [devfn], 256 cmp [devfn], 256
@ -626,22 +673,60 @@ proc init_controller
shr ebx, 16 shr ebx, 16
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd
call SysMsgBoardStr
call dword2str
call SysMsgBoardStr
mov esi, msgPciStat
call SysMsgBoardStr
mov eax, [ctrl.pci_stat]
call dword2str
call SysMsgBoardStr
mov esi, msgMixIsaIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
call dword2str
call SysMsgBoardStr
and eax,0xFFFE and eax,0xFFFE
mov [ctrl.codec_io_base], eax mov [ctrl.codec_io_base], eax
mov esi, msgCtrlIsaIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14 stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
call dword2str
call SysMsgBoardStr
and eax, 0xFFC0 and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
mov esi, msgMixMMIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18 stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
mov [ctrl.codec_mem_base], eax mov [ctrl.codec_mem_base], eax
call dword2str
call SysMsgBoardStr
mov esi, msgCtrlMMIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
mov [ctrl.ctrl_mem_base], eax mov [ctrl.ctrl_mem_base], eax
call dword2str
call SysMsgBoardStr
.default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF and eax, 0xFF
@@:
mov [ctrl.int_line], eax mov [ctrl.int_line], eax
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41 stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
@ -713,17 +798,21 @@ proc init_codec
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
push eax
call dword2str call dword2str
call SysMsgBoardStr call SysMsgBoardStr
pop eax
cmp eax, 0xFFFFFFFF
je .err
test eax, CTRL_ST_CREADY test eax, CTRL_ST_CREADY
jnz .ready jnz .ready
call reset_codec call reset_codec
and eax, eax test eax, eax
jz .err jz .err
.ready:
xor edx, edx ;ac_reg_0 xor edx, edx ;ac_reg_0
call [ctrl.codec_write16] call [ctrl.codec_write16]
@ -733,20 +822,27 @@ proc init_codec
mov [counter], 200 ; total 200*5 ms = 1s mov [counter], 200 ; total 200*5 ms = 1s
.wait: .wait:
mov eax, 5000 ; wait 5 ms
call StallExec
mov edx, CODEC_REG_POWERDOWN mov edx, CODEC_REG_POWERDOWN
call [ctrl.codec_read16] call [ctrl.codec_read16]
and eax, 0x0F and eax, 0x0F
cmp eax, 0x0F cmp eax, 0x0F
je .ready jz .done
mov eax, 5000 ; wait 5 ms
call StallExec
sub [counter] , 1 sub [counter] , 1
jnz .wait jnz .wait
.err: .err:
xor eax, eax ; timeout error xor eax, eax ; timeout error
ret ret
.ready: .done:
mov eax, 2 ;force set 16-bit 2-channel PCM
mov edx, GLOB_CTRL
call [ctrl.ctrl_write32]
mov eax, 5000 ; wait 5 ms
call StallExec
call detect_codec call detect_codec
xor eax, eax xor eax, eax
@ -800,29 +896,24 @@ proc warm_reset
mov eax, 100000 ; wait 100 ms mov eax, 100000 ; wait 100 ms
call StallExec call StallExec
mov edx, GLOB_CTRL mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
test eax, 4 test eax, CTRL_ST_CREADY
jz .ok jnz .ok
sub [counter], 1
dec [counter]
jnz .wait jnz .wait
if DEBUG if DEBUG
mov esi, msgWRFail mov esi, msgWRFail
call SysMsgBoardStr call SysMsgBoardStr
end if end if
.fail:
stc stc
ret ret
.ok: .ok:
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
and eax, CTRL_ST_CREADY
jz .fail
clc clc
ret ret
.fail:
stc
ret
endp endp
align 4 align 4
@ -831,10 +922,7 @@ proc cold_reset
counter dd ? counter dd ?
endl endl
mov edx, GLOB_CTRL mov eax, 0x02
call [ctrl.ctrl_read32]
and eax, not 0x08
or eax, 0x02
mov edx, GLOB_CTRL mov edx, GLOB_CTRL
call [ctrl.ctrl_write32] call [ctrl.ctrl_write32]
@ -843,36 +931,58 @@ proc cold_reset
call SysMsgBoardStr call SysMsgBoardStr
end if end if
mov [counter], 10 ; total 10*100 ms = 1s mov eax, 400000 ; wait 400 ms
call StallExec
mov [counter], 16 ; total 20*100 ms = 2s
.wait: .wait:
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
test eax, CTRL_ST_CREADY
jnz .ok
mov eax, 100000 ; wait 100 ms mov eax, 100000 ; wait 100 ms
call StallExec call StallExec
mov edx, GLOB_CTRL dec [counter]
call [ctrl.ctrl_read32]
test eax, 4
jz .ok
sub [counter], 1
jnz .wait jnz .wait
if DEBUG if DEBUG
mov esi, msgCRFail mov esi, msgCRFail
call SysMsgBoardStr call SysMsgBoardStr
end if end if
.fail: .fail:
stc stc
ret ret
.ok: .ok:
mov esi, msgControl
call SysMsgBoardStr
mov edx, GLOB_CTRL
call [ctrl.ctrl_read32]
call dword2str
call SysMsgBoardStr
mov esi, msgStatus
call SysMsgBoardStr
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
and eax, CTRL_ST_CREADY push eax
call dword2str
call SysMsgBoardStr
pop eax
test eax, CTRL_ST_CREADY
jz .fail jz .fail
clc clc
ret ret
endp endp
align 4 align 4
proc play play:
xor eax, eax xor eax, eax
mov [civ_val], eax mov [civ_val], eax
mov edx, PCM_OUT_CIV_REG mov edx, PCM_OUT_CIV_REG
@ -886,11 +996,11 @@ proc play
mov edx, PCM_OUT_CR_REG mov edx, PCM_OUT_CR_REG
mov ax, 0x1D mov ax, 0x1D
call [ctrl.ctrl_write8] call [ctrl.ctrl_write8]
xor eax, eax
ret ret
endp
align 4 align 4
proc stop stop:
mov edx, PCM_OUT_CR_REG mov edx, PCM_OUT_CR_REG
mov ax, 0x0 mov ax, 0x0
call [ctrl.ctrl_write8] call [ctrl.ctrl_write8]
@ -898,8 +1008,8 @@ proc stop
mov ax, 0x1c mov ax, 0x1c
mov edx, PCM_OUT_SR_REG mov edx, PCM_OUT_SR_REG
call [ctrl.ctrl_write16] call [ctrl.ctrl_write16]
xor eax, eax
ret ret
endp
align 4 align 4
proc get_dev_info stdcall, p_info:dword proc get_dev_info stdcall, p_info:dword
@ -933,7 +1043,6 @@ proc get_dev_info stdcall, p_info:dword
mov ebx, [ctrl.pci_cmd] mov ebx, [ctrl.pci_cmd]
mov [CTRL_INFO.pci_cmd], ebx mov [CTRL_INFO.pci_cmd], ebx
ret ret
endp endp
@ -998,7 +1107,6 @@ proc codec_write stdcall, ac_reg:dword
ret ret
endp endp
align 4 align 4
proc codec_check_ready proc codec_check_ready
@ -1010,14 +1118,11 @@ proc codec_check_ready
xor eax, wax xor eax, wax
inc eax inc eax
ret ret
align 4
.not_ready: .not_ready:
xor eax, eax xor eax, eax
ret ret
endp endp
align 4 align 4
proc check_semafore proc check_semafore
local counter:DWORD local counter:DWORD
@ -1143,6 +1248,8 @@ dword2str:
jnz @B jnz @B
ret ret
hexletters db '0123456789ABCDEF'
hex_buff db 8 dup(0),13,10,0
include "codec.inc" include "codec.inc"
@ -1159,26 +1266,34 @@ sz_sound_srv db 'SOUND',0
msgInit db 'detect hardware...',13,10,0 msgInit db 'detect hardware...',13,10,0
msgFail db 'device not found',13,10,0 msgFail db 'device not found',13,10,0
msgAttchIRQ db 'IRQ line not supported', 13,10, 0
msgInvIRQ db 'IRQ line not assigned or invalid', 13,10, 0
msgPlay db 'start play', 13,10,0 msgPlay db 'start play', 13,10,0
msgStop db 'stop play', 13,10,0 msgStop db 'stop play', 13,10,0
msgNotify db 'call notify',13,10,0 ;msgNotify db 'call notify',13,10,0
msgIRQ db 'AC97 IRQ', 13,10,0 msgIRQ db 'AC97 IRQ', 13,10,0
msgInitCtrl db 'init controller',13,10,0 msgInitCtrl db 'init controller',13,10,0
msgInitCodec db 'init codec',13,10,0 ;msgInitCodec db 'init codec',13,10,0
msgPrimBuff db 'create primary buffer',13,10,0 msgPrimBuff db 'create primary buffer ...',0
msgReg db 'set service handler',13,10,0 msgDone db 'done',13,10,0
msgRemap db 'Remap IRQ',13,10,0
;msgReg db 'set service handler',13,10,0
msgOk db 'service installed',13,10,0 msgOk db 'service installed',13,10,0
msgCold db 'cold resret',13,10,0 msgCold db 'cold reset',13,10,0
msgWarm db 'warm reset',13,10,0 msgWarm db 'warm reset',13,10,0
msgWRFail db 'warm reset failed',13,10,0 msgWRFail db 'warm reset failed',13,10,0
msgCRFail db 'cold reset failed',13,10,0 msgCRFail db 'cold reset failed',13,10,0
msgCFail db 'codec not ready',13,10,0 msgCFail db 'codec not ready',13,10,0
msgResetOk db 'reset complete',13,10,0
msgStatus db 'global status ',0 msgStatus db 'global status ',0
msgControl db 'global control ',0 msgControl db 'global control ',0
msgPciCmd db 'PCI command ',0
hexletters db '0123456789ABCDEF' msgPciStat db 'PCI status ',0
hex_buff db 8 dup(0),13,10,0 msgCtrlIsaIo db 'controller io base ',0
msgMixIsaIo db 'codec io base ',0
msgCtrlMMIo db 'controller mmio base ',0
msgMixMMIo db 'codec mmio base ',0
msgIrqMap db 'AC97 irq map as ',0
section '.data' data readable writable align 16 section '.data' data readable writable align 16