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
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
BIT1 EQU 0x00000002
@ -65,13 +80,12 @@ RR equ BIT1 ; reset registers. Nukes all regs
CODEC_MASTER_VOL_REG equ 0x02
CODEC_AUX_VOL equ 0x04 ;
CODEC_PCM_OUT_REG equ 18h ; PCM output volume
CODEC_EXT_AUDIO_REG equ 28h ; extended audio
CODEC_EXT_AUDIO_CTRL_REG equ 2ah ; extended audio control
CODEC_PCM_FRONT_DACRATE_REG equ 2ch ; PCM out sample rate
CODEC_PCM_SURND_DACRATE_REG equ 2eh ; surround sound sample rate
CODEC_PCM_LFE_DACRATE_REG equ 30h ; LFE sample rate
CODEC_PCM_OUT_REG equ 0x18 ; PCM output volume
CODEC_EXT_AUDIO_REG equ 0x28 ; extended audio
CODEC_EXT_AUDIO_CTRL_REG equ 0x2a ; extended audio control
CODEC_PCM_FRONT_DACRATE_REG equ 0x2c ; PCM out sample rate
CODEC_PCM_SURND_DACRATE_REG equ 0x2e ; surround sound sample rate
CODEC_PCM_LFE_DACRATE_REG equ 0x30 ; LFE sample rate
GLOB_CTRL equ 0x2C ; Global Control
CTRL_STAT equ 0x30 ; Global Status
@ -251,9 +265,6 @@ end virtual
EVENT_NOTIFY equ 0x00000200
OS_BASE equ 0x80000000
SLOT_BASE equ OS_BASE+0x0080000
public START
public service_proc
public version
@ -279,43 +290,68 @@ proc START stdcall, state:dword
call SysMsgBoardStr
mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr
end if
call init_controller
test eax, eax
jz .fail
if DEBUG
mov esi, msgInitCodec
call SysMsgBoardStr
end if
call init_codec
test eax, eax
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 setup_codec
mov esi, msgPrimBuff
call SysMsgBoardStr
call create_primary_buff
stdcall AttachIntHandler, [ctrl.int_line], ac97_irq
stdcall RegService, sz_sound_srv, service_proc
mov esi, msgOk
mov esi, msgDone
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
.fail:
if DEBUG
@ -324,6 +360,10 @@ proc START stdcall, state:dword
end if
xor eax, eax
ret
.fail_msg:
call SysMsgBoardStr
xor eax, eax
ret
.stop:
call stop
xor eax, eax
@ -412,10 +452,10 @@ restore out_size
align 4
proc ac97_irq
; if DEBUG
; mov esi, msgIRQ
; call SysMsgBoardStr
; end if
if DEBUG_IRQ
mov esi, msgIRQ
call SysMsgBoardStr
end if
mov edx, PCM_OUT_CR_REG
mov al, 0x10
@ -484,18 +524,25 @@ proc create_primary_buff
@@:
mov [edi], eax
mov [edi+4], ebx
mov [edi+32], eax
mov [edi+4+32], ebx
mov [edi+64], eax
mov [edi+4+64], ebx
mov [edi+96], eax
mov [edi+4+96], ebx
mov [edi+128], eax
mov [edi+4+128], ebx
mov [edi+160], eax
mov [edi+4+160], ebx
mov [edi+192], eax
mov [edi+4+192], ebx
mov [edi+224], eax
mov [edi+4+224], ebx
@ -569,6 +616,7 @@ proc detect_controller
jz .next
cmp eax, -1
je .next
mov edi, devices
@@:
mov ebx, [edi]
@ -579,7 +627,6 @@ proc detect_controller
je .found
add edi, 12
jmp @B
.next:
inc [devfn]
cmp [devfn], 256
@ -626,22 +673,60 @@ proc init_controller
shr ebx, 16
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
call dword2str
call SysMsgBoardStr
and eax,0xFFFE
mov [ctrl.codec_io_base], eax
mov esi, msgCtrlIsaIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14
call dword2str
call SysMsgBoardStr
and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax
mov esi, msgMixMMIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18
mov [ctrl.codec_mem_base], eax
call dword2str
call SysMsgBoardStr
mov esi, msgCtrlMMIo
call SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C
mov [ctrl.ctrl_mem_base], eax
call dword2str
call SysMsgBoardStr
.default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF
@@:
mov [ctrl.int_line], eax
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41
@ -713,17 +798,21 @@ proc init_codec
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
push eax
call dword2str
call SysMsgBoardStr
pop eax
cmp eax, 0xFFFFFFFF
je .err
test eax, CTRL_ST_CREADY
jnz .ready
call reset_codec
and eax, eax
test eax, eax
jz .err
.ready:
xor edx, edx ;ac_reg_0
call [ctrl.codec_write16]
@ -733,20 +822,27 @@ proc init_codec
mov [counter], 200 ; total 200*5 ms = 1s
.wait:
mov eax, 5000 ; wait 5 ms
call StallExec
mov edx, CODEC_REG_POWERDOWN
call [ctrl.codec_read16]
and eax, 0x0F
cmp eax, 0x0F
je .ready
jz .done
mov eax, 5000 ; wait 5 ms
call StallExec
sub [counter] , 1
jnz .wait
.err:
xor eax, eax ; timeout error
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
xor eax, eax
@ -800,29 +896,24 @@ proc warm_reset
mov eax, 100000 ; wait 100 ms
call StallExec
mov edx, GLOB_CTRL
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
test eax, 4
jz .ok
sub [counter], 1
test eax, CTRL_ST_CREADY
jnz .ok
dec [counter]
jnz .wait
if DEBUG
mov esi, msgWRFail
call SysMsgBoardStr
end if
.fail:
stc
ret
.ok:
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
and eax, CTRL_ST_CREADY
jz .fail
clc
ret
.fail:
stc
ret
endp
align 4
@ -831,10 +922,7 @@ proc cold_reset
counter dd ?
endl
mov edx, GLOB_CTRL
call [ctrl.ctrl_read32]
and eax, not 0x08
or eax, 0x02
mov eax, 0x02
mov edx, GLOB_CTRL
call [ctrl.ctrl_write32]
@ -843,36 +931,58 @@ proc cold_reset
call SysMsgBoardStr
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:
mov edx, CTRL_STAT
call [ctrl.ctrl_read32]
test eax, CTRL_ST_CREADY
jnz .ok
mov eax, 100000 ; wait 100 ms
call StallExec
mov edx, GLOB_CTRL
call [ctrl.ctrl_read32]
test eax, 4
jz .ok
sub [counter], 1
dec [counter]
jnz .wait
if DEBUG
mov esi, msgCRFail
call SysMsgBoardStr
end if
.fail:
stc
ret
.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
call [ctrl.ctrl_read32]
and eax, CTRL_ST_CREADY
push eax
call dword2str
call SysMsgBoardStr
pop eax
test eax, CTRL_ST_CREADY
jz .fail
clc
ret
endp
align 4
proc play
play:
xor eax, eax
mov [civ_val], eax
mov edx, PCM_OUT_CIV_REG
@ -886,11 +996,11 @@ proc play
mov edx, PCM_OUT_CR_REG
mov ax, 0x1D
call [ctrl.ctrl_write8]
xor eax, eax
ret
endp
align 4
proc stop
stop:
mov edx, PCM_OUT_CR_REG
mov ax, 0x0
call [ctrl.ctrl_write8]
@ -898,8 +1008,8 @@ proc stop
mov ax, 0x1c
mov edx, PCM_OUT_SR_REG
call [ctrl.ctrl_write16]
xor eax, eax
ret
endp
align 4
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 [CTRL_INFO.pci_cmd], ebx
ret
endp
@ -998,7 +1107,6 @@ proc codec_write stdcall, ac_reg:dword
ret
endp
align 4
proc codec_check_ready
@ -1010,14 +1118,11 @@ proc codec_check_ready
xor eax, wax
inc eax
ret
align 4
.not_ready:
xor eax, eax
ret
endp
align 4
proc check_semafore
local counter:DWORD
@ -1143,6 +1248,8 @@ dword2str:
jnz @B
ret
hexletters db '0123456789ABCDEF'
hex_buff db 8 dup(0),13,10,0
include "codec.inc"
@ -1159,26 +1266,34 @@ sz_sound_srv db 'SOUND',0
msgInit db 'detect hardware...',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
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
msgInitCtrl db 'init controller',13,10,0
msgInitCodec db 'init codec',13,10,0
msgPrimBuff db 'create primary buffer',13,10,0
msgReg db 'set service handler',13,10,0
;msgInitCodec db 'init codec',13,10,0
msgPrimBuff db 'create primary buffer ...',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
msgCold db 'cold resret',13,10,0
msgCold db 'cold reset',13,10,0
msgWarm db 'warm reset',13,10,0
msgWRFail db 'warm reset failed',13,10,0
msgCRFail db 'cold reset failed',13,10,0
msgCFail db 'codec not ready',13,10,0
msgResetOk db 'reset complete',13,10,0
msgStatus db 'global status ',0
msgControl db 'global control ',0
hexletters db '0123456789ABCDEF'
hex_buff db 8 dup(0),13,10,0
msgPciCmd db 'PCI command ',0
msgPciStat db 'PCI status ',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