* sound drivers converted to PE

* sound driver selector: revert r5071 and fix the problem properly
* sis: integrate changes from drivers/audio/sisnbook, add to autobuild
* intelac97: fix clicks during play on VBox
* intel_hda: fix problems at shutdown

git-svn-id: svn://kolibrios.org@5077 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
CleverMouse 2014-09-01 11:21:04 +00:00
parent 4afcb5706b
commit 11bd59473f
18 changed files with 466 additions and 2689 deletions

View File

@ -127,11 +127,6 @@ FASM_PROGRAMS:=\
develop/info/html.syn:DEVELOP/INFO/HTML.SYN:$(PROGS)/other/t_edit/info/html_syn.asm \ develop/info/html.syn:DEVELOP/INFO/HTML.SYN:$(PROGS)/other/t_edit/info/html_syn.asm \
develop/info/ini_files.syn:DEVELOP/INFO/INI_FILES.SYN:$(PROGS)/other/t_edit/info/ini_files_syn.asm \ develop/info/ini_files.syn:DEVELOP/INFO/INI_FILES.SYN:$(PROGS)/other/t_edit/info/ini_files_syn.asm \
develop/info/win_const.syn:DEVELOP/INFO/WIN_CONST.SYN:$(PROGS)/other/t_edit/info/win_const_syn.asm \ develop/info/win_const.syn:DEVELOP/INFO/WIN_CONST.SYN:$(PROGS)/other/t_edit/info/win_const_syn.asm \
drivers/emu10k1x.obj:DRIVERS/EMU10K1X.OBJ:$(KERNEL)/drivers/emu10k1x.asm \
drivers/fm801.obj:DRIVERS/FM801.OBJ:$(KERNEL)/drivers/fm801.asm \
drivers/infinity.obj:DRIVERS/INFINITY.OBJ:$(KERNEL)/drivers/infinity.asm \
drivers/intelac97.obj:DRIVERS/INTELAC97.OBJ:$(KERNEL)/drivers/intelac97.asm \
drivers/vt823x.obj:DRIVERS/VT823X.OBJ:$(KERNEL)/drivers/vt823x.asm \
File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \ File|Managers/kfar:File|Managers/KFAR:$(PROGS)/fs/kfar/trunk/kfar.asm \
File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \ File|Managers/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.asm \
File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \ File|Managers/opendial:File|Managers/OPENDIAL:$(PROGS)/fs/opendial/opendial.asm \
@ -230,6 +225,12 @@ FASM_PROGRAMS_PESTRIP:=\
drivers/intel_hda.sys:DRIVERS/intel_hda.sys:$(REPOSITORY)/drivers/audio/intel_hda/intel_hda.asm \ drivers/intel_hda.sys:DRIVERS/intel_hda.sys:$(REPOSITORY)/drivers/audio/intel_hda/intel_hda.asm \
drivers/sb16.sys:DRIVERS/SB16.SYS:$(REPOSITORY)/drivers/audio/sb16/sb16.asm \ drivers/sb16.sys:DRIVERS/SB16.SYS:$(REPOSITORY)/drivers/audio/sb16/sb16.asm \
drivers/sound.sys:DRIVERS/SOUND.SYS:$(REPOSITORY)/drivers/audio/sound.asm \ drivers/sound.sys:DRIVERS/SOUND.SYS:$(REPOSITORY)/drivers/audio/sound.asm \
drivers/infinity.sys:DRIVERS/INFINITY.SYS:$(REPOSITORY)/drivers/audio/infinity/infinity.asm \
drivers/intelac97.sys:DRIVERS/INTELAC97.SYS:$(REPOSITORY)/drivers/audio/intelac97.asm \
drivers/emu10k1x.sys:DRIVERS/EMU10K1X.SYS:$(REPOSITORY)/drivers/audio/emu10k1x.asm \
drivers/fm801.sys:DRIVERS/FM801.SYS:$(REPOSITORY)/drivers/audio/fm801.asm \
drivers/vt823x.sys:DRIVERS/VT823X.SYS:$(REPOSITORY)/drivers/audio/vt823x.asm \
drivers/sis.sys:DRIVERS/SIS.SYS:$(REPOSITORY)/drivers/audio/sis.asm \
# end of list # end of list
# The list of all FASM programs with one main FASM file for CD image. # The list of all FASM programs with one main FASM file for CD image.
# Format of an item is exactly the same as in the previous list. # Format of an item is exactly the same as in the previous list.

View File

@ -36,7 +36,7 @@ proc detect_codec
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 invoke SysMsgBoardStr
stdcall detect_chip, [edi+8] stdcall detect_chip, [edi+8]
ret ret
@ -48,10 +48,10 @@ proc detect_codec
mov [codec.chip_ids], chip_unknown mov [codec.chip_ids], chip_unknown
mov esi, chip_unknown mov esi, chip_unknown
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [codec.chip_id] mov eax, [codec.chip_id]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
ret ret
endp endp
@ -72,7 +72,7 @@ proc detect_chip stdcall, chip_tab:dword
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 invoke SysMsgBoardStr
ret ret
.next: .next:
add edi, 8 add edi, 8
@ -80,10 +80,10 @@ proc detect_chip stdcall, chip_tab:dword
.unknown: .unknown:
mov [codec.chip_ids], chip_unknown mov [codec.chip_ids], chip_unknown
mov esi, chip_unknown mov esi, chip_unknown
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [codec.chip_id] mov eax, [codec.chip_id]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
ret ret
endp endp

View File

@ -1,17 +1,15 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
format MS COFF format PE DLL native 0.05
entry START
DEBUG equ 1 DEBUG equ 1
include 'proc32.inc'
include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
@ -315,35 +313,23 @@ struc CTRL_INFO
.codec_id dd ? .codec_id dd ?
} }
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
public START section '.flat' code readable writable executable
public service_proc include '../struct.inc'
public version include '../macros.inc'
include '../proc32.inc'
include '../peimport.inc'
section '.flat' code readable align 16
proc START stdcall, state:dword proc START c uses ebx esi edi, state:dword, cmdline:dword
cmp [state], 1 cmp [state], 1
jne .stop jne .stop
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call detect_controller call detect_controller
@ -352,9 +338,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov esi, [ctrl.vendor_ids] mov esi, [ctrl.vendor_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call init_controller call init_controller
@ -368,10 +354,10 @@ proc START stdcall, state:dword
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr invoke SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone mov esi, msgDone
call SysMsgBoardStr invoke SysMsgBoardStr
if IRQ_REMAP if IRQ_REMAP
pushf pushf
@ -399,7 +385,7 @@ proc START stdcall, state:dword
mov [ctrl.int_line], IRQ_LINE mov [ctrl.int_line], IRQ_LINE
popf popf
mov esi, msgRemap mov esi, msgRemap
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, VALID_IRQ mov eax, VALID_IRQ
@ -412,21 +398,21 @@ proc START stdcall, state:dword
bt eax, ebx bt eax, ebx
jnc .fail_msg jnc .fail_msg
stdcall AttachIntHandler, ebx, ac97_irq, dword 0 invoke AttachIntHandler, ebx, ac97_irq, dword 0
stdcall create stdcall create
.reg: .reg:
stdcall RegService, sz_sound_srv, service_proc invoke RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg: .fail_msg:
call SysMsgBoardStr invoke SysMsgBoardStr
xor eax, eax xor eax, eax
ret ret
.stop: .stop:
@ -462,7 +448,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgPlay mov esi, msgPlay
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call play call play
ret ret
@ -471,7 +457,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgStop mov esi, msgStop
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call stop call stop
ret ret
@ -543,7 +529,7 @@ endp
align 4 align 4
proc create_primary_buff proc create_primary_buff
stdcall KernelAlloc, 0x10000 invoke KernelAlloc, 0x10000
mov [ctrl.buffer], eax mov [ctrl.buffer], eax
mov edi, eax mov edi, eax
@ -553,7 +539,7 @@ proc create_primary_buff
rep stosd rep stosd
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
mov edi, pcmout_bdl mov edi, pcmout_bdl
stosd stosd
@ -565,7 +551,7 @@ proc create_primary_buff
stosd ;1.] stosd ;1.]
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
stdcall ptr_write, PLAYBACK_POINTER, 0, 0 stdcall ptr_write, PLAYBACK_POINTER, 0, 0
stdcall ptr_write, PLAYBACK_UNKNOWN1, 0, 0 stdcall ptr_write, PLAYBACK_UNKNOWN1, 0, 0
@ -574,7 +560,7 @@ proc create_primary_buff
mov eax, pcmout_bdl mov eax, pcmout_bdl
mov ebx, eax mov ebx, eax
call GetPgAddr invoke GetPgAddr
and ebx, 0xFFF and ebx, 0xFFF
add eax, ebx add eax, ebx
@ -601,7 +587,7 @@ proc detect_controller
xor eax, eax xor eax, eax
mov [bus], eax mov [bus], eax
inc eax inc eax
call PciApi invoke PciApi
cmp eax, -1 cmp eax, -1
je .err je .err
@ -610,7 +596,7 @@ proc detect_controller
.next_bus: .next_bus:
and [devfn], 0 and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 invoke PciRead32, [bus], [devfn], dword 0
test eax, eax test eax, eax
jz .next jz .next
cmp eax, -1 cmp eax, -1
@ -670,13 +656,13 @@ endp
align 4 align 4
proc init_controller proc init_controller
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C
mov esi, msgPciSubsys mov esi, msgPciSubsys
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
mov ebx, eax mov ebx, eax
and eax, 0xFFFF and eax, 0xFFFF
mov [ctrl.pci_cmd], eax mov [ctrl.pci_cmd], eax
@ -684,27 +670,27 @@ proc init_controller
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd mov esi, msgPciCmd
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgPciStat mov esi, msgPciStat
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [ctrl.pci_stat] mov eax, [ctrl.pci_stat]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgCtrlIsaIo mov esi, msgCtrlIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFC0 and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
.default: .default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF and eax, 0xFF
@@: @@:
mov [ctrl.int_line], eax mov [ctrl.int_line], eax
@ -753,7 +739,7 @@ proc reset_codec
if DEBUG if DEBUG
mov esi, msgCold mov esi, msgCold
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
@ -775,7 +761,7 @@ proc reset_codec
if DEBUG if DEBUG
mov esi, msgCRFail mov esi, msgCRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
@ -851,11 +837,11 @@ endp
align 4 align 4
proc create stdcall proc create stdcall
stdcall PciRead16, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead16, [ctrl.bus], [ctrl.devfn], 4
test eax, 4 ; test master bit test eax, 4 ; test master bit
jnz @f jnz @f
or eax, 4 or eax, 4
stdcall PciWrite16, [ctrl.bus], [ctrl.devfn], dword 4, eax ; set master bit invoke PciWrite16, [ctrl.bus], [ctrl.devfn], 4, eax ; set master bit
@@: @@:
xor eax, eax xor eax, eax
@ -1117,8 +1103,6 @@ devices dd (CTRL_CT0200 shl 16)+VID_Creative,msg_CT_EMU10K1X,set_Creative
dd 0 ;terminator dd 0 ;terminator
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
msg_CT_EMU10K1X db 'SB Live! Dell OEM', 13,10, 0 msg_CT_EMU10K1X db 'SB Live! Dell OEM', 13,10, 0
msg_Creative db 'Creative ', 0 msg_Creative db 'Creative ', 0
@ -1157,8 +1141,11 @@ msgCtrlIsaIo db 'controller io base ',0
;msgMixMMIo db 'codec mmio base ',0 ;msgMixMMIo db 'codec mmio base ',0
;msgIrqMap db 'AC97 irq map as ',0 ;msgIrqMap db 'AC97 irq map as ',0
section '.data' data readable writable align 16 align 4
data fixups
end data
align 8
pcmout_bdl rq 32 pcmout_bdl rq 32
buff_list rd 32 buff_list rd 32

View File

