From 11bd59473f515317c194757cade9a64c6d487f9b Mon Sep 17 00:00:00 2001 From: CleverMouse Date: Mon, 1 Sep 2014 11:21:04 +0000 Subject: [PATCH] * 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 --- data/common/Makefile.main | 11 +- .../trunk/drivers => drivers/audio}/codec.inc | 12 +- .../drivers => drivers/audio}/emu10k1x.asm | 107 +- .../trunk/drivers => drivers/audio}/fm801.asm | 101 +- .../audio/infinity}/infinity.asm | 130 +- .../audio/infinity}/main.inc | 0 .../audio/infinity}/mix_mmx.inc | 0 .../audio/infinity}/mix_sse2.inc | 0 .../audio/infinity}/mixer.asm | 10 +- drivers/audio/intel_hda/intel_hda.asm | 9 +- .../drivers => drivers/audio}/intelac97.asm | 241 ++- .../trunk/drivers => drivers/audio}/sis.asm | 265 ++-- drivers/audio/sisnbook/codec.inc | 289 ---- drivers/audio/sisnbook/readme.txt | 14 - drivers/audio/sisnbook/sis.asm | 1365 ----------------- drivers/audio/sound.asm | 26 +- .../drivers => drivers/audio}/vt823x.asm | 137 +- kernel/trunk/drivers/vidrdc.asm | 438 ------ 18 files changed, 466 insertions(+), 2689 deletions(-) rename {kernel/trunk/drivers => drivers/audio}/codec.inc (97%) rename {kernel/trunk/drivers => drivers/audio}/emu10k1x.asm (94%) rename {kernel/trunk/drivers => drivers/audio}/fm801.asm (93%) rename {kernel/trunk/drivers => drivers/audio/infinity}/infinity.asm (93%) rename {kernel/trunk/drivers => drivers/audio/infinity}/main.inc (100%) rename {kernel/trunk/drivers => drivers/audio/infinity}/mix_mmx.inc (100%) rename {kernel/trunk/drivers => drivers/audio/infinity}/mix_sse2.inc (100%) rename {kernel/trunk/drivers => drivers/audio/infinity}/mixer.asm (99%) rename {kernel/trunk/drivers => drivers/audio}/intelac97.asm (88%) rename {kernel/trunk/drivers => drivers/audio}/sis.asm (87%) delete mode 100644 drivers/audio/sisnbook/codec.inc delete mode 100644 drivers/audio/sisnbook/readme.txt delete mode 100644 drivers/audio/sisnbook/sis.asm rename {kernel/trunk/drivers => drivers/audio}/vt823x.asm (92%) delete mode 100644 kernel/trunk/drivers/vidrdc.asm diff --git a/data/common/Makefile.main b/data/common/Makefile.main index 96a04fd6d8..d4eddc4b1a 100644 --- a/data/common/Makefile.main +++ b/data/common/Makefile.main @@ -127,11 +127,6 @@ FASM_PROGRAMS:=\ 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/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/kfm:File|Managers/KFM:$(PROGS)/fs/kfm/trunk/kfm.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/sb16.sys:DRIVERS/SB16.SYS:$(REPOSITORY)/drivers/audio/sb16/sb16.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 # 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. diff --git a/kernel/trunk/drivers/codec.inc b/drivers/audio/codec.inc similarity index 97% rename from kernel/trunk/drivers/codec.inc rename to drivers/audio/codec.inc index 1a8b716ab6..e1329eb5a1 100644 --- a/kernel/trunk/drivers/codec.inc +++ b/drivers/audio/codec.inc @@ -36,7 +36,7 @@ proc detect_codec mov eax, [edi+4] mov [codec.ac_vendor_ids], eax mov esi, eax - call SysMsgBoardStr + invoke SysMsgBoardStr stdcall detect_chip, [edi+8] ret @@ -48,10 +48,10 @@ proc detect_codec mov [codec.chip_ids], chip_unknown mov esi, chip_unknown - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [codec.chip_id] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr ret endp @@ -72,7 +72,7 @@ proc detect_chip stdcall, chip_tab:dword mov eax, [edi+4] mov [codec.chip_ids], eax mov esi, eax - call SysMsgBoardStr + invoke SysMsgBoardStr ret .next: add edi, 8 @@ -80,10 +80,10 @@ proc detect_chip stdcall, chip_tab:dword .unknown: mov [codec.chip_ids], chip_unknown mov esi, chip_unknown - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [codec.chip_id] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr ret endp diff --git a/kernel/trunk/drivers/emu10k1x.asm b/drivers/audio/emu10k1x.asm similarity index 94% rename from kernel/trunk/drivers/emu10k1x.asm rename to drivers/audio/emu10k1x.asm index 8d934067fe..d622ce193c 100644 --- a/kernel/trunk/drivers/emu10k1x.asm +++ b/drivers/audio/emu10k1x.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -format MS COFF +format PE DLL native 0.05 +entry START DEBUG equ 1 -include 'proc32.inc' -include 'imports.inc' - API_VERSION equ 0x01000100 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 ? } -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 -public START -public service_proc -public version +section '.flat' code readable writable executable +include '../struct.inc' +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 jne .stop if DEBUG mov esi, msgInit - call SysMsgBoardStr + invoke SysMsgBoardStr end if call detect_controller @@ -352,9 +338,9 @@ proc START stdcall, state:dword if DEBUG mov esi, [ctrl.vendor_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr end if call init_controller @@ -368,10 +354,10 @@ proc START stdcall, state:dword call setup_codec mov esi, msgPrimBuff - call SysMsgBoardStr + invoke SysMsgBoardStr call create_primary_buff mov esi, msgDone - call SysMsgBoardStr + invoke SysMsgBoardStr if IRQ_REMAP pushf @@ -399,7 +385,7 @@ proc START stdcall, state:dword mov [ctrl.int_line], IRQ_LINE popf mov esi, msgRemap - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, VALID_IRQ @@ -412,21 +398,21 @@ proc START stdcall, state:dword bt eax, ebx jnc .fail_msg - stdcall AttachIntHandler, ebx, ac97_irq, dword 0 + invoke AttachIntHandler, ebx, ac97_irq, dword 0 stdcall create .reg: - stdcall RegService, sz_sound_srv, service_proc + invoke RegService, sz_sound_srv, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret .fail_msg: - call SysMsgBoardStr + invoke SysMsgBoardStr xor eax, eax ret .stop: @@ -462,7 +448,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgPlay - call SysMsgBoardStr + invoke SysMsgBoardStr end if call play ret @@ -471,7 +457,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgStop - call SysMsgBoardStr + invoke SysMsgBoardStr end if call stop ret @@ -543,7 +529,7 @@ endp align 4 proc create_primary_buff - stdcall KernelAlloc, 0x10000 + invoke KernelAlloc, 0x10000 mov [ctrl.buffer], eax mov edi, eax @@ -553,7 +539,7 @@ proc create_primary_buff rep stosd mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr mov edi, pcmout_bdl stosd @@ -565,7 +551,7 @@ proc create_primary_buff stosd ;1.] mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr stdcall ptr_write, PLAYBACK_POINTER, 0, 0 stdcall ptr_write, PLAYBACK_UNKNOWN1, 0, 0 @@ -574,7 +560,7 @@ proc create_primary_buff mov eax, pcmout_bdl mov ebx, eax - call GetPgAddr + invoke GetPgAddr and ebx, 0xFFF add eax, ebx @@ -601,7 +587,7 @@ proc detect_controller xor eax, eax mov [bus], eax inc eax - call PciApi + invoke PciApi cmp eax, -1 je .err @@ -610,7 +596,7 @@ proc detect_controller .next_bus: and [devfn], 0 .next_dev: - stdcall PciRead32, [bus], [devfn], dword 0 + invoke PciRead32, [bus], [devfn], dword 0 test eax, eax jz .next cmp eax, -1 @@ -670,13 +656,13 @@ endp align 4 proc init_controller - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x2C mov esi, msgPciSubsys - call SysMsgBoardStr + invoke SysMsgBoardStr 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 and eax, 0xFFFF mov [ctrl.pci_cmd], eax @@ -684,27 +670,27 @@ proc init_controller mov [ctrl.pci_stat], ebx mov esi, msgPciCmd - call SysMsgBoardStr + invoke SysMsgBoardStr call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgPciStat - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [ctrl.pci_stat] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgCtrlIsaIo - call SysMsgBoardStr - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 + invoke SysMsgBoardStr + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFC0 mov [ctrl.ctrl_io_base], eax .default: - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C and eax, 0xFF @@: mov [ctrl.int_line], eax @@ -753,7 +739,7 @@ proc reset_codec if DEBUG mov esi, msgCold - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, 100000 ; wait 100 ms ;400000 ; wait 400 ms @@ -775,7 +761,7 @@ proc reset_codec if DEBUG mov esi, msgCRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: @@ -851,11 +837,11 @@ endp align 4 proc create stdcall - stdcall PciRead16, [ctrl.bus], [ctrl.devfn], dword 4 + invoke PciRead16, [ctrl.bus], [ctrl.devfn], 4 test eax, 4 ; test master bit jnz @f 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 @@ -1117,8 +1103,6 @@ devices dd (CTRL_CT0200 shl 16)+VID_Creative,msg_CT_EMU10K1X,set_Creative 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_Creative db 'Creative ', 0 @@ -1157,8 +1141,11 @@ msgCtrlIsaIo db 'controller io base ',0 ;msgMixMMIo db 'codec mmio base ',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 buff_list rd 32 diff --git a/kernel/trunk/drivers/fm801.asm b/drivers/audio/fm801.asm similarity index 93% rename from kernel/trunk/drivers/fm801.asm rename to drivers/audio/fm801.asm index 4316425bf4..61e236b050 100644 --- a/kernel/trunk/drivers/fm801.asm +++ b/drivers/audio/fm801.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -format MS COFF +format PE DLL native 0.05 +entry START DEBUG equ 1 DEBUG_IRQ equ 0 -include 'proc32.inc' -include 'imports.inc' - API_VERSION equ 0x01000100 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 ? } -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 -public START -public service_proc -public version +section '.flat' code readable writable executable +include '../struct.inc' +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 jne .stop @@ -305,9 +290,9 @@ proc START stdcall, state:dword if DEBUG mov eax, START call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgInit - call SysMsgBoardStr + invoke SysMsgBoardStr end if call detect_controller @@ -316,9 +301,9 @@ proc START stdcall, state:dword if DEBUG mov esi, [ctrl.vendor_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr end if @@ -334,11 +319,11 @@ proc START stdcall, state:dword call setup_codec mov esi, msgPrimBuff - call SysMsgBoardStr + invoke SysMsgBoardStr call create_primary_buff mov esi, msgDone - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, VALID_IRQ mov ebx, [ctrl.int_line] @@ -350,20 +335,20 @@ proc START stdcall, state:dword bt eax, ebx jnc .fail_msg - stdcall AttachIntHandler, ebx, ac97_irq, dword 0 + invoke AttachIntHandler, ebx, ac97_irq, dword 0 .reg: - stdcall RegService, sz_sound_srv, service_proc + invoke RegService, sz_sound_srv, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret .fail_msg: - call SysMsgBoardStr + invoke SysMsgBoardStr xor eax, eax ret .stop: @@ -400,7 +385,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgPlay - call SysMsgBoardStr + invoke SysMsgBoardStr end if call play ret @@ -409,7 +394,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgStop - call SysMsgBoardStr + invoke SysMsgBoardStr end if call stop ret @@ -485,7 +470,7 @@ proc ac97_irq if DEBUG_IRQ mov esi, msgIRQ - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov edx, FM_INTSTATUS @@ -508,7 +493,7 @@ endp align 4 proc create_primary_buff - stdcall KernelAlloc, 0x10000 + invoke KernelAlloc, 0x10000 mov [ctrl.buffer], eax mov edi, eax @@ -518,7 +503,7 @@ proc create_primary_buff rep stosd mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr mov [buffer_pgaddr], eax ret @@ -535,7 +520,7 @@ proc detect_controller xor eax, eax mov [bus], eax inc eax - call PciApi + invoke PciApi cmp eax, -1 je .err @@ -544,14 +529,14 @@ proc detect_controller .next_bus: and [devfn], 0 .next_dev: - stdcall PciRead32, [bus], [devfn], dword 0 + invoke PciRead32, [bus], [devfn], dword 0 test eax, eax jz .next cmp eax, -1 je .next push eax - stdcall PciRead32, [bus], [devfn], dword 0x09 + invoke PciRead32, [bus], [devfn], dword 0x09 and eax, 0xffffff cmp eax, 0x060100 ;pci-isa jne .no_bridge @@ -612,7 +597,7 @@ endp align 4 proc init_controller - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 + invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4 mov ebx, eax and eax, 0xFFFF mov [ctrl.pci_cmd], eax @@ -620,36 +605,36 @@ proc init_controller mov [ctrl.pci_stat], ebx mov esi, msgPciCmd - call SysMsgBoardStr + invoke SysMsgBoardStr call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgPciStat - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [ctrl.pci_stat] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr 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 SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFFE mov [ctrl.ctrl_io_base], eax 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 mov [ctrl.int_line], eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr call [ctrl.ctrl_setup] xor eax, eax @@ -676,7 +661,7 @@ align 4 proc reset_controller mov esi, msgInitCtrl - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, FM_CARD_CTL call [ctrl.ctrl_read8] @@ -719,7 +704,7 @@ align 4 proc init_codec mov esi, msgInitCodec - call SysMsgBoardStr + invoke SysMsgBoardStr mov al, FM_CODEC_CMD_READ mov edx, FM_CODEC_CMD @@ -1024,8 +1009,6 @@ align 4 devices dd (CTRL_FM801 shl 16)+VID_FM801, msg_FM801, set_FM dd 0 -version dd (5 shl 16) or (API_VERSION and 0xFFFF) - msg_FM801 db 'FM801 AC97 controller',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 ;msgIrqMap db 'AC97 irq map as ',0 -section '.data' data readable writable align 16 +align 4 +data fixups +end data codec CODEC ctrl AC_CNTRL diff --git a/kernel/trunk/drivers/infinity.asm b/drivers/audio/infinity/infinity.asm similarity index 93% rename from kernel/trunk/drivers/infinity.asm rename to drivers/audio/infinity/infinity.asm index 1cd4e92982..00493d2a36 100644 --- a/kernel/trunk/drivers/infinity.asm +++ b/drivers/audio/infinity/infinity.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -8,16 +8,12 @@ ; Serge 2006-2008 ; email: infinity_sound@mail.ru -format MS COFF +format PE DLL native 0.05 +entry START DEBUG equ 1 -include 'proc32.inc' -include 'main.inc' -include 'imports.inc' - - CURRENT_API equ 0x0101 ;1.01 COMPATIBLE_API equ 0x0100 ;1.00 @@ -38,10 +34,6 @@ OS_BASE equ 0x80000000 CAPS_SSE2 equ 26 PG_SW equ 0x003 -public START -public service_proc -public version - RT_INP_EMPTY equ 0xFF000001 RT_OUT_EMPTY equ 0xFF000002 RT_INP_FULL equ 0xFF000003 @@ -57,32 +49,26 @@ DEV_STOP equ 2 DEV_CALLBACK equ 3 DEV_GET_POS equ 9 -struc IOCTL -{ .handle dd ? - .io_code dd ? - .input dd ? - .inp_size dd ? - .output dd ? - .out_size dd ? -} +section '.flat' code readable executable +include '../../struct.inc' +include '../../macros.inc' +include '../../proc32.inc' +include 'main.inc' +include '../../peimport.inc' -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 jne .exit - stdcall GetService, szSound + invoke GetService, szSound test eax, eax jz .fail mov [hSound], eax - stdcall KernelAlloc, 16*512 + invoke KernelAlloc, 16*512 test eax, eax jz .out_of_mem mov [mix_buff], eax @@ -133,12 +119,12 @@ end if end if stdcall set_handler, [hSound], new_mix mov [eng_state], SND_STOP - stdcall RegService, szInfinity, service_proc + invoke RegService, szInfinity, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .exit: xor eax, eax @@ -147,21 +133,12 @@ end if .out_of_mem: if DEBUG mov esi, msgMem - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret 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 srv_calls dd service_proc.srv_getversion ; 0 @@ -189,7 +166,7 @@ srv_calls_end: proc service_proc stdcall, ioctl:dword mov edi, [ioctl] - mov eax, [edi+io_code] + mov eax, [edi+IOCTL.io_code] cmp eax, (srv_calls_end-srv_calls)/4 ja .fail @@ -200,7 +177,7 @@ proc service_proc stdcall, ioctl:dword ; cmp [edi+inp_size], 4 ; jb .fali - mov ebx, [edi+input] + mov ebx, [edi+IOCTL.input] mov edx, [ebx] cmp [edx+STREAM.magic], 'WAVE' @@ -219,8 +196,8 @@ proc service_proc stdcall, ioctl:dword align 4 .srv_getversion: - mov eax, [edi+output] - cmp [edi+out_size], 4 + mov eax, [edi+IOCTL.output] + cmp [edi+IOCTL.out_size], 4 jne .fail mov eax, [eax] mov [eax], dword API_VERSION @@ -229,10 +206,10 @@ align 4 align 4 .snd_create_buff: - mov ebx, [edi+input] + mov ebx, [edi+IOCTL.input] stdcall CreateBuffer, [ebx], [ebx+4] mov edi, [ioctl] - mov ecx, [edi+output] + mov ecx, [edi+IOCTL.output] mov ecx, [ecx] mov [ecx], ebx ret @@ -251,7 +228,7 @@ align 4 align 4 .snd_getformat: movzx eax, word [edx+STREAM.format] - mov ecx, [edi+output] + mov ecx, [edi+IOCTL.output] mov ecx, [ecx] mov [ecx], eax xor eax, eax @@ -271,7 +248,7 @@ align 4 .snd_getpos: stdcall GetBufferPos, edx mov edi, [ioctl] - mov ecx, [edi+output] + mov ecx, [edi+IOCTL.output] mov ecx, [ecx] mov [ecx], ebx ret @@ -305,7 +282,7 @@ align 4 align 4 .snd_getvolume: - mov eax, [edi+output] + mov eax, [edi+IOCTL.output] mov ecx, [eax] mov eax, [eax+4] stdcall GetBufferVol, edx, ecx, eax @@ -318,7 +295,7 @@ align 4 align 4 .snd_getpan: mov eax, [edx+STREAM.pan] - mov ebx, [edi+output] + mov ebx, [edi+IOCTL.output] mov ebx, [ebx] mov [ebx], eax xor eax, eax @@ -327,7 +304,7 @@ align 4 align 4 .snd_getbuffsize: mov eax, [edx+STREAM.in_size] - mov ecx, [edi+output] + mov ecx, [edi+IOCTL.output] mov ecx, [ecx] mov [ecx], eax xor eax, eax @@ -339,13 +316,13 @@ align 4 jz .fail mov ebx, [edx+STREAM.in_free] - mov ecx, [edi+output] + mov ecx, [edi+IOCTL.output] mov [ecx], ebx xor eax, eax ret align 4 .snd_settimebase: - cmp [edi+inp_size], 12 + cmp [edi+IOCTL.inp_size], 12 jne .fail mov eax, [ebx+4] @@ -364,7 +341,7 @@ align 4 align 4 .snd_gettimestamp: - cmp [edi+out_size], 8 + cmp [edi+IOCTL.out_size], 8 jne .fail pushfd @@ -393,7 +370,7 @@ align 4 push dword [hSound] ;.handle mov eax, esp - stdcall ServiceHandler, eax + invoke ServiceHandler, eax add esp, 6*4 pop edi @@ -407,7 +384,7 @@ align 4 mov dword [esp], 0 ; clear offset @@: - mov edi, [edi+output] + mov edi, [edi+IOCTL.output] emms fild qword [edx+STREAM.time_stamp] @@ -461,11 +438,11 @@ proc CreateBuffer stdcall, format:dword, size:dword jnz .fail .test_ok: - call GetPid + invoke GetPid mov ebx, eax mov eax, STREAM.sizeof - call CreateObject + invoke CreateObject test eax, eax jz .fail mov [str], eax @@ -516,7 +493,7 @@ proc CreateBuffer stdcall, format:dword, size:dword shr ebx, 12 mov [ring_pages], ebx - stdcall CreateRingBuffer, eax, PG_SW + invoke CreateRingBuffer, eax, PG_SW mov edi, [str] mov ecx, [ring_size] @@ -536,7 +513,7 @@ proc CreateBuffer stdcall, format:dword, size:dword mov ecx, [size] add ecx, 128 ;resampler required mov [eax+STREAM.in_size], ecx - stdcall KernelAlloc, ecx + invoke KernelAlloc, ecx mov edi, [str] mov [edi+STREAM.in_base], eax @@ -550,7 +527,7 @@ proc CreateBuffer stdcall, format:dword, size:dword mov [edi+STREAM.in_top], eax .out_buff: - stdcall AllocKernelSpace, dword 128*1024 + invoke AllocKernelSpace, dword 128*1024 mov edi, [str] 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.last_ts], ebx - stdcall AllocPages, dword 64/4 + invoke AllocPages, dword 64/4 mov edi, [str] mov ebx, [edi+STREAM.out_base] mov ecx, 16 or eax, PG_SW push eax push ebx - call CommitPages ;eax, ebx, ecx + invoke CommitPages ;eax, ebx, ecx mov ecx, 16 pop ebx pop eax add ebx, 64*1024 - call CommitPages ;double mapped + invoke CommitPages ;double mapped mov edi, [str] mov ecx, [edi+STREAM.in_top] @@ -599,7 +576,7 @@ proc CreateBuffer stdcall, format:dword, size:dword xor esi, esi mov ecx, MANUAL_DESTROY - call CreateEvent + invoke CreateEvent mov ebx, [str] mov [ebx+STREAM.notify_event], eax @@ -647,12 +624,12 @@ DestroyBuffer: mov [ecx+STREAM.str_fd], ebx popf - stdcall KernelFree, [eax+STREAM.in_base] + invoke KernelFree, [eax+STREAM.in_base] mov eax, [.handle] - stdcall KernelFree, [eax+STREAM.out_base] + invoke KernelFree, [eax+STREAM.out_base] pop eax ;restore stack - call DestroyObject ;eax= stream + invoke DestroyObject ;eax= stream xor eax, eax ret .fail: @@ -833,7 +810,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword jne @F lea eax, [fpu_state+15] and eax, -16 - call FpuSave + invoke FpuSave mov [state_saved], 1 @@: stdcall refill, edx @@ -853,7 +830,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword mov edx, [str] mov eax, [edx+STREAM.notify_event] mov ebx, [edx+STREAM.notify_id] - call WaitEvent ;eax ebx + invoke WaitEvent ;eax ebx jmp .main_loop .done: cmp [state_saved], 1 @@ -861,7 +838,7 @@ proc wave_out stdcall, str:dword,src:dword,size:dword lea eax, [fpu_state+15] and eax, -16 - call FpuRestore + invoke FpuRestore @@: xor eax, eax ret @@ -1156,7 +1133,7 @@ proc play_buffer stdcall, str:dword, flags:dword .wait: mov eax, [edx+STREAM.notify_event] mov ebx, [edx+STREAM.notify_id] - call WaitEvent ;eax ebx + invoke WaitEvent ;eax ebx mov edx, [str] cmp [edx+STREAM.flags], SND_STOP @@ -1182,7 +1159,7 @@ proc stop_buffer stdcall, str:dword mov eax, [edx+STREAM.notify_event] mov ebx, [edx+STREAM.notify_id] - call ClearEvent ;eax ebx + invoke ClearEvent ;eax ebx xor eax, eax ret @@ -1315,7 +1292,7 @@ proc set_handler stdcall, hsrv:dword, handler_proc:dword mov [out_size], 0 lea eax, [handler] - stdcall ServiceHandler, eax + invoke ServiceHandler, eax ret endp @@ -1342,7 +1319,7 @@ proc dev_play stdcall, hsrv:dword mov [out_size], ebx lea eax, [handle] - stdcall ServiceHandler, eax + invoke ServiceHandler, eax ret endp @@ -1441,7 +1418,6 @@ vol_min dd 0x0000D8F0,0x0000D8F0 pan_max dd 0x00002710,0x00002710 ;stream_map dd 0xFFFF ; 16 -version dd (5 shl 16) or SOUND_VERSION szInfinity db 'INFINITY',0 szSound db 'SOUND',0 @@ -1457,7 +1433,11 @@ msgWaveout db 'Play waveout', 13,10,0 msgSetVolume db 'Set volume',13,10,0 end if -section '.data' data readable writable align 16 +align 4 +data fixups +end data + +section '.data' data readable writable play_list rd 16 mix_input rd 16 diff --git a/kernel/trunk/drivers/main.inc b/drivers/audio/infinity/main.inc similarity index 100% rename from kernel/trunk/drivers/main.inc rename to drivers/audio/infinity/main.inc diff --git a/kernel/trunk/drivers/mix_mmx.inc b/drivers/audio/infinity/mix_mmx.inc similarity index 100% rename from kernel/trunk/drivers/mix_mmx.inc rename to drivers/audio/infinity/mix_mmx.inc diff --git a/kernel/trunk/drivers/mix_sse2.inc b/drivers/audio/infinity/mix_sse2.inc similarity index 100% rename from kernel/trunk/drivers/mix_sse2.inc rename to drivers/audio/infinity/mix_sse2.inc diff --git a/kernel/trunk/drivers/mixer.asm b/drivers/audio/infinity/mixer.asm similarity index 99% rename from kernel/trunk/drivers/mixer.asm rename to drivers/audio/infinity/mixer.asm index 1664cdaa7f..a7c38ea023 100644 --- a/kernel/trunk/drivers/mixer.asm +++ b/drivers/audio/infinity/mixer.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; @@ -27,7 +27,7 @@ proc new_mix stdcall, output:dword lea eax, [fpu_state+16] and eax, -16 ;must be 16b aligned - call FpuSave + invoke FpuSave call update_streams .mix: @@ -66,7 +66,7 @@ end if .exit: lea eax, [fpu_state+16] and eax, -16 - call FpuRestore + invoke FpuRestore ret .done: mov ecx, [main_count] @@ -196,7 +196,7 @@ proc refill stdcall, str:dword mov ebx, [ebx+STREAM.notify_id] mov edx, EVENT_WATCHED xor esi, esi - call RaiseEvent ;eax, ebx, edx, esi + invoke RaiseEvent ;eax, ebx, edx, esi .exit: ret endp @@ -267,7 +267,7 @@ proc refill_ring stdcall, str:dword mov ebx, [ebx+STREAM.notify_id] xor edx, edx - call RaiseEvent ;eax, ebx, edx, esi + invoke RaiseEvent ;eax, ebx, edx, esi .exit: ret endp diff --git a/drivers/audio/intel_hda/intel_hda.asm b/drivers/audio/intel_hda/intel_hda.asm index ec2fd4b388..67c98ba665 100644 --- a/drivers/audio/intel_hda/intel_hda.asm +++ b/drivers/audio/intel_hda/intel_hda.asm @@ -500,10 +500,9 @@ include '../../peimport.inc' include 'CODEC_H.INC' entry START -section '.flat' readable writable executable -;proc START stdcall, state:dword -proc START c, state:dword, cmdline:dword +;proc START c, reason:dword, cmdline:dword +proc START push ebx esi ; save used registers to be stdcall virtual at esp rd 2 ; saved registers @@ -512,8 +511,8 @@ virtual at esp .cmdline dd ? ; normally NULL end virtual ; 1. Check the reason for the call, do nothing unless initializing. - ;cmp [.reason], DRV_ENTRY - ;jne .stop + cmp [.reason], DRV_ENTRY + jne .stop if DEBUG mov esi, msgTV diff --git a/kernel/trunk/drivers/intelac97.asm b/drivers/audio/intelac97.asm similarity index 88% rename from kernel/trunk/drivers/intelac97.asm rename to drivers/audio/intelac97.asm index c68770186b..c496c77271 100644 --- a/kernel/trunk/drivers/intelac97.asm +++ b/drivers/audio/intelac97.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -format MS COFF +format PE DLL native 0.05 +entry START + +include '../struct.inc' DEBUG equ 1 -include 'proc32.inc' -include 'imports.inc' - API_VERSION equ 0x01000100 DEBUG_IRQ equ 0 @@ -274,35 +274,21 @@ struc CTRL_INFO .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 -public START -public service_proc -public version +section '.flat' code readable executable +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 jne .stop if DEBUG mov esi, msgInit - call SysMsgBoardStr + invoke SysMsgBoardStr end if call detect_controller @@ -311,9 +297,9 @@ proc START stdcall, state:dword if DEBUG mov esi, [ctrl.vendor_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr end if @@ -329,10 +315,10 @@ proc START stdcall, state:dword call setup_codec mov esi, msgPrimBuff - call SysMsgBoardStr + invoke SysMsgBoardStr call create_primary_buff mov esi, msgDone - call SysMsgBoardStr + invoke SysMsgBoardStr if IRQ_REMAP pushf @@ -360,23 +346,23 @@ proc START stdcall, state:dword mov [ctrl.int_line], IRQ_LINE popf mov esi, msgRemap - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov ebx, [ctrl.int_line] - stdcall AttachIntHandler, ebx, ac97_irq, dword 0 + invoke AttachIntHandler, ebx, ac97_irq, 0 .reg: - stdcall RegService, sz_sound_srv, service_proc + invoke RegService, sz_sound_srv, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret .fail_msg: - call SysMsgBoardStr + invoke SysMsgBoardStr xor eax, eax ret .stop: @@ -413,7 +399,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgPlay - call SysMsgBoardStr + invoke SysMsgBoardStr end if call play ret @@ -422,7 +408,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgStop - call SysMsgBoardStr + invoke SysMsgBoardStr end if call stop ret @@ -484,7 +470,7 @@ proc ac97_irq if DEBUG_IRQ mov esi, msgIRQ - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov edx, CTRL_STAT @@ -508,9 +494,9 @@ proc ac97_irq .do_intr: push eax - mov edx, PCM_OUT_CR_REG - mov al, 0x10; 0x10 - call [ctrl.ctrl_write8] +; mov edx, PCM_OUT_CR_REG +; mov al, 0x10; 0x10 +; call [ctrl.ctrl_write8] mov ax, 0x1c mov edx, PCM_OUT_SR_REG @@ -531,19 +517,16 @@ proc ac97_irq mov edx, PCM_OUT_LVI_REG call [ctrl.ctrl_write8] - mov edx, PCM_OUT_CR_REG - mov ax, 0x11 ;0x1D - call [ctrl.ctrl_write8] - - mov eax, [civ_val] - add eax, 1 - and eax, 31 - mov ebx, dword [buff_list+eax*4] +; mov edx, PCM_OUT_CR_REG +; mov ax, 0x11 ;0x1D +; call [ctrl.ctrl_write8] cmp [ctrl.user_callback], 0 je .done - stdcall [ctrl.user_callback], ebx + mov eax, [ctrl.lvi_reg] + stdcall [ctrl.user_callback], [buff_list+eax*4] + .done: pop eax and eax, 0x40 @@ -552,16 +535,16 @@ proc ac97_irq or eax, 1 ret .skip: - mov edx, PCM_OUT_CR_REG - mov ax, 0x11 ;0x1D - call [ctrl.ctrl_write8] +; mov edx, PCM_OUT_CR_REG +; mov ax, 0x11 ;0x1D +; call [ctrl.ctrl_write8] jmp .done endp align 4 proc create_primary_buff - stdcall KernelAlloc, 0x10000 + invoke KernelAlloc, 0x10000 mov [ctrl.buffer], eax mov edi, eax @@ -571,7 +554,7 @@ proc create_primary_buff rep stosd mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr mov ebx, 0xC0002000 mov ecx, 4 @@ -624,7 +607,7 @@ proc create_primary_buff mov eax, pcmout_bdl mov ebx, eax - call GetPgAddr ;eax + invoke GetPgAddr ;eax and ebx, 0xFFF add eax, ebx @@ -640,59 +623,36 @@ endp align 4 proc detect_controller - locals - last_bus dd ? - bus dd ? - 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 + push ebx edi + invoke GetPCIList + mov ebx, eax .next_dev: - stdcall PciRead32, [bus], [devfn], dword 0 - test eax, eax - jz .next - cmp eax, -1 - je .next + mov eax, [eax+PCIDEV.fd] + cmp eax, ebx + jz .not_found + mov edx, [eax+PCIDEV.vendor_device_id] mov edi, devices @@: - mov ebx, [edi] - test ebx, ebx - jz .next - - cmp eax, ebx - je .found + cmp dword [edi], 0 + jz .next_dev + cmp edx, [edi] + jz .found add edi, 12 jmp @B -.next: - inc [devfn] - cmp [devfn], 256 - jb .next_dev - mov eax, [bus] - inc eax - mov [bus], eax - cmp eax, [last_bus] - jna .next_bus + +.not_found: xor eax, eax + pop edi ebx ret .found: - mov ebx, [bus] + movzx ebx, [eax+PCIDEV.bus] mov [ctrl.bus], ebx - mov ecx, [devfn] + movzx ecx, [eax+PCIDEV.devfn] mov [ctrl.devfn], ecx - mov edx, eax + mov eax, edx and edx, 0xFFFF mov [ctrl.vendor], edx shr eax, 16 @@ -700,29 +660,32 @@ proc detect_controller mov ebx, [edi+4] mov [ctrl.ctrl_ids], ebx - mov esi, [edi+8] - mov [ctrl.ctrl_setup], esi + mov eax, [edi+8] + mov [ctrl.ctrl_setup], eax cmp edx, VID_INTEL jne @F mov [ctrl.vendor_ids], msg_Intel + pop edi ebx ret @@: cmp edx, VID_NVIDIA jne @F mov [ctrl.vendor_ids], msg_NVidia + pop edi ebx ret @@: .err: xor eax, eax mov [ctrl.vendor_ids], eax ;something wrong ? + pop edi ebx ret endp align 4 proc init_controller - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 + invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4 mov ebx, eax and eax, 0xFFFF mov [ctrl.pci_cmd], eax @@ -730,55 +693,55 @@ proc init_controller mov [ctrl.pci_stat], ebx mov esi, msgPciCmd - call SysMsgBoardStr + invoke SysMsgBoardStr call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgPciStat - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [ctrl.pci_stat] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr 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 SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFFE mov [ctrl.codec_io_base], eax 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 SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFC0 mov [ctrl.ctrl_io_base], eax 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 call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr 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 call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr if 0 @@ -787,11 +750,11 @@ if 0 jne .default mov esi, msgIrqMap - call SysMsgBoardStr - stdcall PciRead8, 0, 0xF8, 0x61 + invoke SysMsgBoardStr + invoke PciRead8, 0, 0xF8, 0x61 and eax, 0xFF call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr btr eax, 7 ;when bit 7 set remap disabled jnc @F xor eax, eax @@ -799,12 +762,12 @@ if 0 end if .default: - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C + invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C and eax, 0xFF @@: mov [ctrl.int_line], eax - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41 + invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41 and eax, 0xFF mov [ctrl.cfg_reg], eax @@ -837,10 +800,10 @@ PG_NOCACHE equ 0x018 align 4 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 - 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.codec_read16], codec_mem_r16 ;virtual @@ -888,21 +851,21 @@ proc init_codec endl mov esi, msgControl - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, GLOB_CTRL call [ctrl.ctrl_read32] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, CTRL_STAT call [ctrl.ctrl_read32] push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax cmp eax, 0xFFFFFFFF je .err @@ -968,14 +931,14 @@ proc reset_codec if DEBUG mov esi, msgCFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ; timeout error ret .ok: if DEBUG mov esi, msgResetOk - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax @@ -995,7 +958,7 @@ proc warm_reset if DEBUG mov esi, msgWarm - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov [counter], 10 ; total 10*100 ms = 1s @@ -1013,7 +976,7 @@ proc warm_reset if DEBUG mov esi, msgWRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: stc @@ -1035,7 +998,7 @@ proc cold_reset if DEBUG mov esi, msgCold - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, 400000 ; wait 400 ms @@ -1057,7 +1020,7 @@ proc cold_reset if DEBUG mov esi, msgCRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: @@ -1065,21 +1028,21 @@ proc cold_reset ret .ok: mov esi, msgControl - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, GLOB_CTRL call [ctrl.ctrl_read32] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, CTRL_STAT call [ctrl.ctrl_read32] push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax test eax, CTRL_ST_CREADY @@ -1438,8 +1401,6 @@ devices dd (CTRL_ICH shl 16)+VID_INTEL,msg_ICH, set_ICH dd 0 ;terminator -version dd (5 shl 16) or (API_VERSION and 0xFFFF) - msg_ICH db '802801AA (ICH)', 13,10, 0 msg_ICH0 db '802801AB (ICH0)', 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 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 buff_list rd 32 diff --git a/kernel/trunk/drivers/sis.asm b/drivers/audio/sis.asm similarity index 87% rename from kernel/trunk/drivers/sis.asm rename to drivers/audio/sis.asm index 4a72d0e08a..0d99e97a19 100644 --- a/kernel/trunk/drivers/sis.asm +++ b/drivers/audio/sis.asm @@ -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 ;; ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -format MS COFF - +format PE DLL native 0.05 +entry START DEBUG equ 1 -include 'proc32.inc' -include 'imports.inc' - API_VERSION equ 0x01000100 DEBUG_IRQ equ 0 @@ -30,7 +27,7 @@ if USE_COM_IRQ ATTCH_IRQ equ 0000111010111000b end if -CPU_FREQ equ 2600d +CPU_FREQ equ 2000d BIT0 EQU 0x00000001 BIT1 EQU 0x00000002 @@ -251,35 +248,23 @@ struc CTRL_INFO .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 -public START -public service_proc -public version +section '.flat' code readable writable executable +include '../struct.inc' +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 jne .stop if DEBUG mov esi, msgInit - call SysMsgBoardStr + invoke SysMsgBoardStr end if call detect_controller @@ -288,9 +273,9 @@ proc START stdcall, state:dword if DEBUG mov esi, [ctrl.vendor_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr end if @@ -306,10 +291,10 @@ proc START stdcall, state:dword call setup_codec mov esi, msgPrimBuff - call SysMsgBoardStr + invoke SysMsgBoardStr call create_primary_buff mov esi, msgDone - call SysMsgBoardStr + invoke SysMsgBoardStr if IRQ_REMAP pushf @@ -322,13 +307,13 @@ proc START stdcall, state:dword test ebx, ebx jz .skip bts ax, bx ;mask old line -.skip +.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 + invoke PciWrite8, 0, 0xF8, 0x61, IRQ_LINE mov dx, 0x4d0 ;8259 ELCR1 in al, dx @@ -337,7 +322,7 @@ proc START stdcall, state:dword mov [ctrl.int_line], IRQ_LINE popf mov esi, msgRemap - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, VALID_IRQ @@ -350,19 +335,19 @@ proc START stdcall, state:dword bt eax, ebx jnc .fail_msg - stdcall AttachIntHandler, ebx, ac97_irq, dword 0 + invoke AttachIntHandler, ebx, ac97_irq, 0 .reg: - stdcall RegService, sz_sound_srv, service_proc + invoke RegService, sz_sound_srv, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret .fail_msg: - call SysMsgBoardStr + invoke SysMsgBoardStr xor eax, eax ret .stop: @@ -399,7 +384,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgPlay - call SysMsgBoardStr + invoke SysMsgBoardStr end if call play ret @@ -408,7 +393,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgStop - call SysMsgBoardStr + invoke SysMsgBoardStr end if call stop ret @@ -455,7 +440,7 @@ proc ac97_irq if DEBUG_IRQ mov esi, msgIRQ - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov edx, PCM_OUT_CR_REG @@ -507,7 +492,7 @@ endp align 4 proc create_primary_buff - stdcall KernelAlloc, 0x10000 + invoke KernelAlloc, 0x10000 mov [ctrl.buffer], eax mov edi, eax @@ -517,7 +502,7 @@ proc create_primary_buff rep stosd mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr mov ebx, 0xC0004000 mov ecx, 4 @@ -570,7 +555,7 @@ proc create_primary_buff mov eax, pcmout_bdl mov ebx, eax - call GetPgAddr ;eax + invoke GetPgAddr ;eax and ebx, 0xFFF add eax, ebx @@ -593,143 +578,132 @@ endp align 4 proc detect_controller - locals - last_bus dd ? - bus dd ? - 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 + push ebx + invoke GetPCIList + mov ebx, eax .next_dev: - stdcall PciRead32, [bus], [devfn], dword 0 - test eax, eax - jz .next - cmp eax, -1 - je .next - - mov edi, devices -@@: - mov ebx, [edi] - test ebx, ebx - jz .next - + mov eax, [eax+PCIDEV.fd] cmp eax, ebx - je .found - add edi, 12 - jmp @B -.next: - inc [devfn] - cmp [devfn], 256 - jb .next_dev - mov eax, [bus] - inc eax - mov [bus], eax - cmp eax, [last_bus] - jna .next_bus + je .err + cmp [eax+PCIDEV.class], 0x060100 ;pci-isa + jne .no_bridge + movzx edx, [eax+PCIDEV.bus] + mov [brg_bus], edx + movzx edx, [eax+PCIDEV.devfn] + mov [brg_devfn], edx +.no_bridge: + mov edx, [eax+PCIDEV.vendor_device_id] + mov esi, devices +@@: + cmp dword [esi], 0 + jz .next_dev + cmp dword [esi], edx + jz .found + add esi, 12 + jmp @b +.err: xor eax, eax + pop ebx ret .found: - mov ebx, [bus] + movzx ebx, [eax+PCIDEV.bus] mov [ctrl.bus], ebx - mov ecx, [devfn] + movzx ecx, [eax+PCIDEV.devfn] mov [ctrl.devfn], ecx - mov edx, eax + mov eax, edx and edx, 0xFFFF mov [ctrl.vendor], edx shr eax, 16 mov [ctrl.dev_id], eax - mov ebx, [edi+4] + mov ebx, [esi+4] mov [ctrl.ctrl_ids], ebx mov [ctrl.vendor_ids], msg_SIS - mov esi, [edi+8] - mov [ctrl.ctrl_setup], esi - ret -.err: - xor eax, eax + mov eax, [esi+8] + mov [ctrl.ctrl_setup], eax + pop ebx ret endp align 4 proc init_controller - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 + invoke PciRead32, [ctrl.bus], [ctrl.devfn], 4 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 shr ebx, 16 mov [ctrl.pci_stat], ebx mov esi, msgPciCmd - call SysMsgBoardStr + invoke SysMsgBoardStr call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgPciStat - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [ctrl.pci_stat] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr 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 SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFFE mov [ctrl.codec_io_base], eax 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 SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFC0 mov [ctrl.ctrl_io_base], eax 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 call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr 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 call dword2str - call SysMsgBoardStr -.default: - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C - and eax, 0xFF + invoke SysMsgBoardStr + + invoke PciRead32, [ctrl.bus], [ctrl.devfn], 0x3C + 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 - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41 + invoke PciRead8, [ctrl.bus], [ctrl.devfn], 0x41 and eax, 0xFF mov [ctrl.cfg_reg], eax @@ -786,27 +760,27 @@ proc init_codec endl mov esi, msgControl - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, GLOB_CTRL call [ctrl.ctrl_read32] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, CTRL_STAT call [ctrl.ctrl_read32] push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax cmp eax, 0xFFFFFFFF je .err test eax, CTRL_ST_CREADY - jnz .done ;;;;;.ready + jnz .ready call reset_codec test eax, eax @@ -866,7 +840,7 @@ proc reset_codec if DEBUG mov esi, msgCFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ; timeout error ret @@ -888,7 +862,7 @@ proc warm_reset if DEBUG mov esi, msgWarm - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov [counter], 10 ; total 10*100 ms = 1s @@ -906,7 +880,7 @@ proc warm_reset if DEBUG mov esi, msgWRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: stc @@ -928,7 +902,7 @@ proc cold_reset if DEBUG mov esi, msgCold - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, 400000 ; wait 400 ms @@ -950,7 +924,7 @@ proc cold_reset if DEBUG mov esi, msgCRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: @@ -958,21 +932,21 @@ proc cold_reset ret .ok: mov esi, msgControl - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, GLOB_CTRL call [ctrl.ctrl_read32] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr + invoke SysMsgBoardStr mov edx, CTRL_STAT call [ctrl.ctrl_read32] push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax test eax, CTRL_ST_CREADY @@ -1089,12 +1063,6 @@ endp align 4 proc codec_write stdcall, ac_reg:dword - push eax - call check_semafore - and eax, eax - jz .err - pop eax - mov esi, [ac_reg] mov edx, esi call [ctrl.codec_write16] @@ -1102,9 +1070,6 @@ proc codec_write stdcall, ac_reg:dword shr esi, 1 bts [codec.shadow_flag], esi ret -.err: - pop eax - ret endp align 4 @@ -1124,7 +1089,7 @@ proc codec_check_ready endp align 4 -proc check_semafore +proc check_semaphore local counter:DWORD mov [counter], 100 @@ -1180,15 +1145,27 @@ endp align 4 proc codec_io_r16 + push eax edx + call check_semaphore + test eax, eax + pop edx eax + jz .err add edx, [ctrl.codec_io_base] in ax, dx +.err: ret endp align 4 proc codec_io_w16 + push eax edx + call check_semaphore + test eax, eax + pop edx eax + jz .err add edx, [ctrl.codec_io_base] out dx, ax +.err: ret endp @@ -1257,8 +1234,6 @@ align 4 devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS dd 0 -version dd (5 shl 16) or (API_VERSION and 0xFFFF) - msg_AC db '7012 AC97 controller',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 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 buff_list rd 32 @@ -1305,3 +1283,6 @@ ctrl AC_CNTRL lpc_bus rd 1 civ_val rd 1 + +brg_bus dd ? +brg_devfn dd ? diff --git a/drivers/audio/sisnbook/codec.inc b/drivers/audio/sisnbook/codec.inc deleted file mode 100644 index 8e99025484..0000000000 --- a/drivers/audio/sisnbook/codec.inc +++ /dev/null @@ -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 - - diff --git a/drivers/audio/sisnbook/readme.txt b/drivers/audio/sisnbook/readme.txt deleted file mode 100644 index 391d23493e..0000000000 --- a/drivers/audio/sisnbook/readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -Немного переделал драйвер звука для чипа SIS - --добавил подключение PCI устройства к контроллеру прерывания - (БИОС неназначил номер прерывания) назначается IRQ 5 --изменил чтение регистра кодека (считывание и запись производится через 'семафор') - -в остальном оставил все как есть :) - - SIS.obj - просто бинарник - sis.asm - исходник - codec.inc - (добавил номер определения своего кодека) - - -G@K diff --git a/drivers/audio/sisnbook/sis.asm b/drivers/audio/sisnbook/sis.asm deleted file mode 100644 index ff5c6a0871..0000000000 --- a/drivers/audio/sisnbook/sis.asm +++ /dev/null @@ -1,1365 +0,0 @@ -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; ;; -;; Copyright (C) KolibriOS team 2004-2007. All rights reserved. ;; -;; Distributed under terms of the GNU General Public License ;; -;; ;; -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -format MS COFF - -include 'proc32.inc' -include 'imports.inc' - -API_VERSION equ 0x01000100 - -DEBUG equ 1 -DEBUG_IRQ equ 0 - -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 2000d - -BIT0 EQU 0x00000001 -BIT1 EQU 0x00000002 -BIT2 EQU 0x00000004 -BIT3 EQU 0x00000008 -BIT4 EQU 0x00000010 -BIT5 EQU 0x00000020 -BIT6 EQU 0x00000040 -BIT7 EQU 0x00000080 -BIT8 EQU 0x00000100 -BIT9 EQU 0x00000200 -BIT10 EQU 0x00000400 -BIT11 EQU 0x00000800 -BIT12 EQU 0x00001000 -BIT13 EQU 0x00002000 -BIT14 EQU 0x00004000 -BIT15 EQU 0x00008000 -BIT16 EQU 0x00010000 -BIT17 EQU 0x00020000 -BIT18 EQU 0x00040000 -BIT19 EQU 0x00080000 -BIT20 EQU 0x00100000 -BIT21 EQU 0x00200000 -BIT22 EQU 0x00400000 -BIT23 EQU 0x00800000 -BIT24 EQU 0x00100000 -BIT25 EQU 0x02000000 -BIT26 EQU 0x04000000 -BIT27 EQU 0x08000000 -BIT28 EQU 0x10000000 -BIT29 EQU 0x20000000 -BIT30 EQU 0x40000000 -BIT31 EQU 0x80000000 - -VID_SIS equ 0x1039 -CTRL_SIS equ 0x7012 - -PCM_OUT_BDL equ 0x10 ; PCM out buffer descriptors list -PCM_OUT_CR_REG equ 0x1b ; PCM out Control Register -PCM_OUT_LVI_REG equ 0x15 ; PCM last valid index -PCM_OUT_SR_REG equ 0x18 ; PCM out Status register -PCM_OUT_PIV_REG equ 0x1a ; PCM out prefetched index -PCM_OUT_CIV_REG equ 0x14 ; PCM out current index - -PCM_IN_CR_REG equ 0x0b ; PCM in Control Register -MC_IN_CR_REG equ 0x2b ; MIC in Control Register -RR equ BIT1 ; reset registers. Nukes all regs - -CODEC_MASTER_VOL_REG equ 0x02 -CODEC_AUX_VOL equ 0x04 ; -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 -CTRL_CAS equ 0x34 ; Codec Access Semiphore - -CAS_FLAG equ 0x01 ; Codec Access Semiphore Bit - -CTRL_ST_CREADY equ BIT8+BIT9+BIT28 ; Primary Codec Ready - -CTRL_ST_RCS equ 0x00008000 ; Read Completion Status - -CTRL_CNT_CRIE equ BIT4+BIT5+BIT6 ; Codecs Resume Interrupt Enable -CTRL_CNT_AC_OFF equ 0x00000008 ; ACLINK Off -CTRL_CNT_WARM equ 0x00000004 ; AC97 Warm Reset -CTRL_CNT_COLD equ 0x00000002 ; AC97 Cold Reset -CTRL_CNT_GIE equ 0x00000001 ; GPI Interrupt Enable - -CODEC_REG_POWERDOWN equ 0x26 -CODEC_REG_ST equ 0x26 - -SRV_GETVERSION equ 0 -DEV_PLAY equ 1 -DEV_STOP equ 2 -DEV_CALLBACK equ 3 -DEV_SET_BUFF equ 4 -DEV_NOTIFY equ 5 -DEV_SET_MASTERVOL equ 6 -DEV_GET_MASTERVOL equ 7 -DEV_GET_INFO equ 8 - -struc AC_CNTRL ;AC controller base class -{ .bus dd ? - .devfn dd ? - - .vendor dd ? - .dev_id dd ? - .pci_cmd dd ? - .pci_stat dd ? - - .codec_io_base dd ? - .codec_mem_base dd ? - - .ctrl_io_base dd ? - .ctrl_mem_base dd ? - .cfg_reg dd ? - .int_line dd ? - - .vendor_ids dd ? ;vendor id string - .ctrl_ids dd ? ;hub id string - - .buffer dd ? - - .notify_pos dd ? - .notify_task dd ? - - .lvi_reg dd ? - .ctrl_setup dd ? - .user_callback dd ? - .codec_read16 dd ? - .codec_write16 dd ? - - .ctrl_read8 dd ? - .ctrl_read16 dd ? - .ctrl_read32 dd ? - - .ctrl_write8 dd ? - .ctrl_write16 dd ? - .ctrl_write32 dd ? -} - -struc CODEC ;Audio Chip base class -{ - .chip_id dd ? - .flags dd ? - .status dd ? - - .ac_vendor_ids dd ? ;ac vendor id string - .chip_ids dd ? ;chip model string - - .shadow_flag dd ? - dd ? - - .regs dw ? ; codec registers - .reg_master_vol dw ? ;0x02 - .reg_aux_out_vol dw ? ;0x04 - .reg_mone_vol dw ? ;0x06 - .reg_master_tone dw ? ;0x08 - .reg_beep_vol dw ? ;0x0A - .reg_phone_vol dw ? ;0x0C - .reg_mic_vol dw ? ;0x0E - .reg_line_in_vol dw ? ;0x10 - .reg_cd_vol dw ? ;0x12 - .reg_video_vol dw ? ;0x14 - .reg_aux_in_vol dw ? ;0x16 - .reg_pcm_out_vol dw ? ;0x18 - .reg_rec_select dw ? ;0x1A - .reg_rec_gain dw ? ;0x1C - .reg_rec_gain_mic dw ? ;0x1E - .reg_gen dw ? ;0x20 - .reg_3d_ctrl dw ? ;0X22 - .reg_page dw ? ;0X24 - .reg_powerdown dw ? ;0x26 - .reg_ext_audio dw ? ;0x28 - .reg_ext_st dw ? ;0x2a - .reg_pcm_front_rate dw ? ;0x2c - .reg_pcm_surr_rate dw ? ;0x2e - .reg_lfe_rate dw ? ;0x30 - .reg_pcm_in_rate dw ? ;0x32 - dw ? ;0x34 - .reg_cent_lfe_vol dw ? ;0x36 - .reg_surr_vol dw ? ;0x38 - .reg_spdif_ctrl dw ? ;0x3A - dw ? ;0x3C - dw ? ;0x3E - dw ? ;0x40 - dw ? ;0x42 - dw ? ;0x44 - dw ? ;0x46 - dw ? ;0x48 - dw ? ;0x4A - dw ? ;0x4C - dw ? ;0x4E - dw ? ;0x50 - dw ? ;0x52 - dw ? ;0x54 - dw ? ;0x56 - dw ? ;0x58 - dw ? ;0x5A - dw ? ;0x5C - dw ? ;0x5E - .reg_page_0 dw ? ;0x60 - .reg_page_1 dw ? ;0x62 - .reg_page_2 dw ? ;0x64 - .reg_page_3 dw ? ;0x66 - .reg_page_4 dw ? ;0x68 - .reg_page_5 dw ? ;0x6A - .reg_page_6 dw ? ;0x6C - .reg_page_7 dw ? ;0x6E - dw ? ;0x70 - dw ? ;0x72 - dw ? ;0x74 - dw ? ;0x76 - dw ? ;0x78 - dw ? ;0x7A - .reg_vendor_id_1 dw ? ;0x7C - .reg_vendor_id_2 dw ? ;0x7E - - - .reset dd ? ;virual - .set_master_vol dd ? -} - -struc CTRL_INFO -{ .pci_cmd dd ? - .irq dd ? - .glob_cntrl dd ? - .glob_sta dd ? - .codec_io_base dd ? - .ctrl_io_base dd ? - .codec_mem_base dd ? - .ctrl_mem_base 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 - -public START -public service_proc -public version - -section '.flat' code readable align 16 - -proc START stdcall, state:dword - - cmp [state], 1 - jne .stop - - if DEBUG - mov esi, msgInit - call SysMsgBoardStr - end if - - call detect_controller - test eax, eax - jz .fail - - if DEBUG - mov esi,[ctrl.vendor_ids] - call SysMsgBoardStr - mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr - - end if - - call init_controller - test eax, eax - jz .fail - - call init_codec - test eax, eax - jz .fail - - call reset_controller - call setup_codec - - mov esi, msgPrimBuff - call SysMsgBoardStr - call create_primary_buff - 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, dword 0 -.reg: - - stdcall RegService, sz_sound_srv, service_proc - ret -.fail: - if DEBUG - mov esi, msgFail - call SysMsgBoardStr - end if - xor eax, eax - ret -.fail_msg: - call SysMsgBoardStr - xor eax, eax - ret -.stop: - call stop - xor eax, eax - ret -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 -proc service_proc stdcall, ioctl:dword - - mov edi, [ioctl] - mov eax, [edi+io_code] - - cmp eax, SRV_GETVERSION - jne @F - - mov eax, [edi+output] - cmp [edi+out_size], 4 - jne .fail - - mov [eax], dword API_VERSION - xor eax, eax - ret -@@: - cmp eax, DEV_PLAY - jne @F - if DEBUG - mov esi, msgPlay - call SysMsgBoardStr - end if - call play - ret -@@: - cmp eax, DEV_STOP - jne @F - if DEBUG - mov esi, msgStop - call SysMsgBoardStr - end if - call stop - ret -@@: - cmp eax, DEV_CALLBACK - jne @F - mov ebx, [edi+input] - stdcall set_callback, [ebx] - ret -@@: - cmp eax, DEV_SET_MASTERVOL - jne @F - mov eax, [edi+input] - mov eax, [eax] - call set_master_vol ;eax= vol - ret -@@: - cmp eax, DEV_GET_MASTERVOL - jne @F - mov ebx, [edi+output] - stdcall get_master_vol, ebx - ret -;@@: -; cmp eax, DEV_GET_INFO -; jne @F -; mov ebx, [edi+output] -; stdcall get_dev_info, ebx -; ret -@@: -.fail: - or eax, -1 - ret -endp - -restore handle -restore io_code -restore input -restore inp_size -restore output -restore out_size - -align 4 -proc ac97_irq - - if DEBUG_IRQ - mov esi, msgIRQ - call SysMsgBoardStr - end if - - mov edx, PCM_OUT_CR_REG - mov al, 0x10 - call [ctrl.ctrl_write8] - - mov ax, 0x1c - mov edx, PCM_OUT_SR_REG - call [ctrl.ctrl_write16] - - mov edx, PCM_OUT_CIV_REG - call [ctrl.ctrl_read8] - - and eax, 0x1F - cmp eax, [civ_val] - je .skip - - mov [civ_val], eax - dec eax - and eax, 0x1F - mov [ctrl.lvi_reg], eax - - mov edx, PCM_OUT_LVI_REG - call [ctrl.ctrl_write8] - - mov edx, PCM_OUT_CR_REG - mov ax, 0x11 - 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 - je @f - - stdcall [ctrl.user_callback], ebx -@@: - ret - -.skip: - mov edx, PCM_OUT_CR_REG - mov ax, 0x11 - call [ctrl.ctrl_write8] - ret -endp - -align 4 -proc create_primary_buff - - stdcall KernelAlloc, 0x10000 - mov [ctrl.buffer], eax - - mov edi, eax - mov ecx, 0x10000/4 - xor eax,eax - cld - rep stosd - - mov eax, [ctrl.buffer] - call GetPgAddr - - mov ebx, 0xC0004000 - mov ecx, 4 - mov edi, pcmout_bdl -@@: - 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 - - add eax, 0x4000 - add edi, 8 - loop @B - - mov edi, buff_list - mov eax, [ctrl.buffer] - mov ecx, 4 -@@: - mov [edi], eax - mov [edi+16], eax - mov [edi+32], eax - mov [edi+48], eax - mov [edi+64], eax - mov [edi+80], eax - mov [edi+96], eax - mov [edi+112], eax - - add eax, 0x4000 - add edi, 4 - loop @B - - mov eax, pcmout_bdl - mov ebx, eax - call GetPgAddr ;eax - and ebx, 0xFFF - add eax, ebx - - mov edx, PCM_OUT_BDL - call [ctrl.ctrl_write32] - mov eax, 16 - mov [ctrl.lvi_reg], eax - mov edx, PCM_OUT_LVI_REG - call [ctrl.ctrl_write8] - - mov edx, GLOB_CTRL - call [ctrl.ctrl_read32] - and eax, not 0x000000C0 - mov edx, GLOB_CTRL - call [ctrl.ctrl_write32] - - ret -endp - -align 4 -proc detect_controller - locals - last_bus dd ? - bus dd ? - 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: - stdcall PciRead32, [bus], [devfn], dword 0 - test eax, eax - jz .next - cmp eax, -1 - je .next - - push eax - stdcall PciRead32, [bus], [devfn], dword 0x09 - and eax,0xffffff - cmp eax, 0x060100 ;pci-isa - jne .no_bridge - - mov eax, [bus] - mov [brg_bus], eax - mov eax, [devfn] - mov [brg_devfn],eax -.no_bridge:pop eax - - mov edi, devices -@@: - mov ebx, [edi] - test ebx, ebx - jz .next - - cmp eax, ebx - je .found - add edi, 12 - jmp @B -.next: - inc [devfn] - cmp [devfn], 256 - jb .next_dev - mov eax, [bus] - inc eax - mov [bus], eax - cmp eax, [last_bus] - jna .next_bus - xor eax, eax - ret -.found: - mov ebx, [bus] - mov [ctrl.bus], ebx - - mov ecx, [devfn] - mov [ctrl.devfn], ecx - - mov edx, eax - and edx, 0xFFFF - mov [ctrl.vendor], edx - shr eax, 16 - mov [ctrl.dev_id], eax - - mov ebx, [edi+4] - mov [ctrl.ctrl_ids], ebx - mov [ctrl.vendor_ids], msg_SIS - - mov esi, [edi+8] - mov [ctrl.ctrl_setup], esi - ret -.err: - xor eax, eax - ret -endp - -align 4 -proc init_controller - - stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword 4, dword 0x5 - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 - mov ebx, eax - and eax, 0xFFFF - mov [ctrl.pci_cmd], eax - 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 - - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C - and eax, 0xFF - cmp eax, 0xFF ;NONE IRQ - jne @F - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3d - and eax, 0xFF - add eax,0x40 - stdcall PciWrite8, [brg_bus], [brg_devfn], eax, dword 0x05; irq-5 - stdcall PciWrite8, [ctrl.bus], [ctrl.devfn], dword 0x3C, dword 0x05 - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C - and eax, 0xFF - - -@@: - mov [ctrl.int_line], eax - call dword2str - call SysMsgBoardStr - - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword 0x41 - and eax, 0xFF - mov [ctrl.cfg_reg], eax - - call [ctrl.ctrl_setup] - xor eax, eax - inc eax - ret -endp - -align 4 -proc set_SIS - mov [ctrl.codec_read16], codec_io_r16 ;virtual - mov [ctrl.codec_write16], codec_io_w16 ;virtual - - mov [ctrl.ctrl_read8 ], ctrl_io_r8 ;virtual - mov [ctrl.ctrl_read16], ctrl_io_r16 ;virtual - mov [ctrl.ctrl_read32], ctrl_io_r32 ;virtual - - mov [ctrl.ctrl_write8 ], ctrl_io_w8 ;virtual - mov [ctrl.ctrl_write16], ctrl_io_w16 ;virtual - mov [ctrl.ctrl_write32], ctrl_io_w32 ;virtual - ret -endp - -align 4 -proc reset_controller - - xor eax, eax - mov edx, PCM_IN_CR_REG - call [ctrl.ctrl_write8] - - mov edx, PCM_OUT_CR_REG - call [ctrl.ctrl_write8] - - mov edx, MC_IN_CR_REG - call [ctrl.ctrl_write8] - - mov eax, RR - mov edx, PCM_IN_CR_REG - call [ctrl.ctrl_write8] - - mov edx, PCM_OUT_CR_REG - call [ctrl.ctrl_write8] - - mov edx, MC_IN_CR_REG - call [ctrl.ctrl_write8] - - - ret -endp - -align 4 -proc init_codec - locals - counter dd ? - endl - - 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] - push eax - call dword2str - call SysMsgBoardStr - pop eax - cmp eax, 0xFFFFFFFF - je .err - - test eax, CTRL_ST_CREADY - jnz .ready ;;;;;.ready - - call reset_codec - test eax, eax - jz .err - -.ready: - - xor edx, edx ;ac_reg_0 - call [ctrl.codec_write16] - - xor eax, eax - mov edx, CODEC_REG_POWERDOWN - call [ctrl.codec_write16] - - - - 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 - jz .done - sub [counter] , 1 - jnz .wait - -.err: - xor eax, eax ; timeout error - ret -.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 - inc eax - ret -endp - -align 4 -proc reset_codec - mov edx, GLOB_CTRL - call [ctrl.ctrl_read32] - - test eax, 0x02 - jz .cold - - call warm_reset - jnc .ok -.cold: - call cold_reset - jnc .ok - - if DEBUG - mov esi, msgCFail - call SysMsgBoardStr - end if - xor eax, eax ; timeout error - ret -.ok: - xor eax, eax - inc eax - ret -endp - -align 4 -proc warm_reset - locals - counter dd ? - endl - - mov eax, 0x06 - and eax,0xFFCFFFF7 - mov edx, GLOB_CTRL - call [ctrl.ctrl_write32] - - if DEBUG - mov esi, msgWarm - call SysMsgBoardStr - end if - - mov [counter], 10 ; total 10*100 ms = 1s -.wait: - mov eax, 100000 ; wait 100 ms - call StallExec - - mov edx, CTRL_STAT - call [ctrl.ctrl_read32] - test eax, CTRL_ST_CREADY - jnz .ok - - dec [counter] - jnz .wait - - if DEBUG - mov esi, msgWRFail - call SysMsgBoardStr - end if -.fail: - stc - ret -.ok: - clc - ret -endp - -align 4 -proc cold_reset - locals - counter dd ? - endl - - mov eax, 0x02 - and eax,0xFFCFFFF7 - mov edx, GLOB_CTRL - call [ctrl.ctrl_write32] - - if DEBUG - mov esi, msgCold - call SysMsgBoardStr - end if - - 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 - - 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] - push eax - call dword2str - call SysMsgBoardStr - pop eax - - test eax, CTRL_ST_CREADY - jz .fail - clc - ret -endp - -align 4 -play: - - xor eax, eax - mov [civ_val], eax - mov edx, PCM_OUT_CIV_REG - call [ctrl.ctrl_write8] - - mov eax, 16 - mov [ctrl.lvi_reg], eax - mov edx, PCM_OUT_LVI_REG - call [ctrl.ctrl_write8] - - mov edx, PCM_OUT_CR_REG - mov ax, 0x1D - call [ctrl.ctrl_write8] - xor eax, eax - ret - -align 4 -stop: - mov edx, PCM_OUT_CR_REG - mov ax, 0x0 - call [ctrl.ctrl_write8] - - mov ax, 0x1c - mov edx, PCM_OUT_SR_REG - call [ctrl.ctrl_write16] - xor eax, eax - ret - -align 4 -proc get_dev_info stdcall, p_info:dword - virtual at esi - CTRL_INFO CTRL_INFO - end virtual - - mov esi, [p_info] - mov eax, [ctrl.int_line] - mov ebx, [ctrl.codec_io_base] - mov ecx, [ctrl.ctrl_io_base] - mov edx, [ctrl.codec_mem_base] - mov edi, [ctrl.ctrl_mem_base] - - mov [CTRL_INFO.irq], eax - mov [CTRL_INFO.codec_io_base], ebx - mov [CTRL_INFO.ctrl_io_base], ecx - mov [CTRL_INFO.codec_mem_base], edx - mov [CTRL_INFO.ctrl_mem_base], edi - - mov eax, [codec.chip_id] - mov [CTRL_INFO.codec_id], eax - - mov edx, GLOB_CTRL - call [ctrl.ctrl_read32] - mov [CTRL_INFO.glob_cntrl], eax - - mov edx, CTRL_STAT - call [ctrl.ctrl_read32] - mov [CTRL_INFO.glob_sta], eax - - mov ebx, [ctrl.pci_cmd] - mov [CTRL_INFO.pci_cmd], ebx - ret -endp - -align 4 -proc set_callback stdcall, handler:dword - mov eax, [handler] - mov [ctrl.user_callback], eax - ret -endp - -align 4 -proc codec_read stdcall, ac_reg:dword ; reg = edx, reval = eax - - - - mov edx, [ac_reg] - - mov ebx, edx - shr ebx, 1 - bt [codec.shadow_flag], ebx - jc .use_shadow - - - call [ctrl.codec_read16] ;change edx !!! - mov ecx, eax - - mov edx, CTRL_STAT - call [ctrl.ctrl_read32] - test eax, CTRL_ST_RCS - jz .read_ok - - mov edx, CTRL_STAT - call [ctrl.ctrl_write32] - xor eax,eax - not eax ;timeout - ret -.read_ok: - mov edx, [ac_reg] - mov [codec.regs+edx], cx - bts [codec.shadow_flag], ebx - mov eax, ecx - ret -.use_shadow: - movzx eax, word [codec.regs+edx] - ret - -endp - -align 4 -proc codec_write stdcall, ac_reg:dword - - - mov esi, [ac_reg] - - mov edx, esi - - call [ctrl.codec_write16] - - mov [codec.regs+esi], ax - shr esi, 1 - bts [codec.shadow_flag], esi - - - ret -endp - -align 4 -proc codec_check_ready - - mov edx, CTRL_ST - call [ctrl.ctrl_read32] - and eax, CTRL_ST_CREADY - jz .not_ready - - xor eax, wax - inc eax - ret -.not_ready: - xor eax, eax - ret -endp - -align 4 -proc check_semafore - local counter:DWORD - - mov [counter], 100 -.l1: - mov edx, CTRL_CAS - call [ctrl.ctrl_read8] - and eax, CAS_FLAG - jz .ok - - mov eax, 1 - call StallExec - sub [counter], 1 - jnz .l1 - xor eax, eax - ret -align 4 -.ok: - xor eax,eax - inc eax - ret -endp - -align 4 -proc StallExec - push ecx - push edx - push ebx - push eax - - mov ecx, CPU_FREQ - mul ecx - mov ebx, eax ;low - mov ecx, edx ;high - rdtsc - add ebx, eax - adc ecx, edx -@@: - rdtsc - sub eax, ebx - sbb edx, ecx - js @B - - pop eax - pop ebx - pop edx - pop ecx - ret -endp - -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -; CONTROLLER IO functions -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - -align 4 -proc codec_io_r16 - - push eax - push edx - call check_semafore - and eax, eax - jz .err - pop edx - pop eax - - add edx, [ctrl.codec_io_base] - in ax, dx - ret -.err: - pop eax - ret -endp - -align 4 -proc codec_io_w16 - push eax - push edx - call check_semafore - and eax, eax - jz .err - pop edx - pop eax - add edx, [ctrl.codec_io_base] - out dx, ax - ret -.err: - pop eax - ret -endp - -align 4 -proc ctrl_io_r8 - add edx, [ctrl.ctrl_io_base] - in al, dx - ret -endp - -align 4 -proc ctrl_io_r16 - add edx, [ctrl.ctrl_io_base] - in ax, dx - ret -endp - -align 4 -proc ctrl_io_r32 - add edx, [ctrl.ctrl_io_base] - in eax, dx - ret -endp - -align 4 -proc ctrl_io_w8 - add edx, [ctrl.ctrl_io_base] - out dx, al - ret -endp - -align 4 -proc ctrl_io_w16 - add edx, [ctrl.ctrl_io_base] - out dx, ax - ret -endp - -align 4 -proc ctrl_io_w32 - add edx, [ctrl.ctrl_io_base] - out dx, eax - ret -endp - -align 4 -dword2str: - mov esi, hex_buff - mov ecx, -8 -@@: - rol eax, 4 - mov ebx, eax - and ebx, 0x0F - mov bl, [ebx+hexletters] - mov [8+esi+ecx], bl - inc ecx - jnz @B - ret - -hexletters db '0123456789ABCDEF' -hex_buff db 8 dup(0),13,10,0 - brg_bus dd ? - brg_devfn dd ? -include "codec.inc" - -align 4 -devices dd (CTRL_SIS shl 16)+VID_SIS,msg_AC, set_SIS - dd 0 - -version dd (5 shl 16) or (API_VERSION and 0xFFFF) - -msg_AC db '7012 AC97 controller',13,10, 0 -msg_SIS db 'Silicon Integrated Systems',13,10, 0 - -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 -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 ...',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 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 -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 - -pcmout_bdl rq 32 -buff_list rd 32 - -codec CODEC -ctrl AC_CNTRL - -lpc_bus rd 1 -civ_val rd 1 \ No newline at end of file diff --git a/drivers/audio/sound.asm b/drivers/audio/sound.asm index 0712b3b565..250cf0de91 100644 --- a/drivers/audio/sound.asm +++ b/drivers/audio/sound.asm @@ -11,10 +11,10 @@ entry START DEBUG = 1 section '.flat' code readable writable executable - include '../proc32.inc' include '../struct.inc' include '../macros.inc' +include '../peimport.inc' VID_INTEL = 0x8086 VID_NVIDIA = 0x10DE @@ -160,20 +160,27 @@ struct SRV 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 - jne .fail + jne .stop if DEBUG mov esi, msgInit invoke SysMsgBoardStr end if + test eax, eax + jnz .done call detect_controller ret - - .fail: +.stop: + test eax, eax + jz .done + leave + jmp eax +.done: xor eax, eax ret endp @@ -229,10 +236,6 @@ endl mov [bus], eax cmp eax, [last_bus] jna .next_bus - if DEBUG - mov esi, msgNotFound - invoke SysMsgBoardStr - end if xor eax, eax ret .found: @@ -402,13 +405,10 @@ emu10k1x db 'EMU10K1X', 0 intelhda db 'INTEL_HDA', 0 msgInit db 'Detecting hardware...',13,10,0 -msgNotFound db 'No compatible soundcard found!',13,10,0 -msgFail db 'Failed',13,10,0 +msgFail db 'No compatible soundcard found!',13,10,0 msgLoading db 'Loading ',0 msgNewline db 13,10,0 align 4 data fixups end data - -include '../peimport.inc' \ No newline at end of file diff --git a/kernel/trunk/drivers/vt823x.asm b/drivers/audio/vt823x.asm similarity index 92% rename from kernel/trunk/drivers/vt823x.asm rename to drivers/audio/vt823x.asm index 8f38313f56..d226e7667e 100644 --- a/kernel/trunk/drivers/vt823x.asm +++ b/drivers/audio/vt823x.asm @@ -5,13 +5,11 @@ ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -format MS COFF +format PE DLL native 0.05 +entry START DEBUG equ 1 -include 'proc32.inc' -include 'imports.inc' - API_VERSION equ 0x01000100 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 ? } -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 -public START -public service_proc -public version +section '.flat' code readable writable executable +include '../struct.inc' +include '../macros.inc' +include '../proc32.inc' +include '../peimport.inc' -section '.flat' code readable align 16 - -proc START stdcall, state:dword +proc START c, state:dword, cmdline:dword cmp [state], 1 jne .stop if DEBUG mov esi, msgInit - call SysMsgBoardStr + invoke SysMsgBoardStr end if call detect_controller @@ -348,9 +333,9 @@ proc START stdcall, state:dword if DEBUG mov esi, [ctrl.vendor_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, [ctrl.ctrl_ids] - call SysMsgBoardStr + invoke SysMsgBoardStr end if call init_controller @@ -364,10 +349,10 @@ proc START stdcall, state:dword call setup_codec mov esi, msgPrimBuff - call SysMsgBoardStr + invoke SysMsgBoardStr call create_primary_buff mov esi, msgDone - call SysMsgBoardStr + invoke SysMsgBoardStr if IRQ_REMAP pushf @@ -386,7 +371,7 @@ proc START stdcall, state:dword mov al, ah 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 in al, dx @@ -395,7 +380,7 @@ proc START stdcall, state:dword mov [ctrl.int_line], IRQ_LINE popf mov esi, msgRemap - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, VALID_IRQ @@ -408,19 +393,19 @@ proc START stdcall, state:dword bt eax, ebx jnc .fail_msg - stdcall AttachIntHandler, ebx, ac97_irq_VIA, dword 0 + invoke AttachIntHandler, ebx, ac97_irq_VIA, 0 .reg: - stdcall RegService, sz_sound_srv, service_proc + invoke RegService, sz_sound_srv, service_proc ret .fail: if DEBUG mov esi, msgFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ret .fail_msg: - call SysMsgBoardStr + invoke SysMsgBoardStr xor eax, eax ret .stop: @@ -456,7 +441,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgPlay - call SysMsgBoardStr + invoke SysMsgBoardStr end if call play ret @@ -465,7 +450,7 @@ proc service_proc stdcall, ioctl:dword jne @F if DEBUG mov esi, msgStop - call SysMsgBoardStr + invoke SysMsgBoardStr end if call stop ret @@ -552,7 +537,7 @@ endp align 4 proc create_primary_buff - stdcall KernelAlloc, 0x10000 + invoke KernelAlloc, 0x10000 mov [ctrl.buffer], eax mov edi, eax @@ -562,7 +547,7 @@ proc create_primary_buff rep stosd mov eax, [ctrl.buffer] - call GetPgAddr + invoke GetPgAddr mov edi, pcmout_bdl stosd mov eax, 0x80004000 @@ -590,7 +575,7 @@ proc create_primary_buff mov eax, pcmout_bdl mov ebx, eax - call GetPgAddr + invoke GetPgAddr and ebx, 0xFFF add eax, ebx @@ -669,7 +654,7 @@ proc detect_controller xor eax, eax mov [bus], eax inc eax - call PciApi + invoke PciApi cmp eax, -1 je .err @@ -678,7 +663,7 @@ proc detect_controller .next_bus: and [devfn], 0 .next_dev: - stdcall PciRead32, [bus], [devfn], dword 0 + invoke PciRead32, [bus], [devfn], dword 0 test eax, eax jz .next cmp eax, -1 @@ -738,7 +723,7 @@ endp align 4 proc init_controller - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 4 mov ebx, eax and eax, 0xFFFF mov [ctrl.pci_cmd], eax @@ -746,27 +731,27 @@ proc init_controller mov [ctrl.pci_stat], ebx mov esi, msgPciCmd - call SysMsgBoardStr + invoke SysMsgBoardStr call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgPciStat - call SysMsgBoardStr + invoke SysMsgBoardStr mov eax, [ctrl.pci_stat] call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgCtrlIsaIo - call SysMsgBoardStr - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 + invoke SysMsgBoardStr + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x10 call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr and eax, 0xFFC0 mov [ctrl.ctrl_io_base], eax .default: - stdcall PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C + invoke PciRead32, [ctrl.bus], [ctrl.devfn], dword 0x3C and eax, 0xFF @@: mov [ctrl.int_line], eax @@ -813,19 +798,19 @@ proc init_codec endl mov esi, msgControl - call SysMsgBoardStr - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL + invoke SysMsgBoardStr + invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL and eax, 0xFF call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT + invoke SysMsgBoardStr + invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT and eax, 0xFF push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax test eax, VIA_ACLINK_C00_READY @@ -854,7 +839,7 @@ endp align 4 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 mov eax, 100000 ; wait 100 ms call StallExec @@ -864,14 +849,14 @@ proc reset_codec if DEBUG mov esi, msgCFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax ; timeout error ret .ok: if DEBUG mov esi, msgResetOk - call SysMsgBoardStr + invoke SysMsgBoardStr end if xor eax, eax inc eax @@ -885,11 +870,11 @@ proc cold_reset counter dd ? 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 mov esi, msgCold - call SysMsgBoardStr + invoke SysMsgBoardStr end if 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 ;; 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 .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 jnz .ok @@ -913,7 +898,7 @@ proc cold_reset if DEBUG mov esi, msgCRFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if .fail: @@ -921,18 +906,18 @@ proc cold_reset ret .ok: mov esi, msgControl - call SysMsgBoardStr - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL + invoke SysMsgBoardStr + invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_CTRL call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr mov esi, msgStatus - call SysMsgBoardStr - stdcall PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT + invoke SysMsgBoardStr + invoke PciRead8, [ctrl.bus], [ctrl.devfn], dword VIA_ACLINK_STAT and eax, 0xFF push eax call dword2str - call SysMsgBoardStr + invoke SysMsgBoardStr pop eax 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: if DEBUG mov esi, msgCInvalid - call SysMsgBoardStr + invoke SysMsgBoardStr end if mov eax, -1 ; invalid codec error ret @@ -1120,7 +1105,7 @@ proc codec_write stdcall, ac_reg:dword .err: if DEBUG mov esi, msgCFail - call SysMsgBoardStr + invoke SysMsgBoardStr end if ;mov eax, -1 ; codec not ready error ret @@ -1244,8 +1229,6 @@ devices dd (CTRL_VT82C686 shl 16)+VID_VIA,msg_VT82C686,set_VIA dd 0 ;terminator -version dd (5 shl 16) or (API_VERSION and 0xFFFF) - msg_VT82C686 db 'VT82C686', 13,10, 0 msg_VT8233 db 'VT8233', 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 ;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 buff_list rd 32 diff --git a/kernel/trunk/drivers/vidrdc.asm b/kernel/trunk/drivers/vidrdc.asm deleted file mode 100644 index 78164e071f..0000000000 --- a/kernel/trunk/drivers/vidrdc.asm +++ /dev/null @@ -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 \ No newline at end of file