@ -1,18 +1,16 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
format MS COFF format PE DLL native 0.05
entry START
DEBUG equ 1 DEBUG equ 1
DEBUG_IRQ equ 0 DEBUG_IRQ equ 0
include 'proc32.inc'
include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
@ -276,28 +274,15 @@ struc CTRL_INFO
.codec_id dd ? .codec_id dd ?
} }
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
public START section '.flat' code readable writable executable
public service_proc include '../struct.inc'
public version include '../macros.inc'
include '../proc32.inc'
include '../peimport.inc'
section '.flat' code readable align 16 proc START c uses ebx esi edi, state:dword, cmdline:dword
proc START stdcall, state:dword
cmp [state], 1 cmp [state], 1
jne .stop jne .stop
@ -305,9 +290,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov eax, START mov eax, START
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call detect_controller call detect_controller
@ -316,9 +301,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov esi, [ctrl.vendor_ids] mov esi, [ctrl.vendor_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
@ -334,11 +319,11 @@ proc START stdcall, state:dword
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr invoke SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone mov esi, msgDone
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, VALID_IRQ mov eax, VALID_IRQ
mov ebx, [ctrl.int_line] mov ebx, [ctrl.int_line]
@ -350,20 +335,20 @@ proc START stdcall, state:dword
bt eax, ebx bt eax, ebx
jnc .fail_msg jnc .fail_msg
stdcall AttachIntHandler, ebx, ac97_irq, dword 0 invoke AttachIntHandler, ebx, ac97_irq, dword 0
.reg: .reg:
stdcall RegService, sz_sound_srv, service_proc invoke RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg: .fail_msg:
call SysMsgBoardStr invoke SysMsgBoardStr
xor eax, eax xor eax, eax
ret ret
.stop: .stop:
@ -400,7 +385,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgPlay mov esi, msgPlay
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call play call play
ret ret
@ -409,7 +394,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgStop mov esi, msgStop
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call stop call stop
ret ret
@ -485,7 +470,7 @@ proc ac97_irq
if DEBUG_IRQ if DEBUG_IRQ
mov esi, msgIRQ mov esi, msgIRQ
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov edx, FM_INTSTATUS mov edx, FM_INTSTATUS
@ -508,7 +493,7 @@ endp
align 4 align 4
proc create_primary_buff proc create_primary_buff
stdcall KernelAlloc, 0x10000 invoke KernelAlloc, 0x10000
mov [ctrl.buffer], eax mov [ctrl.buffer], eax
mov edi, eax mov edi, eax
@ -518,7 +503,7 @@ proc create_primary_buff
rep stosd rep stosd
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
mov [buffer_pgaddr], eax mov [buffer_pgaddr], eax
ret ret
@ -535,7 +520,7 @@ proc detect_controller
xor eax, eax xor eax, eax
mov [bus], eax mov [bus], eax
inc eax inc eax
call PciApi invoke PciApi
cmp eax, -1 cmp eax, -1
je .err je .err
@ -544,14 +529,14 @@ proc detect_controller
.next_bus: .next_bus:
and [devfn], 0 and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 invoke PciRead32, [bus], [devfn], dword 0
test eax, eax test eax, eax
jz .next jz .next
cmp eax, -1 cmp eax, -1
je .next je .next
push eax push eax
stdcall PciRead32, [bus], [devfn], dword 0x09 invoke PciRead32, [bus], [devfn], dword 0x09
and eax, 0xffffff and eax, 0xffffff
cmp eax, 0x060100 ;pci-isa cmp eax, 0x060100 ;pci-isa
jne .no_bridge jne .no_bridge
@ -612,7 +597,7 @@ endp
align 4 align 4
proc init_controller proc init_controller
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
mov ebx, eax mov ebx, eax
and eax, 0xFFFF and eax, 0xFFFF
mov [ctrl.pci_cmd], eax mov [ctrl.pci_cmd], eax
@ -620,36 +605,36 @@ proc init_controller
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd mov esi, msgPciCmd
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgPciStat mov esi, msgPciStat
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [ctrl.pci_stat] mov eax, [ctrl.pci_stat]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgCtrlIsaIo mov esi, msgCtrlIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFFE and eax, 0xFFFE
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
mov esi, msgIrqNum mov esi, msgIrqNum
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C
and eax, 0xFF and eax, 0xFF
mov [ctrl.int_line], eax mov [ctrl.int_line], eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
call [ctrl.ctrl_setup] call [ctrl.ctrl_setup]
xor eax, eax xor eax, eax
@ -676,7 +661,7 @@ align 4
proc reset_controller proc reset_controller
mov esi, msgInitCtrl mov esi, msgInitCtrl
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, FM_CARD_CTL mov edx, FM_CARD_CTL
call [ctrl.ctrl_read8] call [ctrl.ctrl_read8]
@ -719,7 +704,7 @@ align 4
proc init_codec proc init_codec
mov esi, msgInitCodec mov esi, msgInitCodec
call SysMsgBoardStr invoke SysMsgBoardStr
mov al, FM_CODEC_CMD_READ mov al, FM_CODEC_CMD_READ
mov edx, FM_CODEC_CMD mov edx, FM_CODEC_CMD
@ -1024,8 +1009,6 @@ align 4
devices dd (CTRL_FM801 shl 16)+VID_FM801, msg_FM801, set_FM devices dd (CTRL_FM801 shl 16)+VID_FM801, msg_FM801, set_FM
dd 0 dd 0
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
msg_FM801 db 'FM801 AC97 controller',13,10, 0 msg_FM801 db 'FM801 AC97 controller',13,10, 0
msg_FM db 'Forte Media',13,10, 0 msg_FM db 'Forte Media',13,10, 0
@ -1053,7 +1036,9 @@ msgCtrlIsaIo db 'controller io base ',0
msgIrqNum db 'IRQ default ',0 msgIrqNum db 'IRQ default ',0
;msgIrqMap db 'AC97 irq map as ',0 ;msgIrqMap db 'AC97 irq map as ',0
section '.data' data readable writable align 16 align 4
data fixups
end data
codec CODEC codec CODEC
ctrl AC_CNTRL ctrl AC_CNTRL

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2006-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2006-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -8,16 +8,12 @@
; Serge 2006-2008 ; Serge 2006-2008
; email: infinity_sound@mail.ru ; email: infinity_sound@mail.ru
format MS COFF format PE DLL native 0.05
entry START
DEBUG equ 1 DEBUG equ 1
include 'proc32.inc'
include 'main.inc'
include 'imports.inc'
CURRENT_API equ 0x0101 ;1.01 CURRENT_API equ 0x0101 ;1.01
COMPATIBLE_API equ 0x0100 ;1.00 COMPATIBLE_API equ 0x0100 ;1.00
@ -38,10 +34,6 @@ OS_BASE equ 0x80000000
CAPS_SSE2 equ 26 CAPS_SSE2 equ 26
PG_SW equ 0x003 PG_SW equ 0x003
public START
public service_proc
public version
RT_INP_EMPTY equ 0xFF000001 RT_INP_EMPTY equ 0xFF000001
RT_OUT_EMPTY equ 0xFF000002 RT_OUT_EMPTY equ 0xFF000002
RT_INP_FULL equ 0xFF000003 RT_INP_FULL equ 0xFF000003
@ -57,32 +49,26 @@ DEV_STOP equ 2
DEV_CALLBACK equ 3 DEV_CALLBACK equ 3
DEV_GET_POS equ 9 DEV_GET_POS equ 9
struc IOCTL section '.flat' code readable executable
{ .handle dd ? include '../../struct.inc'
.io_code dd ? include '../../macros.inc'
.input dd ? include '../../proc32.inc'
.inp_size dd ? include 'main.inc'
.output dd ? include '../../peimport.inc'
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
section '.flat' code readable align 16
proc START stdcall, state:dword proc START c uses ebx esi edi, state:dword, cmdline:dword
cmp [state], 1 cmp [state], 1
jne .exit jne .exit
stdcall GetService, szSound invoke GetService, szSound
test eax, eax test eax, eax
jz .fail jz .fail
mov [hSound], eax mov [hSound], eax
stdcall KernelAlloc, 16*512 invoke KernelAlloc, 16*512
test eax, eax test eax, eax
jz .out_of_mem jz .out_of_mem
mov [mix_buff], eax mov [mix_buff], eax
@ -133,12 +119,12 @@ end if
end if end if
stdcall set_handler, [hSound], new_mix stdcall set_handler, [hSound], new_mix
mov [eng_state], SND_STOP mov [eng_state], SND_STOP
stdcall RegService, szInfinity, service_proc invoke RegService, szInfinity, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.exit: .exit:
xor eax, eax xor eax, eax
@ -147,21 +133,12 @@ end if
.out_of_mem: .out_of_mem:
if DEBUG if DEBUG
mov esi, msgMem mov esi, msgMem
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
endp endp
handle equ IOCTL.handle
io_code equ IOCTL.io_code
input equ IOCTL.input
inp_size equ IOCTL.inp_size
output equ IOCTL.output
out_size equ IOCTL.out_size
align 4 align 4
srv_calls dd service_proc.srv_getversion ; 0 srv_calls dd service_proc.srv_getversion ; 0
@ -189,7 +166,7 @@ srv_calls_end:
proc service_proc stdcall, ioctl:dword proc service_proc stdcall, ioctl:dword
mov edi, [ioctl] mov edi, [ioctl]
mov eax, [edi+io_code] mov eax, [edi+IOCTL.io_code]
cmp eax, (srv_calls_end-srv_calls)/4 cmp eax, (srv_calls_end-srv_calls)/4
ja .fail ja .fail
@ -200,7 +177,7 @@ proc service_proc stdcall, ioctl:dword
; cmp [edi+inp_size], 4 ; cmp [edi+inp_size], 4
; jb .fali ; jb .fali
mov ebx, [edi+input] mov ebx, [edi+IOCTL.input]
mov edx, [ebx] mov edx, [ebx]
cmp [edx+STREAM.magic], 'WAVE' cmp [edx+STREAM.magic], 'WAVE'
@ -219,8 +196,8 @@ proc service_proc stdcall, ioctl:dword
align 4 align 4
.srv_getversion: .srv_getversion:
mov eax, [edi+output] mov eax, [edi+IOCTL.output]
cmp [edi+out_size], 4 cmp [edi+IOCTL.out_size], 4
jne .fail jne .fail
mov eax, [eax] mov eax, [eax]
mov [eax], dword API_VERSION mov [eax], dword API_VERSION
@ -229,10 +206,10 @@ align 4
align 4 align 4
.snd_create_buff: .snd_create_buff:
mov ebx, [edi+input] mov ebx, [edi+IOCTL.input]
stdcall CreateBuffer, [ebx], [ebx+4] stdcall CreateBuffer, [ebx], [ebx+4]
mov edi, [ioctl] mov edi, [ioctl]
mov ecx, [edi+output] mov ecx, [edi+IOCTL.output]
mov ecx, [ecx] mov ecx, [ecx]
mov [ecx], ebx mov [ecx], ebx
ret ret
@ -251,7 +228,7 @@ align 4
align 4 align 4
.snd_getformat: .snd_getformat:
movzx eax, word [edx+STREAM.format] movzx eax, word [edx+STREAM.format]
mov ecx, [edi+output] mov ecx, [edi+IOCTL.output]
mov ecx, [ecx] mov ecx, [ecx]
mov [ecx], eax mov [ecx], eax
xor eax, eax xor eax, eax
@ -271,7 +248,7 @@ align 4
.snd_getpos: .snd_getpos:
stdcall GetBufferPos, edx stdcall GetBufferPos, edx
mov edi, [ioctl] mov edi, [ioctl]
mov ecx, [edi+output] mov ecx, [edi+IOCTL.output]
mov ecx, [ecx] mov ecx, [ecx]
mov [ecx], ebx mov [ecx], ebx
ret ret
@ -305,7 +282,7 @@ align 4
align 4 align 4
.snd_getvolume: .snd_getvolume:
mov eax, [edi+output] mov eax, [edi+IOCTL.output]
mov ecx, [eax] mov ecx, [eax]
mov eax, [eax+4] mov eax, [eax+4]
stdcall GetBufferVol, edx, ecx, eax stdcall GetBufferVol, edx, ecx, eax
@ -318,7 +295,7 @@ align 4
align 4 align 4
.snd_getpan: .snd_getpan:
mov eax, [edx+STREAM.pan] mov eax, [edx+STREAM.pan]
mov ebx, [edi+output] mov ebx, [edi+IOCTL.output]
mov ebx, [ebx] mov ebx, [ebx]
mov [ebx], eax mov [ebx], eax
xor eax, eax xor eax, eax
@ -327,7 +304,7 @@ align 4
align 4 align 4
.snd_getbuffsize: .snd_getbuffsize:
mov eax, [edx+STREAM.in_size] mov eax, [edx+STREAM.in_size]
mov ecx, [edi+output] mov ecx, [edi+IOCTL.output]
mov ecx, [ecx] mov ecx, [ecx]
mov [ecx], eax mov [ecx], eax
xor eax, eax xor eax, eax
@ -339,13 +316,13 @@ align 4
jz .fail jz .fail
mov ebx, [edx+STREAM.in_free] mov ebx, [edx+STREAM.in_free]
mov ecx, [edi+output] mov ecx, [edi+IOCTL.output]
mov [ecx], ebx mov [ecx], ebx
xor eax, eax xor eax, eax
ret ret
align 4 align 4
.snd_settimebase: .snd_settimebase:
cmp [edi+inp_size], 12 cmp [edi+IOCTL.inp_size], 12
jne .fail jne .fail
mov eax, [ebx+4] mov eax, [ebx+4]
@ -364,7 +341,7 @@ align 4
align 4 align 4
.snd_gettimestamp: .snd_gettimestamp:
cmp [edi+out_size], 8 cmp [edi+IOCTL.out_size], 8
jne .fail jne .fail
pushfd pushfd
@ -393,7 +370,7 @@ align 4
push dword [hSound] ;.handle push dword [hSound] ;.handle
mov eax, esp mov eax, esp
stdcall ServiceHandler, eax invoke ServiceHandler, eax
add esp, 6*4 add esp, 6*4
pop edi pop edi
@ -407,7 +384,7 @@ align 4
mov dword [esp], 0 ; clear offset mov dword [esp], 0 ; clear offset
@@: @@:
mov edi, [edi+output] mov edi, [edi+IOCTL.output]
emms emms
fild qword [edx+STREAM.time_stamp] fild qword [edx+STREAM.time_stamp]
@ -461,11 +438,11 @@ proc CreateBuffer stdcall, format:dword, size:dword
jnz .fail jnz .fail
.test_ok: .test_ok:
call GetPid invoke GetPid
mov ebx, eax mov ebx, eax
mov eax, STREAM.sizeof mov eax, STREAM.sizeof
call CreateObject invoke CreateObject
test eax, eax test eax, eax
jz .fail jz .fail
mov [str], eax mov [str], eax
@ -516,7 +493,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
shr ebx, 12 shr ebx, 12
mov [ring_pages], ebx mov [ring_pages], ebx
stdcall CreateRingBuffer, eax, PG_SW invoke CreateRingBuffer, eax, PG_SW
mov edi, [str] mov edi, [str]
mov ecx, [ring_size] mov ecx, [ring_size]
@ -536,7 +513,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
mov ecx, [size] mov ecx, [size]
add ecx, 128 ;resampler required add ecx, 128 ;resampler required
mov [eax+STREAM.in_size], ecx mov [eax+STREAM.in_size], ecx
stdcall KernelAlloc, ecx invoke KernelAlloc, ecx
mov edi, [str] mov edi, [str]
mov [edi+STREAM.in_base], eax mov [edi+STREAM.in_base], eax
@ -550,7 +527,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
mov [edi+STREAM.in_top], eax mov [edi+STREAM.in_top], eax
.out_buff: .out_buff:
stdcall AllocKernelSpace, dword 128*1024 invoke AllocKernelSpace, dword 128*1024
mov edi, [str] mov edi, [str]
xor ebx, ebx xor ebx, ebx
@ -569,19 +546,19 @@ proc CreateBuffer stdcall, format:dword, size:dword
mov dword [edi+STREAM.time_stamp+4], ebx mov dword [edi+STREAM.time_stamp+4], ebx
mov dword [edi+STREAM.last_ts], ebx mov dword [edi+STREAM.last_ts], ebx
stdcall AllocPages, dword 64/4 invoke AllocPages, dword 64/4
mov edi, [str] mov edi, [str]
mov ebx, [edi+STREAM.out_base] mov ebx, [edi+STREAM.out_base]
mov ecx, 16 mov ecx, 16
or eax, PG_SW or eax, PG_SW
push eax push eax
push ebx push ebx
call CommitPages ;eax, ebx, ecx invoke CommitPages ;eax, ebx, ecx
mov ecx, 16 mov ecx, 16
pop ebx pop ebx
pop eax pop eax
add ebx, 64*1024 add ebx, 64*1024
call CommitPages ;double mapped invoke CommitPages ;double mapped
mov edi, [str] mov edi, [str]
mov ecx, [edi+STREAM.in_top] mov ecx, [edi+STREAM.in_top]
@ -599,7 +576,7 @@ proc CreateBuffer stdcall, format:dword, size:dword
xor esi, esi xor esi, esi
mov ecx, MANUAL_DESTROY mov ecx, MANUAL_DESTROY
call CreateEvent invoke CreateEvent
mov ebx, [str] mov ebx, [str]
mov [ebx+STREAM.notify_event], eax mov [ebx+STREAM.notify_event], eax
@ -647,12 +624,12 @@ DestroyBuffer:
mov [ecx+STREAM.str_fd], ebx mov [ecx+STREAM.str_fd], ebx
popf popf
stdcall KernelFree, [eax+STREAM.in_base] invoke KernelFree, [eax+STREAM.in_base]
mov eax, [.handle] mov eax, [.handle]
stdcall KernelFree, [eax+STREAM.out_base] invoke KernelFree, [eax+STREAM.out_base]
pop eax ;restore stack pop eax ;restore stack
call DestroyObject ;eax= stream invoke DestroyObject ;eax= stream
xor eax, eax xor eax, eax
ret ret
.fail: .fail:
@ -833,7 +810,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
jne @F jne @F
lea eax, [fpu_state+15] lea eax, [fpu_state+15]
and eax, -16 and eax, -16
call FpuSave invoke FpuSave
mov [state_saved], 1 mov [state_saved], 1
@@: @@:
stdcall refill, edx stdcall refill, edx
@ -853,7 +830,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
mov edx, [str] mov edx, [str]
mov eax, [edx+STREAM.notify_event] mov eax, [edx+STREAM.notify_event]
mov ebx, [edx+STREAM.notify_id] mov ebx, [edx+STREAM.notify_id]
call WaitEvent ;eax ebx invoke WaitEvent ;eax ebx
jmp .main_loop jmp .main_loop
.done: .done:
cmp [state_saved], 1 cmp [state_saved], 1
@ -861,7 +838,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword
lea eax, [fpu_state+15] lea eax, [fpu_state+15]
and eax, -16 and eax, -16
call FpuRestore invoke FpuRestore
@@: @@:
xor eax, eax xor eax, eax
ret ret
@ -1156,7 +1133,7 @@ proc play_buffer stdcall, str:dword, flags:dword
.wait: .wait:
mov eax, [edx+STREAM.notify_event] mov eax, [edx+STREAM.notify_event]
mov ebx, [edx+STREAM.notify_id] mov ebx, [edx+STREAM.notify_id]
call WaitEvent ;eax ebx invoke WaitEvent ;eax ebx
mov edx, [str] mov edx, [str]
cmp [edx+STREAM.flags], SND_STOP cmp [edx+STREAM.flags], SND_STOP
@ -1182,7 +1159,7 @@ proc stop_buffer stdcall, str:dword
mov eax, [edx+STREAM.notify_event] mov eax, [edx+STREAM.notify_event]
mov ebx, [edx+STREAM.notify_id] mov ebx, [edx+STREAM.notify_id]
call ClearEvent ;eax ebx invoke ClearEvent ;eax ebx
xor eax, eax xor eax, eax
ret ret
@ -1315,7 +1292,7 @@ proc set_handler stdcall, hsrv:dword, handler_proc:dword
mov [out_size], 0 mov [out_size], 0
lea eax, [handler] lea eax, [handler]
stdcall ServiceHandler, eax invoke ServiceHandler, eax
ret ret
endp endp
@ -1342,7 +1319,7 @@ proc dev_play stdcall, hsrv:dword
mov [out_size], ebx mov [out_size], ebx
lea eax, [handle] lea eax, [handle]
stdcall ServiceHandler, eax invoke ServiceHandler, eax
ret ret
endp endp
@ -1441,7 +1418,6 @@ vol_min dd 0x0000D8F0,0x0000D8F0
pan_max dd 0x00002710,0x00002710 pan_max dd 0x00002710,0x00002710
;stream_map dd 0xFFFF ; 16 ;stream_map dd 0xFFFF ; 16
version dd (5 shl 16) or SOUND_VERSION
szInfinity db 'INFINITY',0 szInfinity db 'INFINITY',0
szSound db 'SOUND',0 szSound db 'SOUND',0
@ -1457,7 +1433,11 @@ msgWaveout db 'Play waveout', 13,10,0
msgSetVolume db 'Set volume',13,10,0 msgSetVolume db 'Set volume',13,10,0
end if end if
section '.data' data readable writable align 16 align 4
data fixups
end data
section '.data' data readable writable
play_list rd 16 play_list rd 16
mix_input rd 16 mix_input rd 16

View File

@ -1,6 +1,6 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2006-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2006-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
@ -27,7 +27,7 @@ proc new_mix stdcall, output:dword
lea eax, [fpu_state+16] lea eax, [fpu_state+16]
and eax, -16 ;must be 16b aligned and eax, -16 ;must be 16b aligned
call FpuSave invoke FpuSave
call update_streams call update_streams
.mix: .mix:
@ -66,7 +66,7 @@ end if
.exit: .exit:
lea eax, [fpu_state+16] lea eax, [fpu_state+16]
and eax, -16 and eax, -16
call FpuRestore invoke FpuRestore
ret ret
.done: .done:
mov ecx, [main_count] mov ecx, [main_count]
@ -196,7 +196,7 @@ proc refill stdcall, str:dword
mov ebx, [ebx+STREAM.notify_id] mov ebx, [ebx+STREAM.notify_id]
mov edx, EVENT_WATCHED mov edx, EVENT_WATCHED
xor esi, esi xor esi, esi
call RaiseEvent ;eax, ebx, edx, esi invoke RaiseEvent ;eax, ebx, edx, esi
.exit: .exit:
ret ret
endp endp
@ -267,7 +267,7 @@ proc refill_ring stdcall, str:dword
mov ebx, [ebx+STREAM.notify_id] mov ebx, [ebx+STREAM.notify_id]
xor edx, edx xor edx, edx
call RaiseEvent ;eax, ebx, edx, esi invoke RaiseEvent ;eax, ebx, edx, esi
.exit: .exit:
ret ret
endp endp

View File

@ -500,10 +500,9 @@ include '../../peimport.inc'
include 'CODEC_H.INC' include 'CODEC_H.INC'
entry START entry START
section '.flat' readable writable executable
;proc START stdcall, state:dword ;proc START c, reason:dword, cmdline:dword
proc START c, state:dword, cmdline:dword proc START
push ebx esi ; save used registers to be stdcall push ebx esi ; save used registers to be stdcall
virtual at esp virtual at esp
rd 2 ; saved registers rd 2 ; saved registers
@ -512,8 +511,8 @@ virtual at esp
.cmdline dd ? ; normally NULL .cmdline dd ? ; normally NULL
end virtual end virtual
; 1. Check the reason for the call, do nothing unless initializing. ; 1. Check the reason for the call, do nothing unless initializing.
;cmp [.reason], DRV_ENTRY cmp [.reason], DRV_ENTRY
;jne .stop jne .stop
if DEBUG if DEBUG
mov esi, msgTV mov esi, msgTV

View File

@ -1,17 +1,17 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
format MS COFF format PE DLL native 0.05
entry START
include '../struct.inc'
DEBUG equ 1 DEBUG equ 1
include 'proc32.inc'
include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
DEBUG_IRQ equ 0 DEBUG_IRQ equ 0
@ -274,35 +274,21 @@ struc CTRL_INFO
.codec_id dd ? .codec_id dd ?
} }
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
public START section '.flat' code readable executable
public service_proc include '../macros.inc'
public version include '../proc32.inc'
include '../peimport.inc'
section '.flat' code readable align 16 proc START c uses ebx esi edi, state:dword, cmdline:dword
proc START stdcall, state:dword
cmp [state], 1 cmp [state], 1
jne .stop jne .stop
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call detect_controller call detect_controller
@ -311,9 +297,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov esi, [ctrl.vendor_ids] mov esi, [ctrl.vendor_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
@ -329,10 +315,10 @@ proc START stdcall, state:dword
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr invoke SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone mov esi, msgDone
call SysMsgBoardStr invoke SysMsgBoardStr
if IRQ_REMAP if IRQ_REMAP
pushf pushf
@ -360,23 +346,23 @@ proc START stdcall, state:dword
mov [ctrl.int_line], IRQ_LINE mov [ctrl.int_line], IRQ_LINE
popf popf
mov esi, msgRemap mov esi, msgRemap
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov ebx, [ctrl.int_line] mov ebx, [ctrl.int_line]
stdcall AttachIntHandler, ebx, ac97_irq, dword 0 invoke AttachIntHandler, ebx, ac97_irq, 0
.reg: .reg:
stdcall RegService, sz_sound_srv, service_proc invoke RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg: .fail_msg:
call SysMsgBoardStr invoke SysMsgBoardStr
xor eax, eax xor eax, eax
ret ret
.stop: .stop:
@ -413,7 +399,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgPlay mov esi, msgPlay
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call play call play
ret ret
@ -422,7 +408,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgStop mov esi, msgStop
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call stop call stop
ret ret
@ -484,7 +470,7 @@ proc ac97_irq
if DEBUG_IRQ if DEBUG_IRQ
mov esi, msgIRQ mov esi, msgIRQ
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov edx, CTRL_STAT mov edx, CTRL_STAT
@ -508,9 +494,9 @@ proc ac97_irq
.do_intr: .do_intr:
push eax push eax
mov edx, PCM_OUT_CR_REG ; mov edx, PCM_OUT_CR_REG
mov al, 0x10; 0x10 ; mov al, 0x10; 0x10
call [ctrl.ctrl_write8] ; call [ctrl.ctrl_write8]
mov ax, 0x1c mov ax, 0x1c
mov edx, PCM_OUT_SR_REG mov edx, PCM_OUT_SR_REG
@ -531,19 +517,16 @@ proc ac97_irq
mov edx, PCM_OUT_LVI_REG mov edx, PCM_OUT_LVI_REG
call [ctrl.ctrl_write8] call [ctrl.ctrl_write8]
mov edx, PCM_OUT_CR_REG ; mov edx, PCM_OUT_CR_REG
mov ax, 0x11 ;0x1D ; mov ax, 0x11 ;0x1D
call [ctrl.ctrl_write8] ; call [ctrl.ctrl_write8]
mov eax, [civ_val]
add eax, 1
and eax, 31
mov ebx, dword [buff_list+eax*4]
cmp [ctrl.user_callback], 0 cmp [ctrl.user_callback], 0
je .done je .done
stdcall [ctrl.user_callback], ebx mov eax, [ctrl.lvi_reg]
stdcall [ctrl.user_callback], [buff_list+eax*4]
.done: .done:
pop eax pop eax
and eax, 0x40 and eax, 0x40
@ -552,16 +535,16 @@ proc ac97_irq
or eax, 1 or eax, 1
ret ret
.skip: .skip:
mov edx, PCM_OUT_CR_REG ; mov edx, PCM_OUT_CR_REG
mov ax, 0x11 ;0x1D ; mov ax, 0x11 ;0x1D
call [ctrl.ctrl_write8] ; call [ctrl.ctrl_write8]
jmp .done jmp .done
endp endp
align 4 align 4
proc create_primary_buff proc create_primary_buff
stdcall KernelAlloc, 0x10000 invoke KernelAlloc, 0x10000
mov [ctrl.buffer], eax mov [ctrl.buffer], eax
mov edi, eax mov edi, eax
@ -571,7 +554,7 @@ proc create_primary_buff
rep stosd rep stosd
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
mov ebx, 0xC0002000 mov ebx, 0xC0002000
mov ecx, 4 mov ecx, 4
@ -624,7 +607,7 @@ proc create_primary_buff
mov eax, pcmout_bdl mov eax, pcmout_bdl
mov ebx, eax mov ebx, eax
call GetPgAddr ;eax invoke GetPgAddr ;eax
and ebx, 0xFFF and ebx, 0xFFF
add eax, ebx add eax, ebx
@ -640,59 +623,36 @@ endp
align 4 align 4
proc detect_controller proc detect_controller
locals push ebx edi
last_bus dd ? invoke GetPCIList
bus dd ? mov ebx, eax
devfn dd ?
endl
xor eax, eax
mov [bus], eax
inc eax
call PciApi
cmp eax, -1
je .err
mov [last_bus], eax
.next_bus:
and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 mov eax, [eax+PCIDEV.fd]
test eax, eax cmp eax, ebx
jz .next jz .not_found
cmp eax, -1 mov edx, [eax+PCIDEV.vendor_device_id]
je .next
mov edi, devices mov edi, devices
@@: @@:
mov ebx, [edi] cmp dword [edi], 0
test ebx, ebx jz .next_dev
jz .next cmp edx, [edi]
jz .found
cmp eax, ebx
je .found
add edi, 12 add edi, 12
jmp @B jmp @B
.next:
inc [devfn] .not_found:
cmp [devfn], 256
jb .next_dev
mov eax, [bus]
inc eax
mov [bus], eax
cmp eax, [last_bus]
jna .next_bus
xor eax, eax xor eax, eax
pop edi ebx
ret ret
.found: .found:
mov ebx, [bus] movzx ebx, [eax+PCIDEV.bus]
mov [ctrl.bus], ebx mov [ctrl.bus], ebx
mov ecx, [devfn] movzx ecx, [eax+PCIDEV.devfn]
mov [ctrl.devfn], ecx mov [ctrl.devfn], ecx
mov edx, eax mov eax, edx
and edx, 0xFFFF and edx, 0xFFFF
mov [ctrl.vendor], edx mov [ctrl.vendor], edx
shr eax, 16 shr eax, 16
@ -700,29 +660,32 @@ proc detect_controller
mov ebx, [edi+4] mov ebx, [edi+4]
mov [ctrl.ctrl_ids], ebx mov [ctrl.ctrl_ids], ebx
mov esi, [edi+8] mov eax, [edi+8]
mov [ctrl.ctrl_setup], esi mov [ctrl.ctrl_setup], eax
cmp edx, VID_INTEL cmp edx, VID_INTEL
jne @F jne @F
mov [ctrl.vendor_ids], msg_Intel mov [ctrl.vendor_ids], msg_Intel
pop edi ebx
ret ret
@@: @@:
cmp edx, VID_NVIDIA cmp edx, VID_NVIDIA
jne @F jne @F
mov [ctrl.vendor_ids], msg_NVidia mov [ctrl.vendor_ids], msg_NVidia
pop edi ebx
ret ret
@@: @@:
.err: .err:
xor eax, eax xor eax, eax
mov [ctrl.vendor_ids], eax ;something wrong ? mov [ctrl.vendor_ids], eax ;something wrong ?
pop edi ebx
ret ret
endp endp
align 4 align 4
proc init_controller proc init_controller
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
mov ebx, eax mov ebx, eax
and eax, 0xFFFF and eax, 0xFFFF
mov [ctrl.pci_cmd], eax mov [ctrl.pci_cmd], eax
@ -730,55 +693,55 @@ proc init_controller
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd mov esi, msgPciCmd
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgPciStat mov esi, msgPciStat
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [ctrl.pci_stat] mov eax, [ctrl.pci_stat]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgMixIsaIo mov esi, msgMixIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFFE and eax, 0xFFFE
mov [ctrl.codec_io_base], eax mov [ctrl.codec_io_base], eax
mov esi, msgCtrlIsaIo mov esi, msgCtrlIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x14
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFC0 and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
mov esi, msgMixMMIo mov esi, msgMixMMIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x18
mov [ctrl.codec_mem_base], eax mov [ctrl.codec_mem_base], eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgCtrlMMIo mov esi, msgCtrlMMIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x1C
mov [ctrl.ctrl_mem_base], eax mov [ctrl.ctrl_mem_base], eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
if 0 if 0
@ -787,11 +750,11 @@ if 0
jne .default jne .default
mov esi, msgIrqMap mov esi, msgIrqMap
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead8, 0, 0xF8, 0x61 invoke PciRead8, 0, 0xF8, 0x61
and eax, 0xFF and eax, 0xFF
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
btr eax, 7 ;when bit 7 set remap disabled btr eax, 7 ;when bit 7 set remap disabled
jnc @F jnc @F
xor eax, eax xor eax, eax
@ -799,12 +762,12 @@ if 0
end if end if
.default: .default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C invoke PciRead32, [ctrl.bus], [ctrl.devfn], 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 invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41
and eax, 0xFF and eax, 0xFF
mov [ctrl.cfg_reg], eax mov [ctrl.cfg_reg], eax
@ -837,10 +800,10 @@ PG_NOCACHE equ 0x018
align 4 align 4
proc set_ICH4 proc set_ICH4
stdcall MapIoMem, [ctrl.codec_mem_base], 0x1000, PG_SW+PG_NOCACHE invoke MapIoMem, [ctrl.codec_mem_base], 0x1000, PG_SW+PG_NOCACHE
mov [ctrl.codec_mem_base], eax mov [ctrl.codec_mem_base], eax
stdcall MapIoMem, [ctrl.ctrl_mem_base], 0x1000, PG_SW+PG_NOCACHE invoke MapIoMem, [ctrl.ctrl_mem_base], 0x1000, PG_SW+PG_NOCACHE
mov [ctrl.ctrl_mem_base], eax mov [ctrl.ctrl_mem_base], eax
mov [ctrl.codec_read16], codec_mem_r16 ;virtual mov [ctrl.codec_read16], codec_mem_r16 ;virtual
@ -888,21 +851,21 @@ proc init_codec
endl endl
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, GLOB_CTRL mov edx, GLOB_CTRL
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
cmp eax, 0xFFFFFFFF cmp eax, 0xFFFFFFFF
je .err je .err
@ -968,14 +931,14 @@ proc reset_codec
if DEBUG if DEBUG
mov esi, msgCFail mov esi, msgCFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax ; timeout error xor eax, eax ; timeout error
ret ret
.ok: .ok:
if DEBUG if DEBUG
mov esi, msgResetOk mov esi, msgResetOk
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
@ -995,7 +958,7 @@ proc warm_reset
if DEBUG if DEBUG
mov esi, msgWarm mov esi, msgWarm
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov [counter], 10 ; total 10*100 ms = 1s mov [counter], 10 ; total 10*100 ms = 1s
@ -1013,7 +976,7 @@ proc warm_reset
if DEBUG if DEBUG
mov esi, msgWRFail mov esi, msgWRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
stc stc
@ -1035,7 +998,7 @@ proc cold_reset
if DEBUG if DEBUG
mov esi, msgCold mov esi, msgCold
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, 400000 ; wait 400 ms mov eax, 400000 ; wait 400 ms
@ -1057,7 +1020,7 @@ proc cold_reset
if DEBUG if DEBUG
mov esi, msgCRFail mov esi, msgCRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
@ -1065,21 +1028,21 @@ proc cold_reset
ret ret
.ok: .ok:
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, GLOB_CTRL mov edx, GLOB_CTRL
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
test eax, CTRL_ST_CREADY test eax, CTRL_ST_CREADY
@ -1438,8 +1401,6 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH
dd 0 ;terminator dd 0 ;terminator
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
msg_ICH db '802801AA (ICH)', 13,10, 0 msg_ICH db '802801AA (ICH)', 13,10, 0
msg_ICH0 db '802801AB (ICH0)', 13,10, 0 msg_ICH0 db '802801AB (ICH0)', 13,10, 0
msg_ICH2 db '802801BA (ICH2)', 13,10, 0 msg_ICH2 db '802801BA (ICH2)', 13,10, 0
@ -1495,7 +1456,11 @@ msgCtrlMMIo db 'controller mmio base ',0
msgMixMMIo db 'codec mmio base ',0 msgMixMMIo db 'codec mmio base ',0
msgIrqMap db 'AC97 irq map as ',0 msgIrqMap db 'AC97 irq map as ',0
section '.data' data readable writable align 16 align 4
data fixups
end data
section '.data' data readable writable
pcmout_bdl rq 32 pcmout_bdl rq 32
buff_list rd 32 buff_list rd 32

View File

@ -1,18 +1,15 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;; ;; ;;
;; Copyright (C) KolibriOS team 2004-2011. All rights reserved. ;; ;; Copyright (C) KolibriOS team 2004-2014. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;; ;; Distributed under terms of the GNU General Public License ;;
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
format MS COFF format PE DLL native 0.05
entry START
DEBUG equ 1 DEBUG equ 1
include 'proc32.inc'
include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
DEBUG_IRQ equ 0 DEBUG_IRQ equ 0
@ -30,7 +27,7 @@ if USE_COM_IRQ
ATTCH_IRQ equ 0000111010111000b ATTCH_IRQ equ 0000111010111000b
end if end if
CPU_FREQ equ 2600d CPU_FREQ equ 2000d
BIT0 EQU 0x00000001 BIT0 EQU 0x00000001
BIT1 EQU 0x00000002 BIT1 EQU 0x00000002
@ -251,35 +248,23 @@ struc CTRL_INFO
.codec_id dd ? .codec_id dd ?
} }
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
public START section '.flat' code readable writable executable
public service_proc include '../struct.inc'
public version include '../macros.inc'
include '../proc32.inc'
include '../peimport.inc'
section '.flat' code readable align 16
proc START stdcall, state:dword proc START c uses ebx esi edi, state:dword, cmdline:dword
cmp [state], 1 cmp [state], 1
jne .stop jne .stop
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call detect_controller call detect_controller
@ -288,9 +273,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov esi, [ctrl.vendor_ids] mov esi, [ctrl.vendor_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
@ -306,10 +291,10 @@ proc START stdcall, state:dword
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr invoke SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone mov esi, msgDone
call SysMsgBoardStr invoke SysMsgBoardStr
if IRQ_REMAP if IRQ_REMAP
pushf pushf
@ -322,13 +307,13 @@ proc START stdcall, state:dword
test ebx, ebx test ebx, ebx
jz .skip jz .skip
bts ax, bx ;mask old line bts ax, bx ;mask old line
.skip .skip:
bts ax, IRQ_LINE ;mask new ine bts ax, IRQ_LINE ;mask new ine
out 0x21, al out 0x21, al
mov al, ah mov al, ah
out 0xA1, al out 0xA1, al
;remap IRQ ;remap IRQ
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE invoke PciWrite8, 0, 0xF8, 0x61, IRQ_LINE
mov dx, 0x4d0 ;8259 ELCR1 mov dx, 0x4d0 ;8259 ELCR1
in al, dx in al, dx
@ -337,7 +322,7 @@ proc START stdcall, state:dword
mov [ctrl.int_line], IRQ_LINE mov [ctrl.int_line], IRQ_LINE
popf popf
mov esi, msgRemap mov esi, msgRemap
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, VALID_IRQ mov eax, VALID_IRQ
@ -350,19 +335,19 @@ proc START stdcall, state:dword
bt eax, ebx bt eax, ebx
jnc .fail_msg jnc .fail_msg
stdcall AttachIntHandler, ebx, ac97_irq, dword 0 invoke AttachIntHandler, ebx, ac97_irq, 0
.reg: .reg:
stdcall RegService, sz_sound_srv, service_proc invoke RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg: .fail_msg:
call SysMsgBoardStr invoke SysMsgBoardStr
xor eax, eax xor eax, eax
ret ret
.stop: .stop:
@ -399,7 +384,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgPlay mov esi, msgPlay
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call play call play
ret ret
@ -408,7 +393,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgStop mov esi, msgStop
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call stop call stop
ret ret
@ -455,7 +440,7 @@ proc ac97_irq
if DEBUG_IRQ if DEBUG_IRQ
mov esi, msgIRQ mov esi, msgIRQ
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov edx, PCM_OUT_CR_REG mov edx, PCM_OUT_CR_REG
@ -507,7 +492,7 @@ endp
align 4 align 4
proc create_primary_buff proc create_primary_buff
stdcall KernelAlloc, 0x10000 invoke KernelAlloc, 0x10000
mov [ctrl.buffer], eax mov [ctrl.buffer], eax
mov edi, eax mov edi, eax
@ -517,7 +502,7 @@ proc create_primary_buff
rep stosd rep stosd
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
mov ebx, 0xC0004000 mov ebx, 0xC0004000
mov ecx, 4 mov ecx, 4
@ -570,7 +555,7 @@ proc create_primary_buff
mov eax, pcmout_bdl mov eax, pcmout_bdl
mov ebx, eax mov ebx, eax
call GetPgAddr ;eax invoke GetPgAddr ;eax
and ebx, 0xFFF and ebx, 0xFFF
add eax, ebx add eax, ebx
@ -593,143 +578,132 @@ endp
align 4 align 4
proc detect_controller proc detect_controller
locals push ebx
last_bus dd ? invoke GetPCIList
bus dd ? mov ebx, eax
devfn dd ?
endl
xor eax, eax
mov [bus], eax
inc eax
call PciApi
cmp eax, -1
je .err
mov [last_bus], eax
.next_bus:
and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 mov eax, [eax+PCIDEV.fd]
test eax, eax
jz .next
cmp eax, -1
je .next
mov edi, devices
@@:
mov ebx, [edi]
test ebx, ebx
jz .next
cmp eax, ebx cmp eax, ebx
je .found je .err
add edi, 12 cmp [eax+PCIDEV.class], 0x060100 ;pci-isa
jmp @B jne .no_bridge
.next: movzx edx, [eax+PCIDEV.bus]
inc [devfn] mov [brg_bus], edx
cmp [devfn], 256 movzx edx, [eax+PCIDEV.devfn]
jb .next_dev mov [brg_devfn], edx
mov eax, [bus] .no_bridge:
inc eax mov edx, [eax+PCIDEV.vendor_device_id]
mov [bus], eax mov esi, devices
cmp eax, [last_bus] @@:
jna .next_bus cmp dword [esi], 0
jz .next_dev
cmp dword [esi], edx
jz .found
add esi, 12
jmp @b
.err:
xor eax, eax xor eax, eax
pop ebx
ret ret
.found: .found:
mov ebx, [bus] movzx ebx, [eax+PCIDEV.bus]
mov [ctrl.bus], ebx mov [ctrl.bus], ebx
mov ecx, [devfn] movzx ecx, [eax+PCIDEV.devfn]
mov [ctrl.devfn], ecx mov [ctrl.devfn], ecx
mov edx, eax mov eax, edx
and edx, 0xFFFF and edx, 0xFFFF
mov [ctrl.vendor], edx mov [ctrl.vendor], edx
shr eax, 16 shr eax, 16
mov [ctrl.dev_id], eax mov [ctrl.dev_id], eax
mov ebx, [edi+4] mov ebx, [esi+4]
mov [ctrl.ctrl_ids], ebx mov [ctrl.ctrl_ids], ebx
mov [ctrl.vendor_ids], msg_SIS mov [ctrl.vendor_ids], msg_SIS
mov esi, [edi+8] mov eax, [esi+8]
mov [ctrl.ctrl_setup], esi mov [ctrl.ctrl_setup], eax
ret pop ebx
.err:
xor eax, eax
ret ret
endp endp
align 4 align 4
proc init_controller proc init_controller
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4
mov ebx, eax mov ebx, eax
and eax, 0xFFFF or al, 5
invoke PciWrite16, [ctrl.bus], [ctrl.devfn], 4, eax
movzx eax, bx
mov [ctrl.pci_cmd], eax mov [ctrl.pci_cmd], eax
shr ebx, 16 shr ebx, 16
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd mov esi, msgPciCmd
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgPciStat mov esi, msgPciStat
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [ctrl.pci_stat] mov eax, [ctrl.pci_stat]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgMixIsaIo mov esi, msgMixIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x10
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFFE and eax, 0xFFFE
mov [ctrl.codec_io_base], eax mov [ctrl.codec_io_base], eax
mov esi, msgCtrlIsaIo mov esi, msgCtrlIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x14 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x14
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFC0 and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
mov esi, msgMixMMIo mov esi, msgMixMMIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x18 invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x18
mov [ctrl.codec_mem_base], eax mov [ctrl.codec_mem_base], eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgCtrlMMIo mov esi, msgCtrlMMIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x1C invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x1C
mov [ctrl.ctrl_mem_base], eax mov [ctrl.ctrl_mem_base], eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
.default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C
and eax, 0xFF cmp al, 0xFF
jnz @f
movzx eax, ah
add eax, 0x40
invoke PciWrite8, [brg_bus], [brg_devfn], eax, 5
invoke PciWrite8, [ctrl.bus], [ctrl.devfn], 0x3C, 5
mov al, 5
@@: @@:
and eax, 0xFF
mov [ctrl.int_line], eax mov [ctrl.int_line], eax
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41 invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41
and eax, 0xFF and eax, 0xFF
mov [ctrl.cfg_reg], eax mov [ctrl.cfg_reg], eax
@ -786,27 +760,27 @@ proc init_codec
endl endl
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, GLOB_CTRL mov edx, GLOB_CTRL
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
cmp eax, 0xFFFFFFFF cmp eax, 0xFFFFFFFF
je .err je .err
test eax, CTRL_ST_CREADY test eax, CTRL_ST_CREADY
jnz .done ;;;;;.ready jnz .ready
call reset_codec call reset_codec
test eax, eax test eax, eax
@ -866,7 +840,7 @@ proc reset_codec
if DEBUG if DEBUG
mov esi, msgCFail mov esi, msgCFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax ; timeout error xor eax, eax ; timeout error
ret ret
@ -888,7 +862,7 @@ proc warm_reset
if DEBUG if DEBUG
mov esi, msgWarm mov esi, msgWarm
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov [counter], 10 ; total 10*100 ms = 1s mov [counter], 10 ; total 10*100 ms = 1s
@ -906,7 +880,7 @@ proc warm_reset
if DEBUG if DEBUG
mov esi, msgWRFail mov esi, msgWRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
stc stc
@ -928,7 +902,7 @@ proc cold_reset
if DEBUG if DEBUG
mov esi, msgCold mov esi, msgCold
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, 400000 ; wait 400 ms mov eax, 400000 ; wait 400 ms
@ -950,7 +924,7 @@ proc cold_reset
if DEBUG if DEBUG
mov esi, msgCRFail mov esi, msgCRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
@ -958,21 +932,21 @@ proc cold_reset
ret ret
.ok: .ok:
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, GLOB_CTRL mov edx, GLOB_CTRL
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
mov edx, CTRL_STAT mov edx, CTRL_STAT
call [ctrl.ctrl_read32] call [ctrl.ctrl_read32]
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
test eax, CTRL_ST_CREADY test eax, CTRL_ST_CREADY
@ -1089,12 +1063,6 @@ endp
align 4 align 4
proc codec_write stdcall, ac_reg:dword proc codec_write stdcall, ac_reg:dword
push eax
call check_semafore
and eax, eax
jz .err
pop eax
mov esi, [ac_reg] mov esi, [ac_reg]
mov edx, esi mov edx, esi
call [ctrl.codec_write16] call [ctrl.codec_write16]
@ -1102,9 +1070,6 @@ proc codec_write stdcall, ac_reg:dword
shr esi, 1 shr esi, 1
bts [codec.shadow_flag], esi bts [codec.shadow_flag], esi
ret ret
.err:
pop eax
ret
endp endp
align 4 align 4
@ -1124,7 +1089,7 @@ proc codec_check_ready
endp endp
align 4 align 4
proc check_semafore proc check_semaphore
local counter:DWORD local counter:DWORD
mov [counter], 100 mov [counter], 100
@ -1180,15 +1145,27 @@ endp
align 4 align 4
proc codec_io_r16 proc codec_io_r16
push eax edx
call check_semaphore
test eax, eax
pop edx eax
jz .err
add edx, [ctrl.codec_io_base] add edx, [ctrl.codec_io_base]
in ax, dx in ax, dx
.err:
ret ret
endp endp
align 4 align 4
proc codec_io_w16 proc codec_io_w16
push eax edx
call check_semaphore
test eax, eax
pop edx eax
jz .err
add edx, [ctrl.codec_io_base] add edx, [ctrl.codec_io_base]
out dx, ax out dx, ax
.err:
ret ret
endp endp
@ -1257,8 +1234,6 @@ align 4
devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS
dd 0 dd 0
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
msg_AC db '7012 AC97 controller',13,10, 0 msg_AC db '7012 AC97 controller',13,10, 0
msg_SIS db 'Silicon Integrated Systems',13,10, 0 msg_SIS db 'Silicon Integrated Systems',13,10, 0
@ -1295,8 +1270,11 @@ msgCtrlMMIo db 'controller mmio base ',0
msgMixMMIo db 'codec mmio base ',0 msgMixMMIo db 'codec mmio base ',0
msgIrqMap db 'AC97 irq map as ',0 msgIrqMap db 'AC97 irq map as ',0
section '.data' data readable writable align 16 align 4
data fixups
end data
align 8
pcmout_bdl rq 32 pcmout_bdl rq 32
buff_list rd 32 buff_list rd 32
@ -1305,3 +1283,6 @@ ctrl AC_CNTRL
lpc_bus rd 1 lpc_bus rd 1
civ_val rd 1 civ_val rd 1
brg_bus dd ?
brg_devfn dd ?

View File

@ -1,289 +0,0 @@
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; ;;
;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;;
;; Distributed under terms of the GNU General Public License ;;
;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
AD_LOSEL equ BIT5
AD_HPSEL equ BIT10
align 4
proc detect_codec
locals
codec_id dd ?
endl
stdcall codec_read, dword 0x7C
shl eax, 16
mov [codec_id], eax
stdcall codec_read, dword 0x7E
or eax, [codec_id]
mov [codec.chip_id], eax
and eax, 0xFFFFFF00
mov edi, codecs
@@:
mov ebx, [edi]
test ebx, ebx
jz .unknown
cmp eax, ebx
jne .next
mov eax, [edi+4]
mov [codec.ac_vendor_ids], eax
mov esi, eax
call SysMsgBoardStr
stdcall detect_chip, [edi+8]
ret
.next:
add edi, 12
jmp @B
.unknown:
mov [codec.ac_vendor_ids], ac_unknown
mov [codec.chip_ids], chip_unknown
mov esi, chip_unknown
call SysMsgBoardStr
mov eax, [codec.chip_id]
call dword2str
call SysMsgBoardStr
ret
endp
align 4
proc detect_chip stdcall, chip_tab:dword
mov eax, [codec.chip_id]
and eax, 0xFF
mov edi, [chip_tab]
@@:
mov ebx, [edi]
cmp ebx, 0xFF
je .unknown
cmp eax,ebx
jne .next
mov eax, [edi+4]
mov [codec.chip_ids], eax
mov esi, eax
call SysMsgBoardStr
ret
.next:
add edi, 8
jmp @b
.unknown:
mov [codec.chip_ids], chip_unknown
mov esi, chip_unknown
call SysMsgBoardStr
mov eax, [codec.chip_id]
call dword2str
call SysMsgBoardStr
ret
endp
align 4
proc setup_codec
xor eax, eax
stdcall codec_write, dword CODEC_AUX_VOL
mov eax, 0x0B0B
stdcall codec_write, dword CODEC_MASTER_VOL_REG
mov ax, 0x08
stdcall codec_write, dword 0x0C
mov ax, 0x0808
stdcall codec_write, dword CODEC_PCM_OUT_REG
mov ax, 0x0808
stdcall codec_write, dword 0x10
mov ax, 0x0808
stdcall codec_write, dword 0x12
mov ax, 0x0808
stdcall codec_write, dword 0x16
stdcall codec_read, dword CODEC_EXT_AUDIO_CTRL_REG
and eax, 0FFFFh - BIT1 ; clear DRA (BIT1)
or eax, BIT0 ; set VRA (BIT0)
stdcall codec_write, dword CODEC_EXT_AUDIO_CTRL_REG
stdcall set_sample_rate, dword 48000
.init_error:
xor eax, eax ; exit with error
ret
endp
; param
; eax= volume -10000 - 0 for both channels
align 4
set_master_vol:
cmp eax, 0
jl @F
xor eax, eax
jmp .set
@@:
cmp eax, -9450
jg .set
mov eax, -9450 ;clamp into 6 bits
.set:
cdq
mov ebx, -150
idiv ebx
mov ah, al
stdcall codec_write, dword CODEC_MASTER_VOL_REG
xor eax, eax
ret
align 4
proc get_master_vol stdcall, pvol:dword
stdcall codec_read, dword CODEC_MASTER_VOL_REG
and eax, 0x3F
imul eax, -150
mov ebx, [pvol]
mov [ebx], eax
xor eax, eax
ret
endp
align 4
proc set_sample_rate stdcall, rate:dword
mov eax, [rate]
stdcall codec_write, dword CODEC_PCM_FRONT_DACRATE_REG
ret
endp
patch_AD:
stdcall codec_read, 0x76
or ax, BIT5+BIT10
stdcall codec_write, 0x76
ret
align 16
ac_unknown db 'unknown manufacturer',13,10,0
ac_Realtek db 'Realtek Semiconductor',13,10,0
ac_Analog db 'Analog Devices',13,10,0
ac_CMedia db 'C-Media Electronics',13,10,0
ac_Cirrus db 'Cirrus Logic',13,10,0
chip_unknown db 'unknown codec id ', 0
CHIP_ANALOG equ 0x41445300
CHIP_REALTEK equ 0x414C4700
CHIP_CMEDIA equ 0x434D4900
CHIP_CIRRUS equ 0x43525900
align 16
codecs dd CHIP_ANALOG, ac_Analog, chips_Analog
dd CHIP_CMEDIA, ac_CMedia, chips_CMedia
dd CHIP_REALTEK,ac_Realtek, chips_Realtek
dd CHIP_CIRRUS, ac_Cirrus, chips_Cirrus
dd 0
align 16
chips_Analog dd 0x03, chip_AD1819
dd 0x40, chip_AD1881
dd 0x48, chip_AD1881A
dd 0x60, chip_AD1884
dd 0x61, chip_AD1886
dd 0x62, chip_AD1887
dd 0x63, chip_AD1886A
dd 0x70, chip_AD1980
dd 0x75, chip_AD1985
dd 0xFF
chips_Realtek:
dd 0x10, chip_ALC201a
dd 0x20, chip_ALC650
dd 0x21, chip_ALC650D
dd 0x22, chip_ALC650E
dd 0x23, chip_ALC650F
dd 0x60, chip_ALC655
dd 0x80, chip_ALC658
dd 0x81, chip_ALC658D
dd 0x90, chip_ALC850
dd 0xFF
chips_CMedia dd 0x41, chip_CM9738
dd 0x61, chip_CM9739
dd 0x69, chip_CM9780
dd 0x78, chip_CM9761
dd 0x82, chip_CM9761
dd 0x83, chip_CM9761
dd 0xFF
chips_Cirrus dd 0x00, chip_CS4297
dd 0x10, chip_CS4297A
dd 0x20, chip_CS4298
dd 0x28, chip_CS4294
dd 0x30, chip_CS4299
dd 0x34, chip_CS4299D
dd 0x48, chip_CS4201
dd 0x58, chip_CS4205
dd 0x60, chip_CS4291
dd 0x70, chip_CS4202
dd 0xFF
align 16
;Analog Devices
chip_AD1819 db 'AD1819 ',0dh,0ah,00h
chip_AD1881 db 'AD1881 ',0dh,0ah,00h
chip_AD1881A db 'AD1881A',0dh,0ah,00h
chip_AD1884 db 'AD1885 ',0dh,0ah,00h
chip_AD1885 db 'AD1885 ',0dh,0ah,00h
chip_AD1886 db 'AD1886 ',0dh,0ah,00h
chip_AD1886A db 'AD1886A',0dh,0ah,00h
chip_AD1887 db 'AD1887 ',0dh,0ah,00h
chip_AD1980 db 'AD1980 ',0dh,0ah,00h
chip_AD1985 db 'AD1985 ',0dh,0ah,00h
;Realtek
chip_ALC201a db 'ALC201a',0dh,0ah,00h
chip_ALC650 db 'ALC650 ',0dh,0ah,00h
chip_ALC650D db 'ALC650D',0dh,0ah,00h
chip_ALC650E db 'ALC650E',0dh,0ah,00h
chip_ALC650F db 'ALC650F',0dh,0ah,00h
chip_ALC655 db 'ALC655 ',0dh,0ah,00h
chip_ALC658 db 'ALC658 ',0dh,0ah,00h
chip_ALC658D db 'ALC658D',0dh,0ah,00h
chip_ALC850 db 'ALC850 ',0dh,0ah,00h
;CMedia
chip_CM9738 db 'CMI9738', 0dh,0ah,0
chip_CM9739 db 'CMI9739', 0dh,0ah,0
chip_CM9780 db 'CMI9780', 0dh,0ah,0
chip_CM9761 db 'CMI9761', 0dh,0ah,0
;Cirrus
chip_CS4297 db 'CS4297',13,10,0
chip_CS4297A db 'CS4297A',13,10,0
chip_CS4298 db 'CS4298',13,10,0
chip_CS4294 db 'CS4294',13,10,0
chip_CS4299 db 'CS4299',13,10,0
chip_CS4299D db 'CS4299D',13,10,0
chip_CS4201 db 'CS4201',13,10,0
chip_CS4205 db 'CS4205',13,10,0
chip_CS4291 db 'CS4291',13,10,0
chip_CS4202 db 'CS4202',13,10,0

View File

@ -1,14 +0,0 @@
Немного переделал драйвер звука для чипа SIS
-добавил подключение PCI устройства к контроллеру прерывания
(БИОС неназначил номер прерывания) назначается IRQ 5
-изменил чтение регистра кодека (считывание и запись производится через 'семафор')
в остальном оставил все как есть :)
SIS.obj - просто бинарник
sis.asm - исходник
codec.inc - (добавил номер определения своего кодека)
G@K

File diff suppressed because it is too large Load Diff

View File

@ -11,10 +11,10 @@ entry START
DEBUG = 1 DEBUG = 1
section '.flat' code readable writable executable section '.flat' code readable writable executable
include '../proc32.inc' include '../proc32.inc'
include '../struct.inc' include '../struct.inc'
include '../macros.inc' include '../macros.inc'
include '../peimport.inc'
VID_INTEL = 0x8086 VID_INTEL = 0x8086
VID_NVIDIA = 0x10DE VID_NVIDIA = 0x10DE
@ -160,20 +160,27 @@ struct SRV
ends ends
proc START c, state:dword, cmdline:dword proc START c uses ebx esi edi, state:dword, cmdline:dword
mov eax, [srv_entry]
cmp [state], 1 cmp [state], 1
jne .fail jne .stop
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
invoke SysMsgBoardStr invoke SysMsgBoardStr
end if end if
test eax, eax
jnz .done
call detect_controller call detect_controller
ret ret
.stop:
.fail: test eax, eax
jz .done
leave
jmp eax
.done:
xor eax, eax xor eax, eax
ret ret
endp endp
@ -229,10 +236,6 @@ endl
mov [bus], eax mov [bus], eax
cmp eax, [last_bus] cmp eax, [last_bus]
jna .next_bus jna .next_bus
if DEBUG
mov esi, msgNotFound
invoke SysMsgBoardStr
end if
xor eax, eax xor eax, eax
ret ret
.found: .found:
@ -402,13 +405,10 @@ emu10k1x db 'EMU10K1X', 0
intelhda db 'INTEL_HDA', 0 intelhda db 'INTEL_HDA', 0
msgInit db 'Detecting hardware...',13,10,0 msgInit db 'Detecting hardware...',13,10,0
msgNotFound db 'No compatible soundcard found!',13,10,0 msgFail db 'No compatible soundcard found!',13,10,0
msgFail db 'Failed',13,10,0
msgLoading db 'Loading ',0 msgLoading db 'Loading ',0
msgNewline db 13,10,0 msgNewline db 13,10,0
align 4 align 4
data fixups data fixups
end data end data
include '../peimport.inc'

View File

@ -5,13 +5,11 @@
;; ;; ;; ;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
format MS COFF format PE DLL native 0.05
entry START
DEBUG equ 1 DEBUG equ 1
include 'proc32.inc'
include 'imports.inc'
API_VERSION equ 0x01000100 API_VERSION equ 0x01000100
USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices USE_COM_IRQ equ 0 ;make irq 3 and irq 4 available for PCI devices
@ -311,35 +309,22 @@ struc CTRL_INFO
.codec_id dd ? .codec_id dd ?
} }
struc IOCTL
{ .handle dd ?
.io_code dd ?
.input dd ?
.inp_size dd ?
.output dd ?
.out_size dd ?
}
virtual at 0
IOCTL IOCTL
end virtual
EVENT_NOTIFY equ 0x00000200 EVENT_NOTIFY equ 0x00000200
public START section '.flat' code readable writable executable
public service_proc include '../struct.inc'
public version include '../macros.inc'
include '../proc32.inc'
include '../peimport.inc'
section '.flat' code readable align 16 proc START c, state:dword, cmdline:dword
proc START stdcall, state:dword
cmp [state], 1 cmp [state], 1
jne .stop jne .stop
if DEBUG if DEBUG
mov esi, msgInit mov esi, msgInit
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call detect_controller call detect_controller
@ -348,9 +333,9 @@ proc START stdcall, state:dword
if DEBUG if DEBUG
mov esi, [ctrl.vendor_ids] mov esi, [ctrl.vendor_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, [ctrl.ctrl_ids] mov esi, [ctrl.ctrl_ids]
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call init_controller call init_controller
@ -364,10 +349,10 @@ proc START stdcall, state:dword
call setup_codec call setup_codec
mov esi, msgPrimBuff mov esi, msgPrimBuff
call SysMsgBoardStr invoke SysMsgBoardStr
call create_primary_buff call create_primary_buff
mov esi, msgDone mov esi, msgDone
call SysMsgBoardStr invoke SysMsgBoardStr
if IRQ_REMAP if IRQ_REMAP
pushf pushf
@ -386,7 +371,7 @@ proc START stdcall, state:dword
mov al, ah mov al, ah
out 0xA1, al out 0xA1, al
stdcall PciWrite8, 0, 0xF8, 0x61, IRQ_LINE ;remap IRQ invoke PciWrite8, 0, 0xF8, 0x61, IRQ_LINE ;remap IRQ
mov dx, 0x4d0 ;8259 ELCR1 mov dx, 0x4d0 ;8259 ELCR1
in al, dx in al, dx
@ -395,7 +380,7 @@ proc START stdcall, state:dword
mov [ctrl.int_line], IRQ_LINE mov [ctrl.int_line], IRQ_LINE
popf popf
mov esi, msgRemap mov esi, msgRemap
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, VALID_IRQ mov eax, VALID_IRQ
@ -408,19 +393,19 @@ proc START stdcall, state:dword
bt eax, ebx bt eax, ebx
jnc .fail_msg jnc .fail_msg
stdcall AttachIntHandler, ebx, ac97_irq_VIA, dword 0 invoke AttachIntHandler, ebx, ac97_irq_VIA, 0
.reg: .reg:
stdcall RegService, sz_sound_srv, service_proc invoke RegService, sz_sound_srv, service_proc
ret ret
.fail: .fail:
if DEBUG if DEBUG
mov esi, msgFail mov esi, msgFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
ret ret
.fail_msg: .fail_msg:
call SysMsgBoardStr invoke SysMsgBoardStr
xor eax, eax xor eax, eax
ret ret
.stop: .stop:
@ -456,7 +441,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgPlay mov esi, msgPlay
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call play call play
ret ret
@ -465,7 +450,7 @@ proc service_proc stdcall, ioctl:dword
jne @F jne @F
if DEBUG if DEBUG
mov esi, msgStop mov esi, msgStop
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
call stop call stop
ret ret
@ -552,7 +537,7 @@ endp
align 4 align 4
proc create_primary_buff proc create_primary_buff
stdcall KernelAlloc, 0x10000 invoke KernelAlloc, 0x10000
mov [ctrl.buffer], eax mov [ctrl.buffer], eax
mov edi, eax mov edi, eax
@ -562,7 +547,7 @@ proc create_primary_buff
rep stosd rep stosd
mov eax, [ctrl.buffer] mov eax, [ctrl.buffer]
call GetPgAddr invoke GetPgAddr
mov edi, pcmout_bdl mov edi, pcmout_bdl
stosd stosd
mov eax, 0x80004000 mov eax, 0x80004000
@ -590,7 +575,7 @@ proc create_primary_buff
mov eax, pcmout_bdl mov eax, pcmout_bdl
mov ebx, eax mov ebx, eax
call GetPgAddr invoke GetPgAddr
and ebx, 0xFFF and ebx, 0xFFF
add eax, ebx add eax, ebx
@ -669,7 +654,7 @@ proc detect_controller
xor eax, eax xor eax, eax
mov [bus], eax mov [bus], eax
inc eax inc eax
call PciApi invoke PciApi
cmp eax, -1 cmp eax, -1
je .err je .err
@ -678,7 +663,7 @@ proc detect_controller
.next_bus: .next_bus:
and [devfn], 0 and [devfn], 0
.next_dev: .next_dev:
stdcall PciRead32, [bus], [devfn], dword 0 invoke PciRead32, [bus], [devfn], dword 0
test eax, eax test eax, eax
jz .next jz .next
cmp eax, -1 cmp eax, -1
@ -738,7 +723,7 @@ endp
align 4 align 4
proc init_controller proc init_controller
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 4
mov ebx, eax mov ebx, eax
and eax, 0xFFFF and eax, 0xFFFF
mov [ctrl.pci_cmd], eax mov [ctrl.pci_cmd], eax
@ -746,27 +731,27 @@ proc init_controller
mov [ctrl.pci_stat], ebx mov [ctrl.pci_stat], ebx
mov esi, msgPciCmd mov esi, msgPciCmd
call SysMsgBoardStr invoke SysMsgBoardStr
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgPciStat mov esi, msgPciStat
call SysMsgBoardStr invoke SysMsgBoardStr
mov eax, [ctrl.pci_stat] mov eax, [ctrl.pci_stat]
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgCtrlIsaIo mov esi, msgCtrlIsaIo
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
and eax, 0xFFC0 and eax, 0xFFC0
mov [ctrl.ctrl_io_base], eax mov [ctrl.ctrl_io_base], eax
.default: .default:
stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C
and eax, 0xFF and eax, 0xFF
@@: @@:
mov [ctrl.int_line], eax mov [ctrl.int_line], eax
@ -813,19 +798,19 @@ proc init_codec
endl endl
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
and eax, 0xFF and eax, 0xFF
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
and eax, 0xFF and eax, 0xFF
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
test eax, VIA_ACLINK_C00_READY test eax, VIA_ACLINK_C00_READY
@ -854,7 +839,7 @@ endp
align 4 align 4
proc reset_codec proc reset_codec
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, \ invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, \
VIA_ACLINK_CTRL_ENABLE or VIA_ACLINK_CTRL_RESET or VIA_ACLINK_CTRL_SYNC VIA_ACLINK_CTRL_ENABLE or VIA_ACLINK_CTRL_RESET or VIA_ACLINK_CTRL_SYNC
mov eax, 100000 ; wait 100 ms mov eax, 100000 ; wait 100 ms
call StallExec call StallExec
@ -864,14 +849,14 @@ proc reset_codec
if DEBUG if DEBUG
mov esi, msgCFail mov esi, msgCFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax ; timeout error xor eax, eax ; timeout error
ret ret
.ok: .ok:
if DEBUG if DEBUG
mov esi, msgResetOk mov esi, msgResetOk
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
xor eax, eax xor eax, eax
inc eax inc eax
@ -885,11 +870,11 @@ proc cold_reset
counter dd ? counter dd ?
endl endl
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword 0 invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword 0
if DEBUG if DEBUG
mov esi, msgCold mov esi, msgCold
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms
@ -897,11 +882,11 @@ proc cold_reset
;; ACLink on, deassert ACLink reset, VSR, SGD data out ;; ACLink on, deassert ACLink reset, VSR, SGD data out
;; note - FM data out has trouble with non VRA codecs !! ;; note - FM data out has trouble with non VRA codecs !!
stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword VIA_ACLINK_CTRL_INIT invoke PciWrite8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL, dword VIA_ACLINK_CTRL_INIT
mov [counter], 16 ; total 20*100 ms = 2s mov [counter], 16 ; total 20*100 ms = 2s
.wait: .wait:
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
test eax, VIA_ACLINK_C00_READY test eax, VIA_ACLINK_C00_READY
jnz .ok jnz .ok
@ -913,7 +898,7 @@ proc cold_reset
if DEBUG if DEBUG
mov esi, msgCRFail mov esi, msgCRFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
.fail: .fail:
@ -921,18 +906,18 @@ proc cold_reset
ret ret
.ok: .ok:
mov esi, msgControl mov esi, msgControl
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
mov esi, msgStatus mov esi, msgStatus
call SysMsgBoardStr invoke SysMsgBoardStr
stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT
and eax, 0xFF and eax, 0xFF
push eax push eax
call dword2str call dword2str
call SysMsgBoardStr invoke SysMsgBoardStr
pop eax pop eax
test eax, VIA_ACLINK_C00_READY ;CTRL_ST_CREADY test eax, VIA_ACLINK_C00_READY ;CTRL_ST_CREADY
@ -1087,7 +1072,7 @@ proc codec_read stdcall, ac_reg:dword ; reg = edx, reval = eax
.err: .err:
if DEBUG if DEBUG
mov esi, msgCInvalid mov esi, msgCInvalid
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
mov eax, -1 ; invalid codec error mov eax, -1 ; invalid codec error
ret ret
@ -1120,7 +1105,7 @@ proc codec_write stdcall, ac_reg:dword
.err: .err:
if DEBUG if DEBUG
mov esi, msgCFail mov esi, msgCFail
call SysMsgBoardStr invoke SysMsgBoardStr
end if end if
;mov eax, -1 ; codec not ready error ;mov eax, -1 ; codec not ready error
ret ret
@ -1244,8 +1229,6 @@ devices dd (CTRL_VT82C686 shl 16)+VID_VIA,msg_VT82C686,set_VIA
dd 0 ;terminator dd 0 ;terminator
version dd (5 shl 16) or (API_VERSION and 0xFFFF)
msg_VT82C686 db 'VT82C686', 13,10, 0 msg_VT82C686 db 'VT82C686', 13,10, 0
msg_VT8233 db 'VT8233', 13,10, 0 msg_VT8233 db 'VT8233', 13,10, 0
msg_VIA db 'VIA' , 13,10, 0 msg_VIA db 'VIA' , 13,10, 0
@ -1284,9 +1267,11 @@ msgCtrlIsaIo db 'controller io base ',0
;msgMixMMIo db 'codec mmio base ',0 ;msgMixMMIo db 'codec mmio base ',0
;msgIrqMap db 'AC97 irq map as ',0 ;msgIrqMap db 'AC97 irq map as ',0
align 4
data fixups
end data
section '.data' data readable writable align 16 align 8
pcmout_bdl rq 32 pcmout_bdl rq 32
buff_list rd 32 buff_list rd 32

View File

@ -1,438 +0,0 @@
; Stub of videodriver for RDC Semiconductor Co. M2010/M2012 videocards (controller names: R3306/R3308).
; It is used in SoC produced by DMP Electronics Inc.:
; Vortex86MX (contains RDC M2010 graphics card, appears in eBox-3300MX)
; Vortex86MX+ (contains RDC M2012 graphics card, appears in eBox-3310MX)
; Link to manufacturers websites -
; RDC Semiconductor Co.: http://www.rdc.com.tw
; DM&P Electronics Inc.: http://www.dmp.com.tw and http://www.compactpc.com.tw
; Code stolen from vidintel.asm driver (c) by CleverMouse and adapted for RDC.
; When the start procedure gets control,
; it tries to detect preferred resolution,
; sets the detected resolution assuming 32-bpp VESA mode and exits
; (without registering a service).
; Detection can be overloaded with compile-time settings
; use_predefined_mode/predefined_width/predefined_height.
; set predefined resolution here
use_predefined_mode = 0;1
predefined_width = 0;1366
predefined_height = 0;768
; standard driver stuff
format MS COFF
DEBUG = 1
include 'proc32.inc'
include 'imports.inc'
public START
public version
section '.flat' code readable align 16
; the start procedure (see the description above)
START:
; 1. Detect device. Abort if not found.
push esi
call DetectDevice
test esi, esi
jz .return0
;{START}yogev_ezra: temporary exit after detection
pusha
mov esi, exitmsg
call SysMsgBoardStr
popa
jmp .return0
;{END}yogev_ezra: temporary exit after detection
; 2. Detect optimal mode unless the mode is given explicitly. Abort if failed.
if use_predefined_mode = 0
call DetectMode
end if
cmp [width], 0
jz .return0_cleanup
; 3. Set the detected mode.
call SetMode
; 4. Cleanup and return.
.return0_cleanup:
stdcall FreeKernelSpace, esi
.return0:
pop esi
xor eax, eax
ret 4
; check that there is RDC videocard
; if so, map MMIO registers and set internal variables
; esi points to MMIO block; NULL means no device
DetectDevice:
; 1. Sanity check: check that we are dealing with RDC videocard.
; Integrated video device for RDC is always at PCI:0:13:0 (bus:dev:fn=0:0d:0)
xor esi, esi ; initialize return value to NULL
; 1a. Get PCI VendorID and DeviceID.
push esi ; in: reg=0 (register) -> register 00 means return DeviceID (bits 16-31) + VendorID (bits 0-15)
push 68h ; in: devfn=13:0 | device:5bit (0Dh = 1101) + func:3bit (0 = 000) -> total:1byte (1101000b = 68h)
push esi ; in: bus=0
call PciRead32
; 1b. loword(eax) = ax = VendorID, hiword(eax) = DeviceID.
; Test whether we have RDC Semiconductor Co. chipset.
cmp ax, 17F3h ;VendorID 0x17F3, 'RDC Semiconductor Co.'
jnz .return
; 1c. Say hi including DeviceID.
shr eax, 10h ; now, ax = HIWORD(eax) = PCI DeviceID
push edi
pusha
mov edi, pciid_text ; edi='0000'
call WriteWord
mov esi, hellomsg
call SysMsgBoardStr
popa
; 1d. Test whether we know this DeviceID.
; If this is the case, remember the position of the device in line of RDC cards;
; this knowledge will be useful later.
; Tested on devices with id: 17F3:2010, 17F3:2012.
mov ecx, pciids_num
mov edi, pciids
repnz scasw
pop edi
jnz .return_unknown_pciid
sub ecx, pciids_num - 1
neg ecx
mov [deviceType], ecx
; 1e. Continue saying hi with positive intonation.
pusha
mov esi, knownmsg
call SysMsgBoardStr
popa
; 2. Prepare MMIO region to control the card.
; 2a. Read MMIO physical address from PCI config space.
; According to RDC M2010/M2012 registers manual, their memory-mapped I/O space is located at Base address #1
push 14h ; in: reg=14h (register) -> register 14h means Base address #1 (BAR1) in PCI configuration space
push 68h ; in: devfn=13:0 | device:5bit (0Dh = 1101) + func:3bit (0 = 000) -> total:1byte (1101000b = 68h)
push esi ; in: bus=0
call PciRead32
; 2b. Mask out PCI region type, lower 4 bits.
and al, not 0xF
; 2c. Create virtual mapping of the physical memory.
push 1Bh
push 100000h
push eax
call MapIoMem
; 3. Return.
xchg esi, eax
.return:
ret
; 1f. If we do not know DeviceID, continue saying hi with negative intonation.
.return_unknown_pciid:
pusha
mov esi, unknownmsg
call SysMsgBoardStr
popa
ret
; Convert word in ax to hexadecimal text in edi, advance edi.
WriteWord:
; 1. Convert high byte.
push eax
mov al, ah
call WriteByte
pop eax
; 2. Convert low byte.
; Fall through to WriteByte; ret from WriteByte is ret from WriteWord too.
; Convert byte in al to hexadecimal text in edi, advance edi.
WriteByte:
; 1. Convert high nibble.
push eax
shr al, 4
call WriteNibble
pop eax
; 2. Convert low nibble.
and al, 0xF
; Fall through to WriteNibble; ret from WriteNibble is ret from WriteByte too.
; Convert nibble in al to hexadecimal text in edi, advance edi.
WriteNibble:
; Obvious, isn't it?
cmp al, 10
sbb al, 69h
das
stosb ; This instruction uses EDI implicitly
ret
if use_predefined_mode = 0
; detect resolution of the flat panel
DetectMode:
push esi edi
; 1. Get the location of block of GMBUS* registers.
; Starting with Ironlake, GMBUS* registers were moved.
add esi, 5100h
cmp [deviceType], pciids_num ;ironlake_start
jb @f
add esi, 0xC0000
@@:
; 2. Initialize GMBUS engine.
mov edi, edid
mov ecx, 0x10000
@@:
test byte [esi+8+1], 80h
loopnz @b
jnz .fail
mov dword [esi], 3
test byte [esi+8+1], 4
jz .noreset
call ResetGMBus
jnz .fail
.noreset:
; 3. Send read command.
and dword [esi+20h], 0
mov dword [esi+4], 4E8000A1h
; 4. Wait for data, writing to the buffer as data arrive.
.getdata:
mov ecx, 0x10000
@@:
test byte [esi+8+1], 8
loopz @b
test byte [esi+8+1], 4
jz .dataok
call ResetGMBus
jmp .fail
.dataok:
mov eax, [esi+0Ch]
stosd
cmp edi, edid+80h
jb .getdata
; 5. Wait for bus idle.
mov ecx, 0x10000
@@:
test byte [esi+8+1], 2
loopnz @b
; 6. We got EDID; dump it if DEBUG.
if DEBUG
pusha
xor ecx, ecx
mov esi, edid
mov edi, edid_text
.dumploop:
lodsb
call WriteByte
mov al, ' '
stosb
inc cl
test cl, 15
jnz @f
mov byte [edi-1], 13
mov al, 10
stosb
@@:
test cl, cl
jns .dumploop
mov esi, edidmsg
call SysMsgBoardStr
popa
end if
; 7. Test whether EDID is good.
; 7a. Signature: 00 FF FF FF FF FF FF 00.
mov esi, edid
cmp dword [esi], 0xFFFFFF00
jnz .fail
cmp dword [esi+4], 0x00FFFFFF
jnz .fail
; 7b. Checksum must be zero.
xor edx, edx
mov ecx, 80h
@@:
lodsb
add dl, al
loop @b
jnz .fail
; 8. Get width and height from EDID.
xor eax, eax
mov ah, [esi-80h+3Ah]
shr ah, 4
mov al, [esi-80h+38h]
mov [width], eax
mov ah, [esi-80h+3Dh]
shr ah, 4
mov al, [esi-80h+3Bh]
mov [height], eax
; 9. Return.
.fail:
pop edi esi
ret
; reset bus, clear all errors
ResetGMBus:
; look into the PRM
mov dword [esi+4], 80000000h
mov dword [esi+4], 0
mov ecx, 0x10000
@@:
test byte [esi+8+1], 2
loopnz @b
ret
end if
; set resolution [width]*[height]
SetMode:
; 1. Program the registers of videocard.
; look into the PRM
cli
; or byte [esi+7000Ah], 0Ch ; PIPEACONF: disable Display+Cursor Planes
; or byte [esi+7100Ah], 0Ch ; PIPEBCONF: disable Display+Cursor Planes
xor eax, eax
xor edx, edx
cmp [deviceType], pciids_num ;i965_start
jb @f
mov dl, 9Ch - 84h
@@:
; or byte [esi+71403h], 80h ; VGACNTRL: VGA Display Disable
and byte [esi+70080h], not 27h ; CURACNTR: disable cursor A
mov dword [esi+70084h], eax ; CURABASE: force write to CURA* regs
and byte [esi+700C0h], not 27h ; CURBCNTR: disable cursor B
mov dword [esi+700C4h], eax ; CURBBASE: force write to CURB* regs
and byte [esi+70183h], not 80h ; DSPACNTR: disable Primary A Plane
mov dword [esi+edx+70184h], eax ; DSPALINOFF/DSPASURF: force write to DSPA* regs
and byte [esi+71183h], not 80h ; DSPBCNTR: disable Primary B Plane
mov dword [esi+edx+71184h], eax ; DSPBLINOFF/DSPBSURF: force write to DSPB* regs
if 1
cmp [deviceType], pciids_num ;ironlake_start
jae .disable_pipes
mov edx, 10000h
or byte [esi+70024h], 2 ; PIPEASTAT: clear VBLANK status
or byte [esi+71024h], 2 ; PIPEBSTAT: clear VBLANK status
.wait_vblank_preironlake1:
mov ecx, 1000h
loop $
test byte [esi+7000Bh], 80h ; PIPEACONF: pipe A active?
jz @f
test byte [esi+70024h], 2 ; PIPEASTAT: got VBLANK?
jz .wait_vblank_preironlake2
@@:
test byte [esi+7100Bh], 80h ; PIPEBCONF: pipe B active?
jz .disable_pipes
test byte [esi+71024h], 2 ; PIPEBSTAT: got VBLANK?
jnz .disable_pipes
.wait_vblank_preironlake2:
dec edx
jnz .wait_vblank_preironlake1
jmp .not_disabled
.disable_pipes:
end if
and byte [esi+7000Bh], not 80h ; PIPEACONF: disable pipe
and byte [esi+7100Bh], not 80h ; PIPEBCONF: disable pipe
cmp [deviceType], pciids_num ;gen4_start
jb .wait_watching_scanline
; g45 and later: use special flag from PIPE*CONF
mov edx, 10000h
@@:
mov ecx, 1000h
loop $
test byte [esi+7000Bh], 40h ; PIPEACONF: wait until pipe disabled
jz @f
dec edx
jnz @b
jmp .not_disabled
@@:
test byte [esi+7100Bh], 40h ; PIPEBCONF: wait until pipe disabled
jz .disabled
mov ecx, 1000h
loop $
dec edx
jnz @b
jmp .not_disabled
; pineview and before: wait while scanline still changes
.wait_watching_scanline:
mov edx, 1000h
.dis1:
push dword [esi+71000h]
push dword [esi+70000h]
mov ecx, 10000h
loop $
pop eax
xor eax, [esi+70000h]
and eax, 1FFFh
pop eax
jnz .notdis1
xor eax, [esi+71000h]
and eax, 1FFFh
jz .disabled
.notdis1:
dec edx
jnz .dis1
.not_disabled:
sti
jmp .return
.disabled:
lea eax, [esi+61183h]
cmp [deviceType], pciids_num ;ironlake_start
jb @f
add eax, 0xE0000 - 0x60000
@@:
lea edx, [esi+60000h]
test byte [eax], 40h
jz @f
add edx, 1000h
@@:
mov eax, [width]
dec eax
shl eax, 16
mov ax, word [height]
dec eax
mov dword [edx+1Ch], eax ; PIPEASRC: set source image size
ror eax, 16
mov dword [edx+10190h], eax ; for old cards
mov ecx, [width]
add ecx, 15
and ecx, not 15
shl ecx, 2
mov dword [edx+10188h], ecx ; DSPASTRIDE: set scanline length
mov dword [edx+10184h], 0 ; DSPALINOFF: force write to DSPA* registers
and byte [esi+61233h], not 80h ; PFIT_CONTROL: disable panel fitting
or byte [edx+1000Bh], 80h ; PIPEACONF: enable pipe
; and byte [edx+1000Ah], not 0Ch ; PIPEACONF: enable Display+Cursor Planes
or byte [edx+10183h], 80h ; DSPACNTR: enable Display Plane A
sti
; 2. Notify the kernel that resolution has changed.
call GetDisplay
mov edx, [width]
mov dword [eax+8], edx
mov edx, [height]
mov dword [eax+0Ch], edx
mov [eax+18h], ecx
mov eax, [width]
dec eax
dec edx
call SetScreen
.return:
ret
align 4
hellomsg db 'RDC videocard detected, PciId=17F3:' ;VendorID 0x17F3, 'RDC Semiconductor Co.'
pciid_text db '0000'
db ', which is ', 0
knownmsg db 'known',13,10,0
unknownmsg db 'unknown',13,10,0
exitmsg db 'Card detected successfully, exiting driver...',13,10,0
if DEBUG
edidmsg db 'EDID successfully read:',13,10
edid_text rb 8*(16*3+1)
db 0
end if
version:
dd 0x50005
width dd predefined_width
height dd predefined_height
pciids:
dw 0x2010 ; M2010 - appears in eBox-3300MX (Vortex86MX SoC)
dw 0x2012 ; M2012 - appears in eBox-3310MX (Vortex86MX+ SoC)
pciids_num = ($ - pciids) / 2
align 4
deviceType dd ?
edid rb 0x80