From b60abd12967144a844980c422ea9e99c056eabca Mon Sep 17 00:00:00 2001 From: NicJA Date: Fri, 26 Aug 2011 21:46:32 +0000 Subject: [PATCH] Port the SB128 code to AROS. git-svn-id: https://svn.aros.org/svn/aros/trunk/AROS@40897 fb15a70f-31f2-0310-bbcc-cdcc74a49acc --- workbench/devs/AHI/Drivers/SB128/DriverData.h | 36 +- workbench/devs/AHI/Drivers/SB128/MODEFILE.s | 70 --- workbench/devs/AHI/Drivers/SB128/Makefile | 38 -- workbench/devs/AHI/Drivers/SB128/Makefile.in | 61 +-- workbench/devs/AHI/Drivers/SB128/SB128.s | 25 ++ workbench/devs/AHI/Drivers/SB128/accel.c | 19 +- workbench/devs/AHI/Drivers/SB128/driver-init.c | 569 ++++++++++++------------- workbench/devs/AHI/Drivers/SB128/gatestubs.c | 252 ----------- workbench/devs/AHI/Drivers/SB128/gatestubs.h | 131 ------ workbench/devs/AHI/Drivers/SB128/interrupt.c | 49 ++- workbench/devs/AHI/Drivers/SB128/interrupt.h | 14 +- workbench/devs/AHI/Drivers/SB128/misc.c | 406 +++++++++--------- workbench/devs/AHI/Drivers/SB128/misc.h | 20 +- workbench/devs/AHI/Drivers/SB128/pci_aros.c | 480 +++++++++++++++++++++ workbench/devs/AHI/Drivers/SB128/pci_wrapper.c | 10 + workbench/devs/AHI/Drivers/SB128/pci_wrapper.h | 117 +++++ workbench/devs/AHI/Drivers/SB128/sb128.c | 146 ++++--- workbench/devs/AHI/Drivers/SB128/version.date | 2 +- workbench/devs/AHI/Drivers/SB128/version.h | 4 +- workbench/devs/AHI/Drivers/SB128/version.rev | 2 +- 20 files changed, 1306 insertions(+), 1145 deletions(-) delete mode 100755 workbench/devs/AHI/Drivers/SB128/MODEFILE.s delete mode 100755 workbench/devs/AHI/Drivers/SB128/Makefile rewrite workbench/devs/AHI/Drivers/SB128/Makefile.in (92%) create mode 100644 workbench/devs/AHI/Drivers/SB128/SB128.s rewrite workbench/devs/AHI/Drivers/SB128/driver-init.c (69%) delete mode 100755 workbench/devs/AHI/Drivers/SB128/gatestubs.c delete mode 100755 workbench/devs/AHI/Drivers/SB128/gatestubs.h create mode 100644 workbench/devs/AHI/Drivers/SB128/pci_aros.c create mode 100644 workbench/devs/AHI/Drivers/SB128/pci_wrapper.c create mode 100644 workbench/devs/AHI/Drivers/SB128/pci_wrapper.h diff --git a/workbench/devs/AHI/Drivers/SB128/DriverData.h b/workbench/devs/AHI/Drivers/SB128/DriverData.h index cbb497e514..69eb461dc0 100755 --- a/workbench/devs/AHI/Drivers/SB128/DriverData.h +++ b/workbench/devs/AHI/Drivers/SB128/DriverData.h @@ -15,20 +15,28 @@ All Rights Reserved. */ -#ifndef AHI_Drivers_Card_DriverData_h -#define AHI_Drivers_Card_DriverData_h +#ifndef AHI_Drivers_SB128_DriverData_h +#define AHI_Drivers_SB128_DriverData_h #include #include #include -#define DRIVER "sb128.audio" +#define DRIVER_NEEDS_GLOBAL_EXECBASE + +#ifdef __AROS__ +#define DRIVER_NEED_GLOBAL_EXECBASE +#endif + +#ifdef __amigaos4__ #define DRIVER_NEED_GLOBAL_EXECBASE +#endif + #include "DriverBase.h" -struct CardData; +struct SB128_DATA; -struct CardBase +struct SB128Base { /** Skeleton's variables *************************************************/ @@ -41,23 +49,25 @@ struct CardBase /** The number of cards found */ int cards_found; - /** A CardData structure for each card found */ - struct CardData** driverdatas; + /** A SB128_DATA structure for each card found */ + struct SB128_DATA** driverdatas; }; +#define DRIVERBASE_SIZEOF (sizeof (struct SB128Base)) + #define RECORD_BUFFER_SAMPLES 1024 -struct CardData +struct SB128_DATA { /*** PCI/Card initialization progress *********************************/ struct PCIDevice *pci_dev; - unsigned long iobase; - unsigned long length; - unsigned short model; + APTR iobase; + unsigned long length; + unsigned short model; unsigned char chiprev; - unsigned int irq; + unsigned int irq; /** TRUE if bus mastering is activated */ BOOL pci_master_enabled; @@ -221,4 +231,4 @@ struct CardData int currentRecFreq; }; -#endif /* AHI_Drivers_Card_DriverData_h */ +#endif /* AHI_Drivers_SB128_DriverData_h */ diff --git a/workbench/devs/AHI/Drivers/SB128/MODEFILE.s b/workbench/devs/AHI/Drivers/SB128/MODEFILE.s deleted file mode 100755 index 3a25416137..0000000000 --- a/workbench/devs/AHI/Drivers/SB128/MODEFILE.s +++ /dev/null @@ -1,70 +0,0 @@ - - .MACRO LONG num -.ifdef LITTLE_ENDIAN - .byte ((\num)>>24)&255 - .byte ((\num)>>16)&255 - .byte ((\num)>> 8)&255 - .byte ((\num)>> 0)&255 -.else - .long \num -.endif - .ENDM - - .MACRO LONG2 num1,num2 -.ifdef LITTLE_ENDIAN - .byte ((\num1)>>24)&255 - .byte ((\num1)>>16)&255 - .byte ((\num1)>> 8)&255 - .byte ((\num1)>> 0)&255 - - .byte ((\num2)>>24)&255 - .byte ((\num2)>>16)&255 - .byte ((\num2)>> 8)&255 - .byte ((\num2)>> 0)&255 -.else - .long \num1, \num2 -.endif - .ENDM - - .MACRO FORM_START name -CHUNKCNT .ASSIGNA 0 - .ascii "FORM" - LONG FORMEND-FORMSTART -FORMSTART: - .ascii "\name" - .ENDM - - .MACRO FORM_END name -FORMEND: - .balign 2,0 - .ENDM - - .MACRO CHUNK_START name - .ascii "\name" - LONG CHUNKEND\&CHUNKCNT-CHUNKSTART\&CHUNKCNT -CHUNKSTART\&CHUNKCNT: - .ENDM - - .MACRO CHUNK_END -CHUNKEND\&CHUNKCNT: -CHUNKCNT .ASSIGNA \&CHUNKCNT+1 - .balign 2,0 - .ENDM - -AHI_TagBase .EQU 2147483648 -AHI_TagBaseR .EQU AHI_TagBase+32768 - -AHIDB_AudioID .EQU AHI_TagBase+100 -AHIDB_Volume .EQU AHI_TagBase+103 -AHIDB_Panning .EQU AHI_TagBase+104 -AHIDB_Stereo .EQU AHI_TagBase+105 -AHIDB_HiFi .EQU AHI_TagBase+106 -AHIDB_MultTable .EQU AHI_TagBase+108 -AHIDB_Name .EQU AHI_TagBaseR+109 - -AHIDB_UserBase .EQU AHI_TagBase+500 - -TAG_DONE .EQU 0 - -TRUE .EQU 1 -FALSE .EQU 0 diff --git a/workbench/devs/AHI/Drivers/SB128/Makefile b/workbench/devs/AHI/Drivers/SB128/Makefile deleted file mode 100755 index 7990d8be85..0000000000 --- a/workbench/devs/AHI/Drivers/SB128/Makefile +++ /dev/null @@ -1,38 +0,0 @@ -# $Id: Makefile.in,v 1.16 2003/07/23 15:39:29 martin Exp $ -# -# Makefile.in for SB128 sound card driver -# - - - -srcdir = /usr/src/os4/ahi - -DRIVER = sb128.audio -MODEFILE = SB128 - -OBJECTS = driver-init.o sb128.o accel.o misc.o interrupt.o - -include ../Common/Makefile.card - - -# CAMD driver - -host_cpu = powerpc -CAMDDIR = CAMD - -camd-clean: - $(RM) camdstubs.c camdstubs.h CAMD/emu10kx CAMD/emu10kx.o CAMD.stamp - -camd-bindist: all - $(INSTALL) --directory $(CAMDDIR) - $(INSTALL_PROGRAM) CAMD/emu10kx $(CAMDDIR) - $(STRIP) $(CAMDDIR)/emu10kx - -CAMD/emu10kx: CAMD/emu10kx.o camdstubs.o - $(CC) $(LDFLAGS) $^ -o $@ - -CAMD.stamp: - test -e CAMD || mkdir CAMD - touch $@ - -CAMD/emu10kx.o: CAMD.stamp CAMD/emu10kx.c camdstubs.h card-camd.h version.h diff --git a/workbench/devs/AHI/Drivers/SB128/Makefile.in b/workbench/devs/AHI/Drivers/SB128/Makefile.in dissimilarity index 92% index 285234292f..73c4c2b9c8 100755 --- a/workbench/devs/AHI/Drivers/SB128/Makefile.in +++ b/workbench/devs/AHI/Drivers/SB128/Makefile.in @@ -1,47 +1,14 @@ -# $Id: Makefile.in,v 1.16 2003/07/23 15:39:29 martin Exp $ -# -# Makefile.in for EMU10kx sound card driver -# - -VPATH = @srcdir@ - -srcdir = @srcdir@ - -DRIVER = emu10kx.audio -MODEFILE = EMU10KX - -OBJECTS = emu10kx-init.o emu10kx.o emu10kx-accel.o \ - emu10kx-misc.o emu10kx-interrupt.o emu10kx-camd.o \ - main.o hwaccess.o emuadxmg.o efxmgr.o voicemgr.o \ - linuxsupport.o - -include ../Common/Makefile.common - - -# CAMD driver - -host_cpu = @host_cpu@ -CAMDDIR = ${DISTDIR}/User/Devs/MIDI - -ifeq ($(host_cpu),m68k) -all: CAMD/emu10kx -clean: camd-clean -bindist: camd-bindist -endif - -camd-clean: - $(RM) camdstubs.c camdstubs.h CAMD/emu10kx CAMD/emu10kx.o CAMD.stamp - -camd-bindist: all - $(INSTALL) --directory $(CAMDDIR) - $(INSTALL_PROGRAM) CAMD/emu10kx $(CAMDDIR) - $(STRIP) $(CAMDDIR)/emu10kx - -CAMD/emu10kx: CAMD/emu10kx.o camdstubs.o - $(CC) $(LDFLAGS) $^ -o $@ - -CAMD.stamp: - test -e CAMD || mkdir CAMD - touch $@ - -CAMD/emu10kx.o: CAMD.stamp CAMD/emu10kx.c camdstubs.h emu10kx-camd.h version.h +# $Id $ +# +# Makefile.in for SB128/ES137x AHI driver +# + +VPATH = @srcdir@ +srcdir = @srcdir@ + +DRIVER = sb128.audio +MODEFILE = SB128 + +OBJECTS = driver-init.o sb128.o accel.o misc.o interrupt.o pci_wrapper.o + +include ../Common/Makefile.common diff --git a/workbench/devs/AHI/Drivers/SB128/SB128.s b/workbench/devs/AHI/Drivers/SB128/SB128.s new file mode 100644 index 0000000000..3c90e08318 --- /dev/null +++ b/workbench/devs/AHI/Drivers/SB128/SB128.s @@ -0,0 +1,25 @@ + + FORM_START AHIM + + CHUNK_START AUDN + .asciz "sb128" + CHUNK_END + + CHUNK_START AUDM +1: + LONG2 AHIDB_AudioID, 0x00340002 + LONG2 AHIDB_Volume, TRUE + LONG2 AHIDB_Panning, TRUE + LONG2 AHIDB_Stereo, TRUE + LONG2 AHIDB_HiFi, FALSE + LONG2 AHIDB_MultTable,FALSE + LONG2 AHIDB_Name, 2f-1b + LONG TAG_DONE +2: + .asciz "SB128:16 bit stereo++" + CHUNK_END + + FORM_END + + .END + \ No newline at end of file diff --git a/workbench/devs/AHI/Drivers/SB128/accel.c b/workbench/devs/AHI/Drivers/SB128/accel.c index 58c7d34466..23903c3783 100755 --- a/workbench/devs/AHI/Drivers/SB128/accel.c +++ b/workbench/devs/AHI/Drivers/SB128/accel.c @@ -15,12 +15,13 @@ All Rights Reserved. */ -#include +#define DEBUG 1 +#include #include #include -#include "library_card.h" +#include "library.h" /****************************************************************************** ** AHIsub_SetVol ************************************************************** @@ -34,6 +35,8 @@ _AHIsub_SetVol( UWORD channel, ULONG flags, struct DriverBase* AHIsubBase ) { + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } @@ -49,6 +52,8 @@ _AHIsub_SetFreq( UWORD channel, ULONG flags, struct DriverBase* AHIsubBase ) { + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } @@ -66,6 +71,8 @@ _AHIsub_SetSound( UWORD channel, ULONG flags, struct DriverBase* AHIsubBase ) { + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } @@ -79,6 +86,8 @@ _AHIsub_SetEffect( APTR effect, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } @@ -93,7 +102,9 @@ _AHIsub_LoadSound( UWORD sound, APTR info, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) -{ +{ + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } @@ -107,5 +118,7 @@ _AHIsub_UnloadSound( UWORD sound, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + return AHIS_UNKNOWN; } diff --git a/workbench/devs/AHI/Drivers/SB128/driver-init.c b/workbench/devs/AHI/Drivers/SB128/driver-init.c dissimilarity index 69% index 2dc2cf9970..52322de1d1 100755 --- a/workbench/devs/AHI/Drivers/SB128/driver-init.c +++ b/workbench/devs/AHI/Drivers/SB128/driver-init.c @@ -1,291 +1,278 @@ -/* - -The contents of this file are subject to the AROS Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at -http://www.aros.org/license.html - -Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF -ANY KIND, either express or implied. See the License for the specific language governing rights and -limitations under the License. - -The Original Code is (C) Copyright 2004-2011 Ross Vumbaca. - -The Initial Developer of the Original Code is Ross Vumbaca. - -All Rights Reserved. - -*/ - -#include - -#include - -#undef __USE_INLINE__ -#include - -#include -#include - -#include - -#include "library_card.h" -#include "version.h" -#include "misc.h" -#include "regs.h" -#include "DriverData.h" - - -struct Library* SysBase; -struct Library* DOSBase; -struct DriverBase* AHIsubBase; - -struct Library* ExpansionBase = NULL; -struct ExpansionIFace* IExpansion = NULL; -struct UtilityIFace* IUtility = NULL; -struct AHIsubIFace* IAHIsub = NULL; -struct MMUIFace* IMMU = NULL; -struct PCIIFace* IPCI = NULL; - -#define CARD_STRING "SB128" - - -/****************************************************************************** -** Custom driver init ********************************************************* -******************************************************************************/ - -BOOL -DriverInit( struct DriverBase* ahisubbase ) -{ - struct CardBase* CardBase = (struct CardBase*) ahisubbase; - struct PCIDevice *dev; - int card_no; - - UWORD cards[] = - { - 0x1274, 0x5000, - 0x1274, 0x1371, - 0x1274, 0x5880, - 0x1102, 0x8938, - PCI_ANY_ID, PCI_ANY_ID - }; - - CardBase->cards_found = 0; - CardBase->driverdatas = 0; - AHIsubBase = ahisubbase; - - DOSBase = IExec->OpenLibrary( DOSNAME, 37 ); - - if( DOSBase == NULL ) - { - Req( "Unable to open 'dos.library' version 37.\n" ); - return FALSE; - } - - if ((IDOS = (struct DOSIFace *) IExec->GetInterface((struct Library *) DOSBase, "main", 1, NULL)) == NULL) - { - Req("Couldn't open IDOS interface!\n"); - return FALSE; - } - - ExpansionBase = IExec->OpenLibrary( "expansion.library", 50 ); - if( ExpansionBase == NULL ) - { - Req( "Unable to open 'expansion.library' version 50.\n" ); - return FALSE; - } - if ((IExpansion = (struct ExpansionIFace *) IExec->GetInterface((struct Library *) ExpansionBase, "main", 1, NULL)) == NULL) - { - Req("Couldn't open IExpansion interface!\n"); - return FALSE; - } - - if ((IPCI = (struct PCIIFace *) IExec->GetInterface((struct Library *) ExpansionBase, "pci", 1, NULL)) == NULL) - { - Req("Couldn't open IPCI interface!\n"); - return FALSE; - } - - if ((IAHIsub = (struct AHIsubIFace *) IExec->GetInterface((struct Library *) AHIsubBase, "main", 1, NULL)) == NULL) - { - Req("Couldn't open IAHIsub interface!\n"); - return FALSE; - } - - if ((IUtility = (struct UtilityIFace *) IExec->GetInterface((struct Library *) UtilityBase, "main", 1, NULL)) == NULL) - { - Req("Couldn't open IUtility interface!\n"); - return FALSE; - } - - if ((IMMU = (struct MMUIFace *) IExec->GetInterface((struct Library *) SysBase, "mmu", 1, NULL)) == NULL) - { - Req("Couldn't open IMMU interface!\n"); - return FALSE; - } - - /* Timer Device */ - -/* replymp = (struct MsgPort *) IExec->CreatePort(NULL, 0); - if (!replymp) - { - IExec->DebugPrintF("SB128: Couldn't create ReplyPort!\n"); - return FALSE; - }*/ - - /*TimerIO = (struct timerequest *)IExec->CreateIORequest(replymp, sizeof(struct timerequest)); - - if (TimerIO == NULL) - { - IExec->DebugPrintF("Out of memory.\n"); - return FALSE; - } - - if (IExec->OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *)TimerIO, 0) != 0) - { - IExec->DebugPrintF("Unable to open 'timer.device'.\n"); - return FALSE; - } - else - TimerBase = (struct Device *)TimerIO->tr_node.io_Device;*/ - - IExec->InitSemaphore( &CardBase->semaphore ); - - - /*** Count cards ***********************************************************/ - - dev = NULL; - - if ( (dev = IPCI->FindDeviceTags( FDT_CandidateList, cards, - TAG_DONE ) ) != NULL ) - { - ++CardBase->cards_found; - IExec->DebugPrintF("%s found! :-)\n", CARD_STRING); - } - - /* Fail if no hardware is present (prevents the audio modes from being added to - the database if the driver cannot be used). */ - - if( CardBase->cards_found == 0 ) - { - IExec->DebugPrintF("No %s found! :-(\n", CARD_STRING); - Req( "No card present.\n" ); - return FALSE; - } - - /*** CAMD ******************************************************************/ -#if 0 - IExec->InitSemaphore( &CardBase->camd.Semaphore ); - CardBase->camd.Semaphore.ss_Link.ln_Pri = 0; - - CardBase->camd.Semaphore.ss_Link.ln_Name = Card_CAMD_SEMAPHORE; - IExec->AddSemaphore( &CardBase->camd.Semaphore ); - - CardBase->camd.Cards = CardBase->cards_found; - CardBase->camd.Version = VERSION; - CardBase->camd.Revision = REVISION; - - - CardBase->camd.OpenPortFunc.h_Entry = OpenCAMDPort; - CardBase->camd.OpenPortFunc.h_SubEntry = NULL; - CardBase->camd.OpenPortFunc.h_Data = NULL; - - CardBase->camd.ClosePortFunc.h_Entry = (HOOKFUNC) CloseCAMDPort; - CardBase->camd.ClosePortFunc.h_SubEntry = NULL; - CardBase->camd.ClosePortFunc.h_Data = NULL; - - CardBase->camd.ActivateXmitFunc.h_Entry = (HOOKFUNC) ActivateCAMDXmit; - CardBase->camd.ActivateXmitFunc.h_SubEntry = NULL; - CardBase->camd.ActivateXmitFunc.h_Data = NULL; -#endif - - - /*** Allocate and init all cards *******************************************/ - - CardBase->driverdatas = IExec->AllocVec( sizeof( *CardBase->driverdatas ) * - CardBase->cards_found, - MEMF_PUBLIC ); - - if( CardBase->driverdatas == NULL ) - { - Req( "Out of memory." ); - return FALSE; - } - - card_no = 0; - - if( ( dev = IPCI->FindDeviceTags( FDT_CandidateList, cards, - TAG_DONE ) ) != NULL ) - { - CardBase->driverdatas[ card_no ] = AllocDriverData( dev, AHIsubBase ); - ++card_no; - } - - return TRUE; -} - - -/****************************************************************************** -** Custom driver clean-up ***************************************************** -******************************************************************************/ - -VOID -DriverCleanup( struct DriverBase* AHIsubBase ) -{ - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - int i; -#if 0 - if( CardBase->camd.Semaphore.ss_Link.ln_Name != NULL ) - { - IExec->ObtainSemaphore( &CardBase->camd.Semaphore ); - IExec->RemSemaphore( &CardBase->camd.Semaphore ); - IExec->ReleaseSemaphore( &CardBase->camd.Semaphore ); - } -#endif - - for( i = 0; i < CardBase->cards_found; ++i ) - { - if (CardBase->driverdatas) - { - CardBase->driverdatas[ i ]->pci_dev->OutLong(CardBase->driverdatas[ i ]->iobase + SB128_SCON, 0); - FreeDriverData( CardBase->driverdatas[ i ], AHIsubBase ); - } - } - - if (CardBase->driverdatas) - IExec->FreeVec( CardBase->driverdatas ); - - /*if (TimerIO) - { - IExec->CloseDevice((struct IORequest *)TimerIO); - IExec->DeleteIORequest((struct IORequest *)TimerIO); - }*/ - - /*if (replymp) - IExec->DeletePort(replymp);*/ - - if (IMMU) - IExec->DropInterface( (struct Interface *) IMMU); - - if (IUtility) - IExec->DropInterface( (struct Interface *) IUtility); - - if (IExpansion) - IExec->DropInterface( (struct Interface *) IExpansion); - - if (IPCI) - IExec->DropInterface( (struct Interface *) IPCI); - - if (IAHIsub) - IExec->DropInterface( (struct Interface *) IAHIsub); - - if (IDOS) - IExec->DropInterface( (struct Interface *) IDOS); - - if (ExpansionBase) - IExec->CloseLibrary( (struct Library*) ExpansionBase ); - - if (UtilityBase) - IExec->CloseLibrary( (struct Library*) UtilityBase ); - - if (DOSBase) - IExec->CloseLibrary( (struct Library*) DOSBase ); -} +/* + +The contents of this file are subject to the AROS Public License Version 1.1 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at +http://www.aros.org/license.html + +Software distributed under the License is distributed on an "AS IS" basis, WITHOUT WARRANTY OF +ANY KIND, either express or implied. See the License for the specific language governing rights and +limitations under the License. + +The Original Code is (C) Copyright 2004-2011 Ross Vumbaca. + +The Initial Developer of the Original Code is Ross Vumbaca. + +All Rights Reserved. + +*/ + +#include + +#include +#include + +#include + +#define DEBUG 1 +#include +#define DebugPrintF bug + +#include "library.h" +#include "version.h" +#include "misc.h" +#include "regs.h" + +#include "pci_wrapper.h" + +struct DosLibrary* DOSBase; +struct DriverBase* AHIsubBase; +struct Library* ExpansionBase = NULL; + +struct VendorDevice +{ + UWORD vendor; + UWORD device; +}; + +#define CARD_STRING "SB128" +#define MAX_DEVICE_VENDORS 512 + +struct VendorDevice *vendor_device_list = NULL; +static int vendor_device_list_size = 0; + +/****************************************************************************** +** Custom driver init ********************************************************* +******************************************************************************/ + +BOOL +DriverInit( struct DriverBase* ahisubbase ) +{ + struct SB128Base* SB128Base = (struct SB128Base*) ahisubbase; + struct PCIDevice *dev; + int card_no, i; + struct List foundCards; + struct Node *devTmp; + + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); + + SB128Base->cards_found = 0; + SB128Base->driverdatas = 0; + AHIsubBase = ahisubbase; + + DOSBase = OpenLibrary( DOSNAME, 37 ); + + if( DOSBase == NULL ) + { + Req( "Unable to open 'dos.library' version 37.\n" ); + return FALSE; + } + + ExpansionBase = OpenLibrary( "expansion.library", 50 ); + if( ExpansionBase == NULL ) + { + Req( "Unable to open 'expansion.library' version 50.\n" ); + return FALSE; + } + + if (!ahi_pci_init(ahisubbase)) + { + return FALSE; + } + + /* Timer Device */ + +/* replymp = (struct MsgPort *) CreatePort(NULL, 0); + if (!replymp) + { + DebugPrintF("SB128: Couldn't create ReplyPort!\n"); + return FALSE; + }*/ + + /*TimerIO = (struct timerequest *)CreateIORequest(replymp, sizeof(struct timerequest)); + + if (TimerIO == NULL) + { + DebugPrintF("Out of memory.\n"); + return FALSE; + } + + if (OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *)TimerIO, 0) != 0) + { + DebugPrintF("Unable to open 'timer.device'.\n"); + return FALSE; + } + else + TimerBase = (struct Device *)TimerIO->tr_node.io_Device;*/ + + InitSemaphore( &SB128Base->semaphore ); + + /*** Count cards ***********************************************************/ + + vendor_device_list = (struct VendorDevice *) AllocVec(sizeof(struct VendorDevice) * MAX_DEVICE_VENDORS, MEMF_PUBLIC | MEMF_CLEAR); + + vendor_device_list[0].vendor = 0x1274; + vendor_device_list[0].device = 0x5000; + vendor_device_list_size++; + + vendor_device_list[0].vendor = 0x1274; + vendor_device_list[0].device = 0x1371; + vendor_device_list_size++; + + vendor_device_list[0].vendor = 0x1274; + vendor_device_list[0].device = 0x5880; + vendor_device_list_size++; + + vendor_device_list[0].vendor = 0x1102; + vendor_device_list[0].device = 0x8938; + vendor_device_list_size++; + + bug("vendor_device_list_size = %ld\n", vendor_device_list_size); + + SB128Base->cards_found = 0; + dev = NULL; + + for (i = 0; i < vendor_device_list_size; i++) + { + dev = ahi_pci_find_device(vendor_device_list[i].vendor, vendor_device_list[i].device, dev); + + if (dev != NULL) + { + bug("[SB128] %s: Found SB128 #%d [%4x:%4x] pci obj @ 0x%p\n", __PRETTY_FUNCTION__, i, vendor_device_list[i].vendor, vendor_device_list[i].device, dev); + ++SB128Base->cards_found; + + devTmp = AllocVec(sizeof(struct Node), MEMF_CLEAR); + devTmp->ln_Name = dev; + AddTail(&foundCards, devTmp); + } + } + + // Fail if no hardware is present (prevents the audio modes from being added to + // the database if the driver cannot be used). + + if(SB128Base->cards_found == 0 ) + { + DebugPrintF("No SB128 found! :-(\n"); + Req( "No card present.\n" ); + return FALSE; + } + + /*** CAMD ******************************************************************/ +#if 0 + InitSemaphore( &SB128Base->camd.Semaphore ); + SB128Base->camd.Semaphore.ss_Link.ln_Pri = 0; + + SB128Base->camd.Semaphore.ss_Link.ln_Name = Card_CAMD_SEMAPHORE; + AddSemaphore( &SB128Base->camd.Semaphore ); + + SB128Base->camd.Cards = SB128Base->cards_found; + SB128Base->camd.Version = VERSION; + SB128Base->camd.Revision = REVISION; + + + SB128Base->camd.OpenPortFunc.h_Entry = OpenCAMDPort; + SB128Base->camd.OpenPortFunc.h_SubEntry = NULL; + SB128Base->camd.OpenPortFunc.h_Data = NULL; + + SB128Base->camd.ClosePortFunc.h_Entry = (HOOKFUNC) CloseCAMDPort; + SB128Base->camd.ClosePortFunc.h_SubEntry = NULL; + SB128Base->camd.ClosePortFunc.h_Data = NULL; + + SB128Base->camd.ActivateXmitFunc.h_Entry = (HOOKFUNC) ActivateCAMDXmit; + SB128Base->camd.ActivateXmitFunc.h_SubEntry = NULL; + SB128Base->camd.ActivateXmitFunc.h_Data = NULL; +#endif + + + /*** Allocate and init all cards *******************************************/ + + SB128Base->driverdatas = AllocVec( sizeof( *SB128Base->driverdatas ) * + SB128Base->cards_found, + MEMF_PUBLIC ); + + if( SB128Base->driverdatas == NULL ) + { + Req( "Out of memory." ); + return FALSE; + } + + card_no = 0; + + struct Node *scratchNode; + ForeachNodeSafe(&foundCards, devTmp, scratchNode) + { + Remove(devTmp); + + dev = devTmp->ln_Name; + bug("[SB128] %s: Prepairing card #%d pci obj @ 0x%p\n", __PRETTY_FUNCTION__, card_no, dev); + SB128Base->driverdatas[ card_no ] = AllocDriverData( dev, AHIsubBase ); + + FreeVec(devTmp); + ++card_no; + } + + bug("[SB128] %s: Done.\n", __PRETTY_FUNCTION__); + + + return TRUE; +} + + +/****************************************************************************** +** Custom driver clean-up ***************************************************** +******************************************************************************/ + +VOID +DriverCleanup( struct DriverBase* AHIsubBase ) +{ + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + int i; +#if 0 + if( SB128Base->camd.Semaphore.ss_Link.ln_Name != NULL ) + { + ObtainSemaphore( &SB128Base->camd.Semaphore ); + RemSemaphore( &SB128Base->camd.Semaphore ); + ReleaseSemaphore( &SB128Base->camd.Semaphore ); + } +#endif + + for( i = 0; i < SB128Base->cards_found; ++i ) + { + if (SB128Base->driverdatas) + { + pci_outl( 0, SB128_SCON, SB128Base->driverdatas[i] ); + FreeDriverData( SB128Base->driverdatas[ i ], AHIsubBase ); + } + } + + if (SB128Base->driverdatas) + FreeVec( SB128Base->driverdatas ); + + /*if (TimerIO) + { + CloseDevice((struct IORequest *)TimerIO); + DeleteIORequest((struct IORequest *)TimerIO); + }*/ + + /*if (replymp) + DeletePort(replymp);*/ + + ahi_pci_exit(); + + if (ExpansionBase) + CloseLibrary( (struct Library*) ExpansionBase ); + + if (UtilityBase) + CloseLibrary( (struct Library*) UtilityBase ); + + if (DOSBase) + CloseLibrary( (struct Library*) DOSBase ); +} diff --git a/workbench/devs/AHI/Drivers/SB128/gatestubs.c b/workbench/devs/AHI/Drivers/SB128/gatestubs.c deleted file mode 100755 index 25400f3e3c..0000000000 --- a/workbench/devs/AHI/Drivers/SB128/gatestubs.c +++ /dev/null @@ -1,252 +0,0 @@ -/* Automatically generated gatestubs! Do not edit! */ - -#include -#include -#include -#include -#include -#include - -#ifdef __amigaos4__ -#include -#endif - - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define __NOLIBBASE__ -#include -#undef __NOLIBBASE__ -#include - -struct Library* -_LibInit(struct Library* ___library, BPTR ___seglist, struct ExecBase* ___SysBase); - -struct Library* -gwLibInit( struct Library* ___library, - BPTR ___seglist, - struct ExecIFace* _iface) -{ - struct ExecBase* ___SysBase = (struct ExecBase*) _iface->Data.LibBase; - return _LibInit(___library, ___seglist, ___SysBase); -} - -struct Library* -_LibOpen(struct Library * _base); - -struct Library* -gwLibOpen(struct LibraryManagerInterface* _iface) -{ - return _LibOpen((struct Library *) _iface->Data.LibBase); -} - -BPTR -_LibClose(struct Library * _base); - -BPTR -gwLibClose(struct LibraryManagerInterface* _iface) -{ - return _LibClose((struct Library *) _iface->Data.LibBase); -} - -BPTR -_LibExpunge(struct Library * _base); - -BPTR -gwLibExpunge(struct LibraryManagerInterface* _iface) -{ - return _LibExpunge((struct Library *) _iface->Data.LibBase); -} - -ULONG -_LibNull(struct Library * _base); - -ULONG -gwLibNull(struct LibraryManagerInterface* _iface) -{ - return _LibNull((struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_AllocAudio(struct TagItem * ___tagList, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_AllocAudio(struct AHIsubIFace* _iface, - struct TagItem * ___tagList, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_AllocAudio(___tagList, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -void -_AHIsub_FreeAudio(struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -void -gwAHIsub_FreeAudio(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_FreeAudio(___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -void -_AHIsub_Disable(struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -void -gwAHIsub_Disable(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_Disable(___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -void -_AHIsub_Enable(struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -void -gwAHIsub_Enable(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_Enable(___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_Start(ULONG ___Flags, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_Start(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_Start(___Flags, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_Update(ULONG ___Flags, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_Update(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_Update(___Flags, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_Stop(ULONG ___Flags, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_Stop(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_Stop(___Flags, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_SetVol(UWORD ___Channel, Fixed ___Volume, sposition ___Pan, struct AHIAudioCtrlDrv * ___AudioCtrl, ULONG ___Flags, struct Library * _base); - -ULONG -gwAHIsub_SetVol(struct AHIsubIFace* _iface, - UWORD ___Channel, - Fixed ___Volume, - sposition ___Pan, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags) -{ - return _AHIsub_SetVol(___Channel, ___Volume, ___Pan, ___AudioCtrl, ___Flags, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_SetFreq(UWORD ___Channel, ULONG ___Freq, struct AHIAudioCtrlDrv * ___AudioCtrl, ULONG ___Flags, struct Library * _base); - -ULONG -gwAHIsub_SetFreq(struct AHIsubIFace* _iface, - UWORD ___Channel, - ULONG ___Freq, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags) -{ - return _AHIsub_SetFreq(___Channel, ___Freq, ___AudioCtrl, ___Flags, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_SetSound(UWORD ___Channel, UWORD ___Sound, ULONG ___Offset, LONG ___Length, struct AHIAudioCtrlDrv * ___AudioCtrl, ULONG ___Flags, struct Library * _base); - -ULONG -gwAHIsub_SetSound(struct AHIsubIFace* _iface, - UWORD ___Channel, - UWORD ___Sound, - ULONG ___Offset, - LONG ___Length, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags) -{ - return _AHIsub_SetSound(___Channel, ___Sound, ___Offset, ___Length, ___AudioCtrl, ___Flags, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_SetEffect(APTR ___Effect, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_SetEffect(struct AHIsubIFace* _iface, - APTR ___Effect, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_SetEffect(___Effect, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_LoadSound(UWORD ___Sound, ULONG ___Type, APTR ___Info, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -ULONG -gwAHIsub_LoadSound(struct AHIsubIFace* _iface, - UWORD ___Sound, - ULONG ___Type, - APTR ___Info, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_LoadSound(___Sound, ___Type, ___Info, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -ULONG -_AHIsub_UnloadSound(UWORD ___Sound, struct AHIAudioCtrlDrv * ___Audioctrl, struct Library * _base); - -ULONG -gwAHIsub_UnloadSound(struct AHIsubIFace* _iface, - UWORD ___Sound, - struct AHIAudioCtrlDrv * ___Audioctrl) -{ - return _AHIsub_UnloadSound(___Sound, ___Audioctrl, (struct Library *) _iface->Data.LibBase); -} - -LONG -_AHIsub_GetAttr(ULONG ___Attribute, LONG ___Argument, LONG ___DefValue, struct TagItem * ___tagList, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -LONG -gwAHIsub_GetAttr(struct AHIsubIFace* _iface, - ULONG ___Attribute, - LONG ___Argument, - LONG ___DefValue, - struct TagItem * ___tagList, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_GetAttr(___Attribute, ___Argument, ___DefValue, ___tagList, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - -LONG -_AHIsub_HardwareControl(ULONG ___Attribute, LONG ___Argument, struct AHIAudioCtrlDrv * ___AudioCtrl, struct Library * _base); - -LONG -gwAHIsub_HardwareControl(struct AHIsubIFace* _iface, - ULONG ___Attribute, - LONG ___Argument, - struct AHIAudioCtrlDrv * ___AudioCtrl) -{ - return _AHIsub_HardwareControl(___Attribute, ___Argument, ___AudioCtrl, (struct Library *) _iface->Data.LibBase); -} - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ diff --git a/workbench/devs/AHI/Drivers/SB128/gatestubs.h b/workbench/devs/AHI/Drivers/SB128/gatestubs.h deleted file mode 100755 index 8c1b04ebc8..0000000000 --- a/workbench/devs/AHI/Drivers/SB128/gatestubs.h +++ /dev/null @@ -1,131 +0,0 @@ -/* Automatically generated header! Do not edit! */ - -#ifndef _GATEPROTO_AHIsub_H -#define _GATEPROTO_AHIsub_H - -#include -#include -#include -#include -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define __NOLIBBASE__ -#include -#undef __NOLIBBASE__ -#include - -struct Library* -gwLibInit( struct Library* ___library, - BPTR ___seglist, - struct ExecIFace* _iface); - -struct Library* -gwLibOpen(struct LibraryManagerInterface* _iface); - -BPTR -gwLibClose(struct LibraryManagerInterface* _iface); - -BPTR -gwLibExpunge(struct LibraryManagerInterface* _iface); - -ULONG -gwLibNull(struct LibraryManagerInterface* _iface); - -ULONG -gwAHIsub_AllocAudio(struct AHIsubIFace* _iface, - struct TagItem * ___tagList, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -void -gwAHIsub_FreeAudio(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -void -gwAHIsub_Disable(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -void -gwAHIsub_Enable(struct AHIsubIFace* _iface, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_Start(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_Update(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_Stop(struct AHIsubIFace* _iface, - ULONG ___Flags, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_SetVol(struct AHIsubIFace* _iface, - UWORD ___Channel, - Fixed ___Volume, - sposition ___Pan, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags); - -ULONG -gwAHIsub_SetFreq(struct AHIsubIFace* _iface, - UWORD ___Channel, - ULONG ___Freq, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags); - -ULONG -gwAHIsub_SetSound(struct AHIsubIFace* _iface, - UWORD ___Channel, - UWORD ___Sound, - ULONG ___Offset, - LONG ___Length, - struct AHIAudioCtrlDrv * ___AudioCtrl, - ULONG ___Flags); - -ULONG -gwAHIsub_SetEffect(struct AHIsubIFace* _iface, - APTR ___Effect, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_LoadSound(struct AHIsubIFace* _iface, - UWORD ___Sound, - ULONG ___Type, - APTR ___Info, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -ULONG -gwAHIsub_UnloadSound(struct AHIsubIFace* _iface, - UWORD ___Sound, - struct AHIAudioCtrlDrv * ___Audioctrl); - -LONG -gwAHIsub_GetAttr(struct AHIsubIFace* _iface, - ULONG ___Attribute, - LONG ___Argument, - LONG ___DefValue, - struct TagItem * ___tagList, - struct AHIAudioCtrlDrv * ___AudioCtrl); - -LONG -gwAHIsub_HardwareControl(struct AHIsubIFace* _iface, - ULONG ___Attribute, - LONG ___Argument, - struct AHIAudioCtrlDrv * ___AudioCtrl); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -#endif /* _GATEPROTO_AHIsub_H */ diff --git a/workbench/devs/AHI/Drivers/SB128/interrupt.c b/workbench/devs/AHI/Drivers/SB128/interrupt.c index 25de32d1ff..017a00293d 100755 --- a/workbench/devs/AHI/Drivers/SB128/interrupt.c +++ b/workbench/devs/AHI/Drivers/SB128/interrupt.c @@ -15,16 +15,24 @@ All Rights Reserved. */ -#include +//#include +#if !defined(__AROS__) #undef __USE_INLINE__ #include +#endif #include #include #include #include "library.h" #include "regs.h" #include "interrupt.h" +#include "pci_wrapper.h" +#ifdef __AROS__ +#define DEBUG 1 +#include +#define DebugPrintF bug +#endif #define min(a,b) ((a)<(b)?(a):(b)) @@ -35,7 +43,7 @@ unsigned long z = 0; LONG -CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* card ) +CardInterrupt( struct SB128_DATA* card ) { struct AHIAudioCtrlDrv* AudioCtrl = card->audioctrl; struct DriverBase* AHIsubBase = (struct DriverBase*) card->ahisubbase; @@ -43,13 +51,16 @@ CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, stru ULONG intreq; LONG handled = 0; - while (((intreq = (dev->InLong(card->iobase + SB128_STATUS))) & SB128_INT_PENDING) != 0) + + bug("[CMI8738]: %s(card @ 0x%p)\n", __PRETTY_FUNCTION__, card); + + while (((intreq = (pci_inl(SB128_STATUS, card))) & SB128_INT_PENDING) != 0) { if( intreq & SB128_INT_DAC2 && AudioCtrl != NULL ) { /* Clear interrupt pending bit(s) and re-enable playback interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) & ~SB128_DAC2_INTEN)); - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | SB128_DAC2_INTEN)); + pci_outl((pci_inl(SB128_SCON, card) & ~SB128_DAC2_INTEN), SB128_SCON, card); + pci_outl((pci_inl(SB128_SCON, card) | SB128_DAC2_INTEN), SB128_SCON, card); if (card->flip == 0) /* just played buf 1 */ { @@ -63,14 +74,14 @@ CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, stru } card->playback_interrupt_enabled = FALSE; - IExec->Cause( &card->playback_interrupt ); + Cause( &card->playback_interrupt ); } if( intreq & SB128_INT_ADC && AudioCtrl != NULL ) { /* Clear interrupt pending bit(s) and re-enable record interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) & ~SB128_ADC_INTEN)); - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | SB128_ADC_INTEN)); + pci_outl((pci_inl(SB128_SCON, card) & ~SB128_ADC_INTEN), SB128_SCON, card); + pci_outl((pci_inl(SB128_SCON, card) | SB128_ADC_INTEN), SB128_SCON, card); if( card->record_interrupt_enabled ) { @@ -87,7 +98,7 @@ CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, stru card->current_record_buffer = (APTR) ((unsigned long) card->record_buffer + card->current_record_bytesize); } card->record_interrupt_enabled = FALSE; - IExec->Cause( &card->record_interrupt ); + Cause( &card->record_interrupt ); } } exit: @@ -104,7 +115,7 @@ CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, stru ******************************************************************************/ void -PlaybackInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* card ) +PlaybackInterrupt( struct SB128_DATA* card ) { struct AHIAudioCtrlDrv* AudioCtrl = card->audioctrl; struct DriverBase* AHIsubBase = (struct DriverBase*) card->ahisubbase; @@ -120,12 +131,12 @@ PlaybackInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, size_t samples; int i; - skip_mix = IUtility->CallHookPkt( AudioCtrl->ahiac_PreTimerFunc, (Object*) AudioCtrl, 0 ); - IUtility->CallHookPkt( AudioCtrl->ahiac_PlayerFunc, (Object*) AudioCtrl, NULL ); + skip_mix = CallHookPkt( AudioCtrl->ahiac_PreTimerFunc, (Object*) AudioCtrl, 0 ); + CallHookPkt( AudioCtrl->ahiac_PlayerFunc, (Object*) AudioCtrl, NULL ); if( ! skip_mix ) { - IUtility->CallHookPkt( AudioCtrl->ahiac_MixerFunc, (Object*) AudioCtrl, card->mix_buffer ); + CallHookPkt( AudioCtrl->ahiac_MixerFunc, (Object*) AudioCtrl, card->mix_buffer ); } /* Now translate and transfer to the DMA buffer */ @@ -149,9 +160,9 @@ PlaybackInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, } //Flush cache so that data is completely written to the DMA buffer - Articia hack - IExec->CacheClearE(card->current_buffer, card->current_bytesize, CACRF_ClearD); + CacheClearE(card->current_buffer, card->current_bytesize, CACRF_ClearD); - IUtility->CallHookPkt( AudioCtrl->ahiac_PostTimerFunc, (Object*) AudioCtrl, 0 ); + CallHookPkt( AudioCtrl->ahiac_PostTimerFunc, (Object*) AudioCtrl, 0 ); } card->playback_interrupt_enabled = TRUE; } @@ -162,7 +173,7 @@ PlaybackInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, ******************************************************************************/ void -RecordInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* card ) +RecordInterrupt( struct SB128_DATA* card ) { struct AHIAudioCtrlDrv* AudioCtrl = card->audioctrl; struct DriverBase* AHIsubBase = (struct DriverBase*) card->ahisubbase; @@ -179,7 +190,7 @@ RecordInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, st WORD* ptr = card->current_record_buffer; //Invalidate cache so that data read from DMA buffer is correct - Articia hack - IExec->CacheClearE(card->current_record_buffer, card->current_record_bytesize, CACRF_InvalidateD); + CacheClearE(card->current_record_buffer, card->current_record_bytesize, CACRF_InvalidateD); while( i < shorts ) { @@ -189,10 +200,10 @@ RecordInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, st ++ptr; } - IUtility->CallHookPkt( AudioCtrl->ahiac_SamplerFunc, (Object*) AudioCtrl, &rm ); + CallHookPkt( AudioCtrl->ahiac_SamplerFunc, (Object*) AudioCtrl, &rm ); //Invalidate cache so that data read from DMA buffer is correct - Articia hack - IExec->CacheClearE(card->current_record_buffer, card->current_record_bytesize, CACRF_InvalidateD); + CacheClearE(card->current_record_buffer, card->current_record_bytesize, CACRF_InvalidateD); card->record_interrupt_enabled = TRUE; } diff --git a/workbench/devs/AHI/Drivers/SB128/interrupt.h b/workbench/devs/AHI/Drivers/SB128/interrupt.h index 32cba944f6..509b967c71 100755 --- a/workbench/devs/AHI/Drivers/SB128/interrupt.h +++ b/workbench/devs/AHI/Drivers/SB128/interrupt.h @@ -15,20 +15,20 @@ All Rights Reserved. */ -#ifndef AHI_Drivers_interrupt_h -#define AHI_Drivers_interrupt_h +#ifndef AHI_Drivers_SB128_interrupt_h +#define AHI_Drivers_SB128_interrupt_h -#include +//#include #include "DriverData.h" LONG -CardInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* dd ); +CardInterrupt( struct SB128_DATA* dd ); void -PlaybackInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* dd ); +PlaybackInterrupt( struct SB128_DATA* dd ); void -RecordInterrupt( struct ExceptionContext *pContext, struct ExecBase *SysBase, struct CardData* dd ); +RecordInterrupt( struct SB128_DATA* dd ); -#endif /* AHI_Drivers_interrupt_h */ +#endif /* AHI_Drivers_SB128_interrupt_h */ diff --git a/workbench/devs/AHI/Drivers/SB128/misc.c b/workbench/devs/AHI/Drivers/SB128/misc.c index 195c427ae6..82c01c29bf 100755 --- a/workbench/devs/AHI/Drivers/SB128/misc.c +++ b/workbench/devs/AHI/Drivers/SB128/misc.c @@ -17,77 +17,88 @@ All Rights Reserved. #include -#undef __USE_INLINE__ -#include +#ifdef __AROS__ +#define DEBUG 1 +#include +#endif +#include #include -#include - -#include "library_card.h" +#include "library.h" #include "regs.h" #include "interrupt.h" #include "misc.h" -#include "DriverData.h" + +#include "pci_wrapper.h" + +#ifdef __AROS__ +#define DebugPrintF bug +INTGW(static, void, playbackinterrupt, PlaybackInterrupt); +INTGW(static, void, recordinterrupt, RecordInterrupt); +INTGW(static, ULONG, cardinterrupt, CardInterrupt); +#endif /* Global in Card.c */ extern const UWORD InputBits[]; -extern struct DOSIFace *IDOS; - -//extern struct timerequest *TimerIO; -extern struct MsgPort* replymp; /* Public functions in main.c */ -int card_init(struct CardData *card); -void card_cleanup(struct CardData *card); +int card_init(struct SB128_DATA *card); +void card_cleanup(struct SB128_DATA *card); -void AddResetHandler(struct CardData *card); +#if !defined(__AROS__) +void AddResetHandler(struct SB128_DATA *card); +#endif -void MicroDelay(unsigned int val) +void micro_delay(unsigned int val) { struct Device* TimerBase = NULL; - struct TimeRequest* TimerIO = NULL; + struct timerequest* TimerIO = NULL; struct MsgPort * replymp; - replymp = (struct MsgPort *) IExec->CreatePort(NULL, 0); + replymp = (struct MsgPort *) CreateMsgPort(); if (!replymp) { - IExec->DebugPrintF("SB128: Couldn't create reply port\n"); + DebugPrintF("SB128: Couldn't create reply port\n"); return; } - TimerIO = (struct TimeRequest *)IExec->CreateIORequest(replymp, sizeof(struct TimeRequest)); + TimerIO = (struct TimeRequest *)CreateIORequest(replymp, sizeof(struct timerequest)); if (TimerIO == NULL) { - IExec->DebugPrintF("SB128: Out of memory.\n"); + DebugPrintF("SB128: Out of memory.\n"); return; } - if (IExec->OpenDevice("timer.device", UNIT_MICROHZ, (struct IORequest *)TimerIO, 0) != 0) + if (OpenDevice((CONST_STRPTR) "timer.device", UNIT_MICROHZ, (struct IORequest *)TimerIO, 0) != 0) { - IExec->DebugPrintF("SB128: Unable to open 'timer.device'.\n"); + DebugPrintF("SB128: Unable to open 'timer.device'.\n"); return; } else { - TimerBase = (struct Device *)TimerIO->Request.io_Device; + TimerBase = (struct Device *)TimerIO->tr_node.io_Device; } if (TimerIO) { - TimerIO->Request.io_Command = TR_ADDREQUEST; - TimerIO->Time.Seconds = 0; - TimerIO->Time.Microseconds = val; - IExec->DoIO((struct IORequest *)TimerIO); - IExec->DeleteIORequest((struct IORequest *)TimerIO); + TimerIO->tr_node.io_Command = TR_ADDREQUEST; + TimerIO->tr_time.tv_secs = 0; + TimerIO->tr_time.tv_micro = val; + DoIO((struct IORequest *)TimerIO); + DeleteIORequest((struct IORequest *)TimerIO); TimerIO = NULL; - IExec->CloseDevice((struct IORequest *)TimerIO); - IExec->DeletePort(replymp); + CloseDevice((struct IORequest *)TimerIO); } + + if (replymp) + { + DeleteMsgPort(replymp); + } } -unsigned long src_ready(struct CardData *card) +unsigned long src_ready(struct SB128_DATA *card) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned int i; @@ -97,33 +108,33 @@ unsigned long src_ready(struct CardData *card) of the SRC register. */ for (i = 0; i < 0x1000; i++) { - if (!((r = dev->InLong(card->iobase + SB128_SRC)) & SRC_BUSY)) + if (!((r = pci_inl(SB128_SRC, card)) & SRC_BUSY)) return r; - //MicroDelay(1); + //micro_delay(1); } - IExec->DebugPrintF("SB128: SRC Ready timeout.\n"); + DebugPrintF("SB128: SRC Ready timeout.\n"); return 0; } -void src_write(struct CardData *card, unsigned short addr, unsigned short data) +void src_write(struct SB128_DATA *card, unsigned short addr, unsigned short data) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned long r; -// IExec->ObtainSemaphore(&card->sb128_semaphore); +// ObtainSemaphore(&card->sb128_semaphore); /* Get copy of SRC register when it's not busy, add address and data, write back. */ r = src_ready(card) & (SRC_DISABLE | SRC_DIS_DAC2 | SRC_DIS_ADC); r = r | (addr << SRC_ADDR_SHIFT); r = r | data; - dev->OutLong(card->iobase + SB128_SRC, r | SRC_WE); - //MicroDelay(1); + pci_outl(r | SRC_WE, SB128_SRC, card); + //micro_delay(1); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); +// ReleaseSemaphore(&card->sb128_semaphore); } -unsigned short src_read(struct CardData *card, unsigned short addr) +unsigned short src_read(struct SB128_DATA *card, unsigned short addr) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; @@ -131,24 +142,24 @@ unsigned short src_read(struct CardData *card, unsigned short addr) unsigned long r; -// IExec->ObtainSemaphore(&card->sb128_semaphore); +// ObtainSemaphore(&card->sb128_semaphore); /* Get copy of SRC register when it's not busy, add address, write back, wait for ready, then read back value. */ r = src_ready(card) & (SRC_DISABLE | SRC_DIS_DAC2 | SRC_DIS_ADC); r = r | (addr << SRC_ADDR_SHIFT); - dev->OutLong(card->iobase + SB128_SRC, r); + pci_outl(r, SB128_SRC, card); /* Give the chip a chance to set the busy bit. */ - //MicroDelay(1); + //micro_delay(1); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); +// ReleaseSemaphore(&card->sb128_semaphore); return (src_ready(card) & 0xFFFF); } /* Translate AC97 commands to AK4531 commands, and write to the AK4531 codec */ -void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short val) +void ak4531_ac97_write(struct SB128_DATA *card, unsigned short reg, unsigned short val) { char ak4531_L1 = 0; char ak4531_R1 = 0; @@ -213,7 +224,7 @@ void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short default: /* Shouldn't happen */ - IExec->DebugPrintF("SB128: Unsupported Record Input command\n"); + DebugPrintF("SB128: Unsupported Record Input command\n"); } switch (input_right) { @@ -259,7 +270,7 @@ void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short default: /* Shouldn't happen */ - IExec->DebugPrintF("SB128: Unsupported Record Input command\n"); + DebugPrintF("SB128: Unsupported Record Input command\n"); } /* Write input values to AK4531 */ @@ -410,7 +421,7 @@ void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short break; default: - IExec->DebugPrintF("SB128: Invalid value for Volume Set\n"); + DebugPrintF("SB128: Invalid value for Volume Set\n"); } return; @@ -419,28 +430,28 @@ void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short } -void codec_write(struct CardData *card, unsigned short reg, unsigned short val) +void codec_write(struct SB128_DATA *card, unsigned short reg, unsigned short val) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned long i, r; /* Take hold of the hardware semaphore */ - //IExec->ObtainSemaphore(&card->sb128_semaphore); + //ObtainSemaphore(&card->sb128_semaphore); if(card->es1370) { for (i = 0; i < 10; i++) { - if (!(dev->InLong(card->iobase + SB128_STATUS) & CODEC_CSTAT )) + if (!(pci_inl(SB128_STATUS, card) & CODEC_CSTAT )) goto es1370_ok1; - IDOS->Delay(1); + Delay(1); } - IExec->DebugPrintF("SB128: Couldn't write to ak4531!\n"); + DebugPrintF("SB128: Couldn't write to ak4531!\n"); return; es1370_ok1: - dev->OutWord(card->iobase + ES1370_SB128_CODEC, ((unsigned char)reg << ES1370_CODEC_ADD_SHIFT) | (unsigned char)val); - MicroDelay(100); + pci_outw(((unsigned char)reg << ES1370_CODEC_ADD_SHIFT) | (unsigned char)val, ES1370_SB128_CODEC, card); + micro_delay(100); } else { @@ -448,65 +459,64 @@ void codec_write(struct CardData *card, unsigned short reg, unsigned short val) /* Check for WIP. */ for (i = 0; i < 0x1000; i++) { - if (!(dev->InLong(card->iobase + SB128_CODEC) & CODEC_WIP )) + if (!(pci_inl(SB128_CODEC, card) & CODEC_WIP )) goto ok1; } - IExec->DebugPrintF("SB128: Couldn't write to ac97! (1)\n"); - //IExec->ReleaseSemaphore(&card->sb128_semaphore); + DebugPrintF("SB128: Couldn't write to ac97! (1)\n"); + //ReleaseSemaphore(&card->sb128_semaphore); return; ok1: /* Get copy of SRC register when it's not busy. */ r = src_ready(card); /* Enable "SRC State Data", an undocumented feature! */ - dev->OutLong(card->iobase + SB128_SRC, (r & (SRC_DISABLE | SRC_DIS_DAC2 | - SRC_DIS_ADC)) | 0x00010000); + pci_outl((r & (SRC_DISABLE | SRC_DIS_DAC2 | SRC_DIS_ADC)) | 0x00010000, SB128_SRC, card); /* Wait for "state 0", to avoid "transition states". */ for (i = 0; i < 0x1000; i++) { - if ((dev->InLong(card->iobase + SB128_SRC) & 0x00870000) == 0x00) + if ((pci_inl(SB128_SRC, card) & 0x00870000) == 0x00) break; - //MicroDelay(1); + //micro_delay(1); } /* Now wait for an undocumented bit to be set (and the SRC to be NOT busy) */ for (i = 0; i < 0x1000; i++) { - if ((dev->InLong(card->iobase + SB128_SRC) & 0x00870000) == 0x00010000) + if ((pci_inl(SB128_SRC, card) & 0x00870000) == 0x00010000) break; - //MicroDelay(1); + //micro_delay(1); } /* Write out the value to the codec now. */ - dev->OutLong(card->iobase + SB128_CODEC, (((reg << CODEC_ADD_SHIFT) & CODEC_ADD_MASK) | val)); + pci_outl((((reg << CODEC_ADD_SHIFT) & CODEC_ADD_MASK) | val), SB128_CODEC, card); /* Delay to make sure the chip had time to set the WIP after the codec write. */ - //MicroDelay(1); + //micro_delay(1); /* Restore SRC register. */ src_ready(card); - dev->OutLong(card->iobase + SB128_SRC, r); + pci_outl(r, SB128_SRC, card); /* Check for WIP before returning. */ for (i = 0; i < 0x1000; i++) { - if (!(dev->InLong(card->iobase + SB128_CODEC) & CODEC_WIP)) + if (!(pci_inl(SB128_CODEC, card) & CODEC_WIP)) { - //IExec->ReleaseSemaphore(&card->sb128_semaphore); + //ReleaseSemaphore(&card->sb128_semaphore); return; } } - IExec->DebugPrintF("SB128: Couldn't write to ac97! (2)\n"); + DebugPrintF("SB128: Couldn't write to ac97! (2)\n"); } - //IExec->ReleaseSemaphore(&card->sb128_semaphore); + //ReleaseSemaphore(&card->sb128_semaphore); return; } -unsigned short codec_read(struct CardData *card, unsigned short reg) +unsigned short codec_read(struct SB128_DATA *card, unsigned short reg) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned long i, r; @@ -515,15 +525,15 @@ unsigned short codec_read(struct CardData *card, unsigned short reg) if(card->es1370) return 0; -//IExec->ObtainSemaphore(&card->sb128_semaphore); +//ObtainSemaphore(&card->sb128_semaphore); /* Check for WIP. */ for (i = 0; i < 0x1000; i++) { - if (!((dev->InLong(card->iobase + SB128_CODEC)) & CODEC_WIP )) + if (!((pci_inl(SB128_CODEC, card)) & CODEC_WIP )) goto ok1; } - IExec->DebugPrintF("SB128: Couldn't read from ac97! (1)\n"); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); + DebugPrintF("SB128: Couldn't read from ac97! (1)\n"); +// ReleaseSemaphore(&card->sb128_semaphore); return 0; ok1: @@ -532,74 +542,73 @@ unsigned short codec_read(struct CardData *card, unsigned short reg) r = src_ready(card); /* Enable "SRC State Data", an undocumented feature! */ - dev->OutLong(card->iobase + SB128_SRC, (r & (SRC_DISABLE | SRC_DIS_DAC1 | SRC_DIS_DAC2 | - SRC_DIS_ADC)) | 0x00010000); + pci_outl((r & (SRC_DISABLE | SRC_DIS_DAC1 | SRC_DIS_DAC2 | SRC_DIS_ADC)) | 0x00010000, SB128_SRC, card); /* Wait for "state 0", to avoid "transition states". Seen in open code. */ for (i = 0; i < 0x1000; i++) { - if ((dev->InLong(card->iobase + SB128_SRC) & 0x00870000) == 0x00) + if ((pci_inl(SB128_SRC, card) & 0x00870000) == 0x00) break; - //MicroDelay(1); + //micro_delay(1); } /* Now wait for an undocumented bit to be set (and the SRC to be NOT busy) */ for (i = 0; i < 0x1000; i++) { - if ((dev->InLong(card->iobase + SB128_SRC) & 0x00870000) == 0x00010000) + if ((pci_inl(SB128_SRC, card) & 0x00870000) == 0x00010000) break; - //MicroDelay(1); + //micro_delay(1); } /* Write the read request to the chip now */ - dev->OutLong(card->iobase + SB128_CODEC, (((reg << CODEC_ADD_SHIFT) & CODEC_ADD_MASK) | CODEC_READ)); + pci_outl((((reg << CODEC_ADD_SHIFT) & CODEC_ADD_MASK) | CODEC_READ), SB128_CODEC, card); /* Give the chip time to respond to our read request. */ - //MicroDelay(1); + //micro_delay(1); /* Restore SRC register. */ src_ready(card); - dev->OutLong(card->iobase + SB128_SRC, r); + pci_outl(r, SB128_SRC, card); /* Check for WIP. */ for (i = 0; i < 0x1000; i++) { - if (!((dev->InLong(card->iobase + SB128_CODEC)) & CODEC_WIP)) + if (!((pci_inl(SB128_CODEC, card)) & CODEC_WIP)) goto ok2; } - IExec->DebugPrintF("SB128: Couldn't read from ac97 (2)!\n"); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); + DebugPrintF("SB128: Couldn't read from ac97 (2)!\n"); +// ReleaseSemaphore(&card->sb128_semaphore); return 0; ok2: /* Wait for RDY. */ - //MicroDelay(1); + //micro_delay(1); for (i = 0; i < 0x1000; i++) { - if (!((dev->InLong(card->iobase + SB128_CODEC)) & CODEC_RDY)) + if (!((pci_inl(SB128_CODEC, card)) & CODEC_RDY)) goto ok3; } - IExec->DebugPrintF("SB128: Couldn't read from ac97 (3)!\n"); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); + DebugPrintF("SB128: Couldn't read from ac97 (3)!\n"); +// ReleaseSemaphore(&card->sb128_semaphore); return 0; ok3: - //MicroDelay(5); - IDOS->Delay(1); //A delay here is crucial, remove this if you use MicroDelay() - val = dev->InLong(card->iobase + SB128_CODEC); + //micro_delay(5); + Delay(1); //A delay here is crucial, remove this if you use micro_delay() + val = pci_inl(SB128_CODEC, card); -// IExec->ReleaseSemaphore(&card->sb128_semaphore); +// ReleaseSemaphore(&card->sb128_semaphore); return val; } -void rate_set_adc(struct CardData *card, unsigned long rate) +void rate_set_adc(struct SB128_DATA *card, unsigned long rate) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned long n, truncm, freq; - //IExec->ObtainSemaphore(&card->sb128_semaphore); + //ObtainSemaphore(&card->sb128_semaphore); if (rate > 48000) rate = 48000; @@ -608,7 +617,7 @@ void rate_set_adc(struct CardData *card, unsigned long rate) if (card->es1370) { - dev->OutLong(card->iobase + SB128_CONTROL, ((dev->InLong(card->iobase + SB128_CONTROL) & ~DAC2_DIV_MASK) | (DAC2_SRTODIV(rate) << DAC2_DIV_SHIFT))); + pci_outl(((pci_inl(SB128_CONTROL, card) & ~DAC2_DIV_MASK) | (DAC2_SRTODIV(rate) << DAC2_DIV_SHIFT)), SB128_CONTROL, card); } else { @@ -640,17 +649,17 @@ void rate_set_adc(struct CardData *card, unsigned long rate) } - //IExec->ReleaseSemaphore(&card->sb128_semaphore); + //ReleaseSemaphore(&card->sb128_semaphore); } -void rate_set_dac2(struct CardData *card, unsigned long rate) +void rate_set_dac2(struct SB128_DATA *card, unsigned long rate) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned long freq, r; - //IExec->ObtainSemaphore(&card->sb128_semaphore); + //ObtainSemaphore(&card->sb128_semaphore); if (rate > 48000) rate = 48000; @@ -659,7 +668,7 @@ void rate_set_dac2(struct CardData *card, unsigned long rate) if(card->es1370) { - dev->OutLong(card->iobase + SB128_CONTROL, ((dev->InLong(card->iobase + SB128_CONTROL) & ~DAC2_DIV_MASK) | (DAC2_SRTODIV(rate) << DAC2_DIV_SHIFT))); + pci_outl(((pci_inl(SB128_CONTROL, card) & ~DAC2_DIV_MASK) | (DAC2_SRTODIV(rate) << DAC2_DIV_SHIFT)), SB128_CONTROL, card); } else { @@ -668,18 +677,18 @@ void rate_set_dac2(struct CardData *card, unsigned long rate) /* Get copy of SRC register when it's not busy, clear, preserve the disable bits, write back. */ r = src_ready(card) & (SRC_DISABLE | SRC_DIS_DAC1 | SRC_DIS_DAC2 | SRC_DIS_ADC); - dev->OutLong(card->iobase + SB128_SRC, r); + pci_outl(r, SB128_SRC, card); /* This is completely undocumented */ src_write(card, SRC_DAC2 + SRC_INT, (src_read(card, SRC_DAC2 + SRC_INT) & 0x00FF) | ((freq >> 5) & 0xFC00)); src_write(card, SRC_DAC2 + SRC_VF, freq & 0x7FFF); r = (src_ready(card) & (SRC_DISABLE | SRC_DIS_DAC1 | SRC_DIS_ADC)); - dev->OutLong(card->iobase + SB128_SRC, r); + pci_outl(r, SB128_SRC, card); } - //IExec->ReleaseSemaphore(&card->sb128_semaphore); + //ReleaseSemaphore(&card->sb128_semaphore); } @@ -691,18 +700,19 @@ void rate_set_dac2(struct CardData *card, unsigned long rate) handling CAMD support too, it needs to be done at driver loading time. */ -struct CardData* +struct SB128_DATA* AllocDriverData( struct PCIDevice * dev, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card; UWORD command_word; int i; - BOOL res = FALSE; + + bug("[SB128]: %s()\n", __PRETTY_FUNCTION__); // FIXME: This should be non-cachable, DMA-able memory - card = IExec->AllocVec( sizeof( *card ), MEMF_PUBLIC | MEMF_CLEAR ); + card = AllocVec( sizeof( *card ), MEMF_PUBLIC | MEMF_CLEAR ); if( card == NULL ) { @@ -712,55 +722,64 @@ AllocDriverData( struct PCIDevice * dev, card->ahisubbase = AHIsubBase; - card->interrupt.is_Node.ln_Type = NT_EXTINTERRUPT; + card->interrupt.is_Node.ln_Type = IRQTYPE; card->interrupt.is_Node.ln_Pri = 0; card->interrupt.is_Node.ln_Name = (STRPTR) LibName; - card->interrupt.is_Code = (void(*)(void)) CardInterrupt; +#ifdef __AROS__ + card->interrupt.is_Code = (void(*)(void))&cardinterrupt; +#else + card->interrupt.is_Code = (void(*)(void))CardInterrupt; +#endif card->interrupt.is_Data = (APTR) card; - card->playback_interrupt.is_Node.ln_Type = NT_INTERRUPT; + card->playback_interrupt.is_Node.ln_Type = IRQTYPE; card->playback_interrupt.is_Node.ln_Pri = 0; card->playback_interrupt.is_Node.ln_Name = (STRPTR) LibName; - card->playback_interrupt.is_Code = PlaybackInterrupt; +#ifdef __AROS__ + card->playback_interrupt.is_Code = (void(*)(void))&playbackinterrupt; +#else + card->playback_interrupt.is_Code = (void(*)(void))PlaybackInterrupt; +#endif card->playback_interrupt.is_Data = (APTR) card; - card->record_interrupt.is_Node.ln_Type = NT_INTERRUPT; + card->record_interrupt.is_Node.ln_Type = IRQTYPE; card->record_interrupt.is_Node.ln_Pri = 0; card->record_interrupt.is_Node.ln_Name = (STRPTR) LibName; - card->record_interrupt.is_Code = RecordInterrupt; +#ifdef __AROS__ + card->record_interrupt.is_Code = (void(*)(void))&recordinterrupt; +#else + card->record_interrupt.is_Code = (void(*)(void))RecordInterrupt; +#endif card->record_interrupt.is_Data = (APTR) card; card->pci_dev = dev; - command_word = dev->ReadConfigWord( PCI_COMMAND ); + command_word = inw_config( PCI_COMMAND , dev); command_word |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER; - dev->WriteConfigWord( PCI_COMMAND, command_word ); + outw_config( PCI_COMMAND, command_word , dev); card->pci_master_enabled = TRUE; - card->iobase = dev->GetResourceRange(0)->BaseAddress; - card->length = ~( dev->GetResourceRange(0)->Size & PCI_BASE_ADDRESS_IO_MASK ); - card->irq = dev->MapInterrupt(); - card->chiprev = dev->ReadConfigByte( PCI_REVISION_ID); - card->model = dev->ReadConfigWord( PCI_SUBSYSTEM_ID); - - IExec->DebugPrintF("SB128: Device = %x, Vendor = %x, Revision = %x\n", dev->ReadConfigWord(PCI_DEVICE_ID), - dev->ReadConfigWord(PCI_VENDOR_ID), dev->ReadConfigByte(PCI_REVISION_ID)); + card->iobase = ahi_pci_get_base_address(0, dev); + card->length = ~( ahi_pci_get_base_size(0, dev) & PCI_BASE_ADDRESS_IO_MASK ); + card->irq = ahi_pci_get_irq(dev); + card->chiprev = inb_config(PCI_REVISION_ID, dev); + card->model = inw_config(PCI_SUBSYSTEM_ID, dev); + bug("[CMI8738]: %s: iobase = 0x%p, len = %d\n", __PRETTY_FUNCTION__, card->iobase, card->length); /* Initialise hardware access Semaphore */ - IExec->InitSemaphore(&card->sb128_semaphore); + InitSemaphore(&card->sb128_semaphore); /* Initialize chip */ if( card_init( card ) < 0 ) { - IExec->DebugPrintF("SB128: Unable to initialize Card subsystem."); + DebugPrintF("SB128: Unable to initialize Card subsystem."); return NULL; } - - res = IExec->AddIntServer(dev->MapInterrupt(), &card->interrupt ); + ahi_pci_add_intserver(&card->interrupt, dev); card->interrupt_added = TRUE; @@ -772,8 +791,10 @@ AllocDriverData( struct PCIDevice * dev, card->output_volume = Linear2MixerGain( 0x10000, &card->output_volume_bits ); SaveMixerState(card); +#if !defined(__AROS__) AddResetHandler(card); - +#endif + return card; } @@ -785,7 +806,7 @@ AllocDriverData( struct PCIDevice * dev, /* And this code used to be in _AHIsub_FreeAudio(). */ void -FreeDriverData( struct CardData* card, +FreeDriverData( struct SB128_DATA* card, struct DriverBase* AHIsubBase ) { if( card != NULL ) @@ -801,30 +822,30 @@ FreeDriverData( struct CardData* card, { UWORD cmd; - cmd = ((struct PCIDevice * ) card->pci_dev)->ReadConfigWord( PCI_COMMAND ); + cmd = inw_config(PCI_COMMAND, (struct PCIDevice * ) card->pci_dev); cmd &= ~( PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER ); - ((struct PCIDevice * ) card->pci_dev)->WriteConfigWord( PCI_COMMAND, cmd ); + outw_config(PCI_COMMAND, cmd, (struct PCIDevice * ) card->pci_dev ); } } if( card->interrupt_added ) { - IExec->RemIntServer(((struct PCIDevice * ) card->pci_dev)->MapInterrupt(), &card->interrupt ); + ahi_pci_rem_intserver(&card->interrupt, card->pci_dev); } - IExec->FreeVec( card ); + FreeVec( card ); } } -int card_init(struct CardData *card) +int card_init(struct SB128_DATA *card) { struct PCIDevice *dev = (struct PCIDevice *) card->pci_dev; unsigned short cod; unsigned int i; /* Check if the card is an original ES1370 - different code needed */ - if (dev->ReadConfigWord(2) == 0x5000) + if (inw_config(2, dev) == 0x5000) card->es1370 = TRUE; else card->es1370 = FALSE; @@ -833,9 +854,9 @@ int card_init(struct CardData *card) if (card->es1370) { /* Enable CODEC access, set DAC sample rate to 44100 */ - dev->OutLong(card->iobase + SB128_CONTROL, CTRL_CDC_EN | (DAC2_SRTODIV(44100) << DAC2_DIV_SHIFT)); - dev->OutLong(card->iobase + SB128_SCON, 0x00); - IExec->DebugPrintF("SB128: Did RATE init\n"); + pci_outl(CTRL_CDC_EN | (DAC2_SRTODIV(44100) << DAC2_DIV_SHIFT), SB128_CONTROL, card); + pci_outl(0x00, SB128_SCON, card); + DebugPrintF("SB128: Did RATE init\n"); /* CODEC initialisation */ codec_write(card, AK4531_RESET, 0x03); /* Enable CODEC */ @@ -877,37 +898,37 @@ int card_init(struct CardData *card) codec_write(card, AK4531_INPUT_MUX_L_2, 0x80); codec_write(card, AK4531_INPUT_MUX_R_2, 0x80); - IExec->DebugPrintF("SB128: Did VOLUME init\n"); + DebugPrintF("SB128: Did VOLUME init\n"); } else { /* Basic clear of everything */ - dev->OutLong(card->iobase + SB128_CONTROL, 0x00); - dev->OutLong(card->iobase + SB128_SCON, 0x00); - dev->OutLong(card->iobase + SB128_LEGACY, 0x00); + pci_outl(0x00, SB128_CONTROL, card); + pci_outl(0x00, SB128_SCON, card); + pci_outl(0x00, SB128_LEGACY, card); /* Magical CT5880 AC97 enable bit plus 20ms delay (Gotta love the undocumented stuff) */ - dev->OutLong(card->iobase + SB128_STATUS, 0x20000000); - IDOS->Delay(1); + pci_outl(0x20000000, SB128_STATUS, card); + Delay(1); /* Assert the AC97 reset, and wait 20ms */ - dev->OutLong(card->iobase + SB128_CONTROL, CODEC_RESET); - IDOS->Delay(1); + pci_outl(CODEC_RESET, SB128_CONTROL, card); + Delay(1); /* De-assert delay, and wait 20ms */ - dev->OutLong(card->iobase + SB128_CONTROL, 0x00); - IDOS->Delay(1); + pci_outl(0x00, SB128_CONTROL, card); + Delay(1); - IExec->DebugPrintF("SB128: Did AC97 reset.\n"); + DebugPrintF("SB128: Did AC97 reset.\n"); /* Disable the Sample Rate Converter (SRC) */ src_ready(card); - dev->OutLong(card->iobase + SB128_SRC, SRC_DISABLE); + pci_outl(SRC_DISABLE, SB128_SRC, card); /* Clear the SRC RAM */ for (i = 0; i < 0x80; i++) src_write(card, i, 0); - IExec->DebugPrintF("SB128: Did SRC wipe.\n"); + DebugPrintF("SB128: Did SRC wipe.\n"); /* Perform basic configuration of the SRC, not well documented! */ src_write(card, SRC_DAC1 + SRC_TRUNC, 0x100); @@ -921,19 +942,19 @@ int card_init(struct CardData *card) src_write(card, SRC_VOL_DAC2, 0x1000); src_write(card, SRC_VOL_DAC2 + 1, 0x1000); - IExec->DebugPrintF("SB128: Did SRC init.\n"); + DebugPrintF("SB128: Did SRC init.\n"); rate_set_adc(card, 44100); rate_set_dac2(card, 44100); /* Re-enable the SRC */ src_ready(card); - dev->OutLong(card->iobase + SB128_SRC, 0); + pci_outl(0, SB128_SRC, card); card->currentPlayFreq = 9; card->currentRecFreq = 9; - IExec->DebugPrintF("SB128: Did RATE init.\n"); + DebugPrintF("SB128: Did RATE init.\n"); /* Initialise registers of AC97 to default */ codec_write(card, AC97_RESET, 0x00); @@ -956,23 +977,23 @@ int card_init(struct CardData *card) codec_write(card, AC97_AUX_VOL, 0x0808 ); codec_write(card, AC97_PCMOUT_VOL, 0x0808 ); - IExec->DebugPrintF("SB128: Did VOLUME init.\n"); + DebugPrintF("SB128: Did VOLUME init.\n"); cod = codec_read(card, AC97_RESET); - IExec->DebugPrintF("SB128: AC97 capabilities = %x\n", cod); + DebugPrintF("SB128: AC97 capabilities = %x\n", cod); cod = codec_read(card, AC97_VENDOR_ID0); - IExec->DebugPrintF("SB128: AC97_VENDOR_ID0 = %x\n", cod); + DebugPrintF("SB128: AC97_VENDOR_ID0 = %x\n", cod); cod = codec_read(card, AC97_VENDOR_ID1); - IExec->DebugPrintF("SB128: AC97_VENDOR_ID1 = %x\n", cod); + DebugPrintF("SB128: AC97_VENDOR_ID1 = %x\n", cod); } return 0; } -void card_cleanup(struct CardData *card) +void card_cleanup(struct SB128_DATA *card) { } @@ -983,7 +1004,7 @@ void card_cleanup(struct CardData *card) ******************************************************************************/ void -SaveMixerState( struct CardData* card ) +SaveMixerState( struct SB128_DATA* card ) { card->ac97_mic = codec_read( card, AC97_MIC_VOL ); card->ac97_cd = codec_read( card, AC97_CD_VOL ); @@ -994,7 +1015,7 @@ SaveMixerState( struct CardData* card ) void -RestoreMixerState( struct CardData* card ) +RestoreMixerState( struct SB128_DATA* card ) { if(card->es1370) { @@ -1016,7 +1037,7 @@ RestoreMixerState( struct CardData* card ) } void -UpdateMonitorMixer( struct CardData* card ) +UpdateMonitorMixer( struct SB128_DATA* card ) { int i = InputBits[ card->input ]; UWORD m = card->monitor_volume_bits & 0x801f; @@ -1180,62 +1201,59 @@ SamplerateToLinearPitch( ULONG samplingrate ) } -void *pci_alloc_consistent(size_t size, APTR * NonAlignedAddress) +void *pci_alloc_consistent(size_t size, APTR *NonAlignedAddress, unsigned int boundary) { - void* address; - unsigned long a; + void* address; + unsigned long a; - if (IExec->OpenResource("newmemory.resource")) - { - address = IExec->AllocVecTags(size, AVT_Type, MEMF_SHARED, AVT_Contiguous, TRUE, AVT_Lock, TRUE, - AVT_PhysicalAlignment, CACHELINE_SIZE, AVT_Clear, 0, TAG_DONE); + bug("[CMI8738]: %s()\n", __PRETTY_FUNCTION__); - *NonAlignedAddress = address; - } - else - { - address = IExec->AllocVec(size + CACHELINE_SIZE, MEMF_PUBLIC | MEMF_CLEAR); + address = (void *) AllocVec(size + boundary, MEMF_PUBLIC | MEMF_CLEAR); - *NonAlignedAddress = address; + if (address != NULL) + { + a = (unsigned long) address; + a = (a + boundary - 1) & ~(boundary - 1); + address = (void *) a; + } - if( address != NULL ) + if (NonAlignedAddress) { - a = (unsigned long) address; - a = (a + CACHELINE_SIZE - 1) & ~(CACHELINE_SIZE - 1); - address = (void *) a; + *NonAlignedAddress = address; } - - } - - return address; + + return address; } void pci_free_consistent(void* addr) { - IExec->FreeVec(addr); + bug("[CMI8738]: %s()\n", __PRETTY_FUNCTION__); + + FreeVec(addr); } -static ULONG ResetHandler(struct ExceptionContext *ctx, struct ExecBase *pExecBase, struct CardData *card) +static ULONG ResetHandler(struct ExceptionContext *ctx, struct ExecBase *pExecBase, struct SB128_DATA *card) { struct PCIDevice *dev = card->pci_dev; //Stop SB128 interrupts and playback/recording unsigned long ctrl; - ctrl = dev->InLong(card->iobase + SB128_CONTROL); + ctrl = pci_inl(SB128_CONTROL, card); ctrl &= ( ~(CTRL_DAC2_EN) & ~(CTRL_ADC_EN) ); /* Stop */ - dev->OutLong(card->iobase + SB128_CONTROL, ctrl); + pci_outl(ctrl, SB128_CONTROL, card); /* Clear and mask interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON)) & SB128_IRQ_MASK); + pci_outl((pci_inl(SB128_SCON, card) & SB128_IRQ_MASK), SB128_SCON, card); return 0UL; } -void AddResetHandler(struct CardData *card) +#if !defined(__AROS__) +void AddResetHandler(struct SB128_DATA *card) { static struct Interrupt interrupt; @@ -1245,6 +1263,6 @@ void AddResetHandler(struct CardData *card) interrupt.is_Node.ln_Type = NT_EXTINTERRUPT; interrupt.is_Node.ln_Name = "SB128 Reset Handler"; - IExec->AddResetCallback( &interrupt ); + AddResetCallback( &interrupt ); } - +#endif diff --git a/workbench/devs/AHI/Drivers/SB128/misc.h b/workbench/devs/AHI/Drivers/SB128/misc.h index b072dc886c..7074928c45 100755 --- a/workbench/devs/AHI/Drivers/SB128/misc.h +++ b/workbench/devs/AHI/Drivers/SB128/misc.h @@ -18,33 +18,33 @@ All Rights Reserved. #ifndef AHI_Drivers_misc_h #define AHI_Drivers_h -#include +//#include #include #include #include -void codec_write(struct CardData *card, unsigned short reg, unsigned short val); -unsigned short codec_read(struct CardData *card, unsigned short reg); +void codec_write(struct SB128_DATA *card, unsigned short reg, unsigned short val); +unsigned short codec_read(struct SB128_DATA *card, unsigned short reg); -void ak4531_ac97_write(struct CardData *card, unsigned short reg, unsigned short val); +void ak4531_ac97_write(struct SB128_DATA *card, unsigned short reg, unsigned short val); -struct CardData* +struct SB128_DATA* AllocDriverData( struct PCIDevice* dev, struct DriverBase* AHIsubBase ); void -FreeDriverData( struct CardData* card, +FreeDriverData( struct SB128_DATA* card, struct DriverBase* AHIsubBase ); void -SaveMixerState( struct CardData* card ); +SaveMixerState( struct SB128_DATA* card ); void -RestoreMixerState( struct CardData* card ); +RestoreMixerState( struct SB128_DATA* card ); void -UpdateMonitorMixer( struct CardData* card ); +UpdateMonitorMixer( struct SB128_DATA* card ); Fixed Linear2MixerGain( Fixed linear, @@ -57,7 +57,7 @@ Linear2RecordGain( Fixed linear, ULONG SamplerateToLinearPitch( ULONG samplingrate ); -void *pci_alloc_consistent(size_t size, APTR * NonAlignedaddress); +void *pci_alloc_consistent(size_t size, APTR *NonAlignedAddress, unsigned int boundary); void pci_free_consistent(void* addr); diff --git a/workbench/devs/AHI/Drivers/SB128/pci_aros.c b/workbench/devs/AHI/Drivers/SB128/pci_aros.c new file mode 100644 index 0000000000..54ef641637 --- /dev/null +++ b/workbench/devs/AHI/Drivers/SB128/pci_aros.c @@ -0,0 +1,480 @@ +#define __OOP_NOATTRBASES__ + +//#include + +#include +#include +#include +#include +#include +#include +#include + +#include + +#include "DriverData.h" +#include "pci_wrapper.h" + +#include +#define KPrintF kprintf + +struct Library *OOPBase; + + +static OOP_AttrBase __IHidd_PCIDev; +static OOP_Object *pciobj, *irqobj; + +static OOP_MethodID mid_RB; +static OOP_MethodID mid_RW; +static OOP_MethodID mid_RL; + +static OOP_MethodID mid_WB; +static OOP_MethodID mid_WW; +static OOP_MethodID mid_WL; + +static HIDDT_IRQ_Handler inthandler; +static BOOL inthandler_added; + +BOOL ahi_pci_init(struct DriverBase* AHIsubBase) +{ + OOPBase = OpenLibrary(AROSOOP_NAME, 0); + if (OOPBase) + { + __IHidd_PCIDev = OOP_ObtainAttrBase(IID_Hidd_PCIDevice); + if (__IHidd_PCIDev) + { + pciobj = OOP_NewObject(NULL, CLID_Hidd_PCI, NULL); + irqobj = OOP_NewObject(NULL, CLID_Hidd_IRQ, NULL); + + if (pciobj && irqobj) + { + mid_RB = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_ReadConfigByte); + mid_RW = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_ReadConfigWord); + mid_RL = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_ReadConfigLong); + + mid_WB = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_WriteConfigByte); + mid_WW = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_WriteConfigWord); + mid_WL = OOP_GetMethodID(IID_Hidd_PCIDevice, moHidd_PCIDevice_WriteConfigLong); + + return TRUE; + } + } + } + + return FALSE; +} + +void ahi_pci_exit(void) +{ + if (irqobj) + OOP_DisposeObject(irqobj); + if (pciobj) + OOP_DisposeObject(pciobj); + if (__IHidd_PCIDev) + OOP_ReleaseAttrBase(IID_Hidd_PCIDevice); + if (OOPBase) + CloseLibrary(OOPBase); +} + +struct enum_data +{ + OOP_Object *prev_dev; + OOP_Object *found_dev; +}; + +static AROS_UFH3(void, Enumerator, + AROS_UFHA(struct Hook *, hook, A0), + AROS_UFHA(OOP_Object *, device, A2), + AROS_UFHA(APTR, msg, A1)) +{ + AROS_USERFUNC_INIT + + struct enum_data *ed = (struct enum_data *)hook->h_Data; + + if ((ed->found_dev == 0) && (device != ed->prev_dev)) + { + ed->found_dev = device; + } + + AROS_USERFUNC_EXIT +} + + +APTR ahi_pci_find_device(ULONG vendorid, ULONG deviceid, APTR dev) +{ + struct enum_data ed; + + struct Hook FindHook = + { + h_Entry: (HOOKFUNC)Enumerator, + h_Data: &ed, + }; + + struct TagItem Reqs[] = + { +#if 0 + { tHidd_PCI_Class , 0x04 }, /* Multimedia */ + { tHidd_PCI_SubClass , 0x01 }, /* Audio */ +#endif + { tHidd_PCI_VendorID , vendorid }, + { tHidd_PCI_ProductID , deviceid }, + { TAG_DONE , 0 }, + }; + + struct pHidd_PCI_EnumDevices enummsg = + { + mID: OOP_GetMethodID(CLID_Hidd_PCI, moHidd_PCI_EnumDevices), + callback: &FindHook, + requirements: (struct TagItem *)&Reqs, + }, *msg = &enummsg; + + ed.prev_dev = (OOP_Object *)dev; + ed.found_dev = 0; + + OOP_DoMethod(pciobj, (OOP_Msg)msg); + + //KPrintF("ahi_pci_find_device: found_dev = %lx\n", ed.found_dev); + + return (APTR)ed.found_dev; +} + +ULONG pci_inl(ULONG addr, struct SB128_DATA *card) +{ + return (*((volatile ULONG *)(card->iobase + addr))); +} + +UWORD pci_inw(ULONG addr, struct SB128_DATA *card) +{ + return (*((volatile UWORD *)(card->iobase + addr))); +} + +UBYTE pci_inb(ULONG addr, struct SB128_DATA *card) +{ + return (*((volatile UBYTE *)(card->iobase + addr))); +} + +void pci_outl(ULONG value, ULONG addr, struct SB128_DATA *card) +{ + *((volatile ULONG *)(card->iobase + addr)) = (value); + pci_inl(addr, card); +} + +void pci_outw(UWORD value, ULONG addr, struct SB128_DATA *card) +{ + *((volatile UWORD *)(card->iobase + addr)) = (value); + pci_inw(addr, card); +} + +void pci_outb(UBYTE value, ULONG addr, struct SB128_DATA *card) +{ + *((volatile UBYTE *)(card->iobase + addr)) = (value); + pci_inb(addr, card); +} + +void outb_setbits(UBYTE value, ULONG addr, struct SB128_DATA *card) +{ + UBYTE data = pci_inb(addr, card); + data |= value; + + pci_outb(data, addr, card); +} + + +void outb_clearbits(UBYTE value, ULONG addr, struct SB128_DATA *card) +{ + UBYTE data = pci_inb(addr, card); + data &= ~value; + + pci_outb(data, addr, card); +} + + +void outw_setbits(UWORD value, ULONG addr, struct SB128_DATA *card) +{ + UWORD data = pci_inw(addr, card); + data |= value; + + pci_outw(data, addr, card); +} + + +void outw_clearbits(UWORD value, ULONG addr, struct SB128_DATA *card) +{ + UWORD data = pci_inw(addr, card); + data &= ~value; + + pci_outw(data, addr, card); +} + + +void outl_setbits(ULONG value, ULONG addr, struct SB128_DATA *card) +{ + ULONG data = pci_inl(addr, card); + data |= value; + + pci_outl(data, addr, card); +} + + +void outl_clearbits(ULONG value, ULONG addr, struct SB128_DATA *card) +{ + ULONG data = pci_inl(addr, card); + data &= ~value; + + pci_outl(data, addr, card); +} + + +ULONG inl_config(UBYTE reg, APTR dev) +{ + struct pHidd_PCIDevice_ReadConfigLong msg; + + msg.mID = mid_RL; + msg.reg = reg; + + return OOP_DoMethod((OOP_Object *)dev, (OOP_Msg)&msg); +} + +UWORD inw_config(UBYTE reg, APTR dev) +{ + struct pHidd_PCIDevice_ReadConfigWord msg; + + msg.mID = mid_RW; + msg.reg = reg; + + return OOP_DoMethod((OOP_Object *)dev, (OOP_Msg)&msg); +} + +UBYTE inb_config(UBYTE reg, APTR dev) +{ + struct pHidd_PCIDevice_ReadConfigByte msg; + + msg.mID = mid_RB; + msg.reg = reg; + + return OOP_DoMethod(dev, (OOP_Msg)&msg); +} + +void outl_config(UBYTE reg, ULONG val, APTR dev) +{ + struct pHidd_PCIDevice_WriteConfigLong msg; + + msg.mID = mid_WL; + msg.reg = reg; + msg.val = val; + + OOP_DoMethod((OOP_Object *)dev, (OOP_Msg)&msg); +} + +void outw_config(UBYTE reg, UWORD val, APTR dev) +{ + struct pHidd_PCIDevice_WriteConfigWord msg; + + msg.mID = mid_WW; + msg.reg = reg; + msg.val = val; + + OOP_DoMethod((OOP_Object *)dev, (OOP_Msg)&msg); +} + +void outb_config(UBYTE reg, UBYTE val, APTR dev) +{ + struct pHidd_PCIDevice_WriteConfigByte msg; + + msg.mID = mid_WB; + msg.reg = reg; + msg.val = val; + + OOP_DoMethod((OOP_Object *)dev, (OOP_Msg)&msg); +} + +ULONG ahi_pci_get_irq(APTR dev) +{ + IPTR val; + + OOP_GetAttr((OOP_Object *)dev, aHidd_PCIDevice_INTLine, &val); + + return (ULONG)val; +} + +static void interrupt_code(HIDDT_IRQ_Handler *irq, HIDDT_IRQ_HwInfo *hw) +{ + struct Interrupt *i = (struct Interrupt *)irq->h_Data; + + AROS_UFC3(void, i->is_Code, + AROS_UFCA(APTR, i->is_Data, A1), + AROS_UFCA(APTR, i->is_Code, A5), + AROS_UFCA(struct ExecBase *, SysBase, A6)); +} + + +BOOL ahi_pci_add_intserver(struct Interrupt *i, APTR dev) +{ + struct pHidd_IRQ_AddHandler __msg__, *msg = &__msg__; + IPTR val; + + OOP_GetAttr((OOP_Object *)dev, aHidd_PCIDevice_INTLine, &val); + + inthandler.h_Node.ln_Pri = 1; + inthandler.h_Node.ln_Name = "HD Audio IRQ"; + inthandler.h_Code = interrupt_code; + inthandler.h_Data = i; + + msg->mID = OOP_GetMethodID(CLID_Hidd_IRQ, moHidd_IRQ_AddHandler); + msg->handlerinfo = &inthandler; + msg->id = val; + + OOP_DoMethod(irqobj, (OOP_Msg)msg); + + inthandler_added = TRUE; + + return TRUE; +} + +void ahi_pci_rem_intserver(struct Interrupt *i, APTR dev) +{ + if (inthandler_added) + { + struct pHidd_IRQ_RemHandler __msg__ = + { + mID: OOP_GetMethodID(CLID_Hidd_IRQ, moHidd_IRQ_RemHandler), + handlerinfo: &inthandler, + }, *msg = &__msg__; + + OOP_DoMethod(irqobj, (OOP_Msg)msg); + + inthandler_added = FALSE; + } + + KPrintF("ahi_pci_rem_intserver\n"); +} + + +APTR ahi_pci_get_base_address(WORD which, APTR dev) +{ + OOP_AttrID attr = 0; + IPTR val = 0; + + switch(which) + { + case 0: + attr = aHidd_PCIDevice_Base0; + break; + + case 1: + attr = aHidd_PCIDevice_Base1; + break; + + case 2: + attr = aHidd_PCIDevice_Base2; + break; + + case 3: + attr = aHidd_PCIDevice_Base3; + break; + + case 4: + attr = aHidd_PCIDevice_Base4; + break; + + case 5: + attr = aHidd_PCIDevice_Base5; + break; + + default: + return 0; + } + + OOP_GetAttr((OOP_Object *)dev, attr, &val); + + //KPrintF("ahi_pci_get_base_address. Result %lx\n", val); + + return (APTR)val; +} + +ULONG ahi_pci_get_base_size(WORD which, APTR dev) +{ + OOP_AttrID attr = 0; + IPTR val = 0; + + switch(which) + { + case 0: + attr = aHidd_PCIDevice_Size0; + break; + + case 1: + attr = aHidd_PCIDevice_Size1; + break; + + case 2: + attr = aHidd_PCIDevice_Size2; + break; + + case 3: + attr = aHidd_PCIDevice_Size3; + break; + + case 4: + attr = aHidd_PCIDevice_Size4; + break; + + case 5: + attr = aHidd_PCIDevice_Size5; + break; + + default: + return 0; + } + + OOP_GetAttr((OOP_Object *)dev, attr, &val); + + //KPrintF("ahi_pci_get_base_size. Result %lx\n", val); + + return (ULONG)val; + +} + + + +ULONG ahi_pci_get_type(WORD which, APTR dev) +{ + OOP_AttrID attr = 0; + IPTR val = 0; + + switch(which) + { + case 0: + attr = aHidd_PCIDevice_Type0; + break; + + case 1: + attr = aHidd_PCIDevice_Type1; + break; + + case 2: + attr = aHidd_PCIDevice_Type2; + break; + + case 3: + attr = aHidd_PCIDevice_Type3; + break; + + case 4: + attr = aHidd_PCIDevice_Type4; + break; + + case 5: + attr = aHidd_PCIDevice_Type5; + break; + + default: + return 0; + } + + OOP_GetAttr((OOP_Object *)dev, attr, &val); + + //KPrintF("ahi_pci_get_type. Result %lx\n", val); + + return (ULONG) val; +} diff --git a/workbench/devs/AHI/Drivers/SB128/pci_wrapper.c b/workbench/devs/AHI/Drivers/SB128/pci_wrapper.c new file mode 100644 index 0000000000..9a7b275224 --- /dev/null +++ b/workbench/devs/AHI/Drivers/SB128/pci_wrapper.c @@ -0,0 +1,10 @@ +#include + +#if defined(__AROS__) +#include "pci_aros.c" +#elif defined(__AMIGAOS4__) +#include "pci_aos4.c" +#else +#include "pci_openpci.c" +#endif + diff --git a/workbench/devs/AHI/Drivers/SB128/pci_wrapper.h b/workbench/devs/AHI/Drivers/SB128/pci_wrapper.h new file mode 100644 index 0000000000..e92f10e707 --- /dev/null +++ b/workbench/devs/AHI/Drivers/SB128/pci_wrapper.h @@ -0,0 +1,117 @@ +#ifndef PCI_WRAPPER_H +#define PCI_WRAPPER_H + +#ifndef EXEC_TYPES_H +# include +#endif + +#include "DriverData.h" + +#undef PCI_COMMAND +#undef PCI_COMMAND_IO +#undef PCI_COMMAND_MEMORY +#undef PCI_COMMAND_MASTER +#undef PCI_BASE_ADDRESS_IO_MASK +#undef PCI_REVISION_ID +#undef PCI_SUBSYSTEM_ID +#undef PCI_DEVICE_ID +#undef PCI_SUBSYSTEM_VENDOR_ID + + +#define PCI_COMMAND 4 +#define PCI_COMMAND_IO 1 +#define PCI_COMMAND_MEMORY 2 +#define PCI_COMMAND_MASTER 4 + +#define PCI_BASE_ADDRESS_0 0x10 + +#define PCI_BASE_ADDRESS_IO_MASK (~0x3UL) + +#define PCI_REVISION_ID 8 +#define PCI_SUBSYSTEM_ID 0x2e +#define PCI_DEVICE_ID 2 +#define PCI_SUBSYSTEM_VENDOR_ID 0x2c + +BOOL ahi_pci_init(struct DriverBase* AHIsubBase); +void ahi_pci_exit(void); + +APTR ahi_pci_find_device(ULONG vendorid, ULONG deviceid, APTR dev); + +ULONG pci_inl(ULONG addr, struct SB128_DATA *card); +UWORD pci_inw(ULONG addr, struct SB128_DATA *card); +UBYTE pci_inb(ULONG addr, struct SB128_DATA *card); + +void pci_outl(ULONG value, ULONG addr, struct SB128_DATA *card); +void pci_outw(UWORD value, ULONG addr, struct SB128_DATA *card); +void pci_outb(UBYTE value, ULONG addr, struct SB128_DATA *card); + +void outb_setbits(UBYTE value, ULONG addr, struct SB128_DATA *card); +void outw_setbits(UWORD value, ULONG addr, struct SB128_DATA *card); +void outl_setbits(ULONG value, ULONG addr, struct SB128_DATA *card); +void outb_clearbits(UBYTE value, ULONG addr, struct SB128_DATA *card); +void outw_clearbits(UWORD value, ULONG addr, struct SB128_DATA *card); +void outl_clearbits(ULONG value, ULONG addr, struct SB128_DATA *card); + +ULONG inl_config(UBYTE reg, APTR dev); +UWORD inw_config(UBYTE reg, APTR dev); +UBYTE inb_config(UBYTE reg, APTR dev); + +void outl_config(UBYTE reg, ULONG val, APTR dev); +void outw_config(UBYTE reg, UWORD val, APTR dev); +void outb_config(UBYTE reg, UBYTE val, APTR dev); + +ULONG ahi_pci_get_irq(APTR dev); + +BOOL ahi_pci_add_intserver(struct Interrupt *i, APTR dev); +void ahi_pci_rem_intserver(struct Interrupt *i, APTR dev); + +APTR ahi_pci_logic_to_physic_addr(APTR addr, APTR dev); + +APTR ahi_pci_get_base_address(WORD which, APTR dev); +ULONG ahi_pci_get_base_size(WORD which, APTR dev); +ULONG ahi_pci_get_type(WORD which, APTR dev); +ULONG ahi_pci_mem_map(APTR addr, APTR dev); + +#ifdef __AMIGAOS4__ +#define ALLOCVEC AllocVec +#define FREEVEC FreeVec +#define DEBUGPRINTF IExec->DebugPrintF +#define CAUSE Cause +#define CALLHOOK CallHookPkt +#define INITSEMAPHORE InitSemaphore +#define OBTAINSEMAPHORE ObtainSemaphore +#define RELEASESEMAPHORE ReleaseSemaphore +#define CREATEPORT(a, b) CreatePort(a, b) +#define CREATEIOREQUEST CreateIORequest +#define OPENDEVICE OpenDevice +#define DOIO DoIO +#define DELETEIOREQUEST DeleteIORequest +#define CLOSEDEVICE IExec->CloseDevice +#define DELETEPORT IExec->DeletePort +#define GETTAGDATA IUtility->GetTagData +#define IRQTYPE INTERRUPT_NODE_TYPE +#define DELAY IDOS->Delay +#define bug DebugPrintF +#else +#include +#define ALLOCVEC AllocVec +#define FREEVEC FreeVec +#define DEBUGPRINTF kprintf +#define CAUSE Cause +#define CALLHOOK CallHookA +#define INITSEMAPHORE InitSemaphore +#define OBTAINSEMAPHORE ObtainSemaphore +#define RELEASESEMAPHORE ReleaseSemaphore +#define CREATEPORT(a, b) CreateMsgPort() +#define CREATEIOREQUEST CreateIORequest +#define OPENDEVICE OpenDevice +#define DOIO DoIO +#define DELETEIOREQUEST DeleteIORequest +#define CLOSEDEVICE CloseDevice +#define DELETEPORT DeleteMsgPort +#define GETTAGDATA GetTagData +#define IRQTYPE INTERRUPT_NODE_TYPE +#define DELAY Delay +#endif + +#endif diff --git a/workbench/devs/AHI/Drivers/SB128/sb128.c b/workbench/devs/AHI/Drivers/SB128/sb128.c index 03e3ba49e3..8a379f7ca4 100755 --- a/workbench/devs/AHI/Drivers/SB128/sb128.c +++ b/workbench/devs/AHI/Drivers/SB128/sb128.c @@ -15,13 +15,15 @@ All Rights Reserved. */ -#include +//#include +#if !defined(__AROS__) #undef __USE_INLINE__ #include extern struct UtilityIFace* IUtility; extern struct AHIsubIFace* IAHIsub; extern struct MMUIFace* IMMU; +#endif #include #include @@ -32,15 +34,21 @@ extern struct MMUIFace* IMMU; #include #include +#ifdef __AROS__ +#define DEBUG 1 +#include +#define DebugPrintF bug +#endif #include -#include "library_card.h" +#include "library.h" #include "regs.h" #include "misc.h" -#include "DriverData.h" +#include "pci_wrapper.h" +//#include "DriverData.h" -extern void rate_set_dac2(struct CardData *card, unsigned long rate); -extern void rate_set_adc(struct CardData *card, unsigned long rate); +extern void rate_set_dac2(struct SB128_DATA *card, unsigned long rate); +extern void rate_set_adc(struct SB128_DATA *card, unsigned long rate); /****************************************************************************** ** Globals ******************************************************************** @@ -104,37 +112,37 @@ _AHIsub_AllocAudio( struct TagItem* taglist, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; int card_num; ULONG ret; int i, freq = 9; - card_num = ( IUtility->GetTagData( AHIDB_AudioID, 0, taglist) & 0x0000f000 ) >> 12; + card_num = ( GetTagData( AHIDB_AudioID, 0, taglist) & 0x0000f000 ) >> 12; - if( card_num >= CardBase->cards_found || - CardBase->driverdatas[ card_num ] == NULL ) + if( card_num >= SB128Base->cards_found || + SB128Base->driverdatas[ card_num ] == NULL ) { - IExec->DebugPrintF("no data for card = %ld\n", card_num); - Req( "No CardData for card %ld.", card_num ); + DebugPrintF("no data for card = %ld\n", card_num); + Req( "No Card Data for card %ld.", card_num ); return AHISF_ERROR; } else { - struct CardData* card; + struct SB128_DATA* card; BOOL in_use; struct PCIDevice *dev; - card = CardBase->driverdatas[ card_num ]; + card = SB128Base->driverdatas[ card_num ]; AudioCtrl->ahiac_DriverData = card; - IExec->ObtainSemaphore( &CardBase->semaphore ); + ObtainSemaphore( &SB128Base->semaphore ); in_use = ( card->audioctrl != NULL ); if( !in_use ) { card->audioctrl = AudioCtrl; } - IExec->ReleaseSemaphore( &CardBase->semaphore ); + ReleaseSemaphore( &SB128Base->semaphore ); if( in_use ) { @@ -145,7 +153,7 @@ _AHIsub_AllocAudio( struct TagItem* taglist, card->playback_interrupt_enabled = FALSE; card->record_interrupt_enabled = FALSE; /* Clears playback/record interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON)) & SB128_IRQ_MASK); + pci_outl((pci_inl(SB128_SCON, card)) & SB128_IRQ_MASK, SB128_SCON, card); for( i = 1; i < FREQUENCIES; i++ ) { @@ -191,18 +199,18 @@ void _AHIsub_FreeAudio( struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card = (struct CardData*) AudioCtrl->ahiac_DriverData; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card = (struct SB128_DATA*) AudioCtrl->ahiac_DriverData; if( card != NULL ) { - IExec->ObtainSemaphore( &CardBase->semaphore ); + ObtainSemaphore( &SB128Base->semaphore ); if( card->audioctrl == AudioCtrl ) { /* Release it if we own it. */ card->audioctrl = NULL; } - IExec->ReleaseSemaphore( &CardBase->semaphore ); + ReleaseSemaphore( &SB128Base->semaphore ); AudioCtrl->ahiac_DriverData = NULL; } @@ -217,11 +225,11 @@ void _AHIsub_Disable( struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; /* V6 drivers do not have to preserve all registers */ - IExec->Disable(); + Disable(); } @@ -233,11 +241,11 @@ void _AHIsub_Enable( struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; /* V6 drivers do not have to preserve all registers */ - IExec->Enable(); + Enable(); } @@ -250,8 +258,8 @@ _AHIsub_Start( ULONG flags, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card = (struct CardData*) AudioCtrl->ahiac_DriverData; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card = (struct SB128_DATA*) AudioCtrl->ahiac_DriverData; struct PCIDevice *dev = card->pci_dev; unsigned long PlayCtrlFlags = 0, RecCtrlFlags = 0; ULONG dma_buffer_size = 0; @@ -280,13 +288,13 @@ _AHIsub_Start( ULONG flags, /* Update cached/syncronized variables */ - IAHIsub->AHIsub_Update( AHISF_PLAY, AudioCtrl ); + AHIsub_Update( AHISF_PLAY, AudioCtrl ); /* Allocate a new mixing buffer. Note: The buffer must be cleared, since it might not be filled by the mixer software interrupt because of pretimer/posttimer! */ - card->mix_buffer = IExec->AllocVec( AudioCtrl->ahiac_BuffSize, + card->mix_buffer = AllocVec( AudioCtrl->ahiac_BuffSize, MEMF_PUBLIC | MEMF_CLEAR ); if( card->mix_buffer == NULL ) @@ -311,7 +319,7 @@ _AHIsub_Start( ULONG flags, dma_buffer_size = AudioCtrl->ahiac_MaxBuffSamples * dma_sample_frame_size; } - card->playback_buffer = pci_alloc_consistent(dma_buffer_size * 2, &card->playback_buffer_nonaligned); + card->playback_buffer = pci_alloc_consistent(dma_buffer_size * 2, &card->playback_buffer_nonaligned, 128); if (!card->playback_buffer) { @@ -320,7 +328,7 @@ _AHIsub_Start( ULONG flags, } /* Enable Playback interrupt */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | SB128_DAC2_INTEN)); + pci_outl((pci_inl(SB128_SCON, card) | SB128_DAC2_INTEN), SB128_SCON, card); card->current_bytesize = dma_buffer_size; card->current_frames = AudioCtrl->ahiac_MaxBuffSamples; @@ -330,15 +338,16 @@ _AHIsub_Start( ULONG flags, card->flip = 0; /* Select the DAC2 Memory Page */ - dev->OutLong(card->iobase + SB128_MEMPAGE, SB128_PAGE_DAC); + pci_outl(SB128_PAGE_DAC, SB128_MEMPAGE, card); /* Buffer address and length (in longwords) is set */ - stack = IExec->SuperState(); - card->playback_buffer_phys = IMMU->GetPhysicalAddress(card->playback_buffer); - IExec->UserState(stack); + stack = SuperState(); +// card->playback_buffer_phys = IMMU->GetPhysicalAddress(card->playback_buffer); + card->playback_buffer_phys = card->playback_buffer; + UserState(stack); - dev->OutLong(card->iobase + SB128_DAC2_FRAME, (unsigned long)(card->playback_buffer_phys)); - dev->OutLong(card->iobase + SB128_DAC2_COUNT, (((dma_buffer_size * 2) >> 2) - 1) & 0xFFFF); + pci_outl((unsigned long)(card->playback_buffer_phys), SB128_DAC2_FRAME, card); + pci_outl((((dma_buffer_size * 2) >> 2) - 1) & 0xFFFF, SB128_DAC2_COUNT, card); /* Playback format is always 16 Bit, Stereo, but checks exist in case of a Mono mode (not possible). */ PlayCtrlFlags = (SB128_16BIT | ChannelsFlag) << 2; @@ -359,7 +368,7 @@ _AHIsub_Start( ULONG flags, card->current_record_bytesize = RECORD_BUFFER_SAMPLES * 4; /* Allocate a new recording buffer (page aligned!) */ - card->record_buffer = pci_alloc_consistent(card->current_record_bytesize * 2, &card->record_buffer_nonaligned); + card->record_buffer = pci_alloc_consistent(card->current_record_bytesize * 2, &card->record_buffer_nonaligned, 128); if( card->record_buffer == NULL ) { @@ -371,22 +380,23 @@ _AHIsub_Start( ULONG flags, UpdateMonitorMixer( card ); /* Enable record interrupt */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | SB128_ADC_INTEN)); + pci_outl((pci_inl(SB128_SCON, card) | SB128_ADC_INTEN), SB128_SCON, card); card->record_interrupt_enabled = TRUE; card->recflip = 0; /* Select the ADC Memory Page */ - dev->OutLong(card->iobase + SB128_MEMPAGE, SB128_PAGE_ADC); + pci_outl(SB128_PAGE_ADC, SB128_MEMPAGE, card); /* Buffer address and length (in longwords) is set */ - stack = IExec->SuperState(); - card->record_buffer_phys = IMMU->GetPhysicalAddress(card->record_buffer); - IExec->UserState(stack); + stack = SuperState(); +// card->record_buffer_phys = IMMU->GetPhysicalAddress(card->record_buffer); + card->record_buffer_phys = card->record_buffer; + UserState(stack); - dev->OutLong(card->iobase + SB128_ADC_FRAME, (unsigned long) card->record_buffer_phys); - dev->OutLong(card->iobase + SB128_ADC_COUNT, (((card->current_record_bytesize * 2) >> 2) - 1) & 0xFFFF); + pci_outl((unsigned long) card->record_buffer_phys, SB128_ADC_FRAME, card); + pci_outl((((card->current_record_bytesize * 2) >> 2) - 1) & 0xFFFF, SB128_ADC_COUNT, card); card->is_recording = TRUE; card->current_record_buffer = card->record_buffer + card->current_record_bytesize; @@ -406,23 +416,27 @@ _AHIsub_Start( ULONG flags, { /* Set Sample Count per Interrupt */ if (PlayCtrlFlags & 0x04) - dev->OutLong(card->iobase + SB128_DAC2_SCOUNT, ((dma_buffer_size >> 2) - 1) & 0xFFFF); + { + pci_outl(((dma_buffer_size >> 2) - 1) & 0xFFFF, SB128_DAC2_SCOUNT, card); + } else - dev->OutLong(card->iobase + SB128_DAC2_SCOUNT, ((dma_buffer_size >> 1) - 1) & 0xFFFF); + { + pci_outl(((dma_buffer_size >> 1) - 1) & 0xFFFF, SB128_DAC2_SCOUNT, card); + } /* Set format, ENDINC set to 2 */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | PlayCtrlFlags | 2 << 19)); + pci_outl((pci_inl(SB128_SCON, card) | PlayCtrlFlags | 2 << 19), SB128_SCON, card); /* Start playback! */ - dev->OutLong(card->iobase + SB128_CONTROL, (dev->InLong(card->iobase + SB128_CONTROL) | CTRL_DAC2_EN)); + pci_outl((pci_inl(SB128_CONTROL, card) | CTRL_DAC2_EN), SB128_CONTROL, card); } if( flags & AHISF_RECORD ) { /* Set Sample Count per Interrupt */ - dev->OutLong(card->iobase + SB128_ADC_SCOUNT, ((card->current_record_bytesize >> 2) - 1) & 0xFFFF); + pci_outl(((card->current_record_bytesize >> 2) - 1) & 0xFFFF, SB128_ADC_SCOUNT, card); /* Set format */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON) | RecCtrlFlags)); + pci_outl((pci_inl(SB128_SCON, card) | RecCtrlFlags), SB128_SCON, card); /* Start recording! */ - dev->OutLong(card->iobase + SB128_CONTROL, (dev->InLong(card->iobase + SB128_CONTROL) | CTRL_ADC_EN)); + pci_outl((pci_inl(SB128_CONTROL, card) | CTRL_ADC_EN), SB128_CONTROL, card); } return AHIE_OK; @@ -438,8 +452,8 @@ _AHIsub_Update( ULONG flags, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card = (struct CardData*) AudioCtrl->ahiac_DriverData; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card = (struct SB128_DATA*) AudioCtrl->ahiac_DriverData; card->current_frames = AudioCtrl->ahiac_BuffSamples; @@ -463,8 +477,8 @@ _AHIsub_Stop( ULONG flags, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card = (struct CardData*) AudioCtrl->ahiac_DriverData; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card = (struct SB128_DATA*) AudioCtrl->ahiac_DriverData; struct PCIDevice *dev = card->pci_dev; @@ -473,13 +487,13 @@ _AHIsub_Stop( ULONG flags, unsigned long play_ctl; card->is_playing= FALSE; - play_ctl = dev->InLong(card->iobase + SB128_CONTROL); + play_ctl = pci_inl(SB128_CONTROL, card); play_ctl &= ~(CTRL_DAC2_EN); /* Stop */ - dev->OutLong(card->iobase + SB128_CONTROL, play_ctl); + pci_outl(play_ctl, SB128_CONTROL, card); /* Clear and mask interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON)) & SB128_IRQ_MASK); + pci_outl((pci_inl(SB128_SCON, card)) & SB128_IRQ_MASK, SB128_SCON, card); if (card->current_bytesize > 0) pci_free_consistent(card->playback_buffer_nonaligned); @@ -489,7 +503,7 @@ _AHIsub_Stop( ULONG flags, card->current_buffer = NULL; if ( card->mix_buffer) - IExec->FreeVec( card->mix_buffer ); + FreeVec( card->mix_buffer ); card->mix_buffer = NULL; card->playback_interrupt_enabled = FALSE; card->current_bytesize = 0; @@ -499,13 +513,13 @@ _AHIsub_Stop( ULONG flags, { unsigned long rec_ctl, val; - rec_ctl = dev->InLong(card->iobase + SB128_CONTROL); + rec_ctl = pci_inl(SB128_CONTROL, card); rec_ctl &= ~(CTRL_ADC_EN); /* Stop */ - dev->OutLong(card->iobase + SB128_CONTROL, rec_ctl); + pci_outl(rec_ctl, SB128_CONTROL, card); /* Clear and mask interrupts */ - dev->OutLong(card->iobase + SB128_SCON, (dev->InLong(card->iobase + SB128_SCON)) & SB128_IRQ_MASK); + pci_outl((pci_inl(SB128_SCON, card)) & SB128_IRQ_MASK, SB128_SCON, card); if( card->is_recording ) { @@ -541,7 +555,7 @@ _AHIsub_GetAttr( ULONG attribute, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; int i; @@ -595,7 +609,7 @@ _AHIsub_GetAttr( ULONG attribute, case AHIDB_Annotation: return (LONG) - "OS4 PPC native driver"; + "AROS SB128/ES137x Audio driver"; case AHIDB_Record: return TRUE; @@ -663,8 +677,8 @@ _AHIsub_HardwareControl( ULONG attribute, struct AHIAudioCtrlDrv* AudioCtrl, struct DriverBase* AHIsubBase ) { - struct CardBase* CardBase = (struct CardBase*) AHIsubBase; - struct CardData* card = (struct CardData*) AudioCtrl->ahiac_DriverData; + struct SB128Base* SB128Base = (struct SB128Base*) AHIsubBase; + struct SB128_DATA* card = (struct SB128_DATA*) AudioCtrl->ahiac_DriverData; switch( attribute ) { diff --git a/workbench/devs/AHI/Drivers/SB128/version.date b/workbench/devs/AHI/Drivers/SB128/version.date index 8abfd61d6f..22a8ec2b0a 100755 --- a/workbench/devs/AHI/Drivers/SB128/version.date +++ b/workbench/devs/AHI/Drivers/SB128/version.date @@ -1 +1 @@ -18.08.11 +28.08.11 diff --git a/workbench/devs/AHI/Drivers/SB128/version.h b/workbench/devs/AHI/Drivers/SB128/version.h index c41ce604d4..7592891d03 100755 --- a/workbench/devs/AHI/Drivers/SB128/version.h +++ b/workbench/devs/AHI/Drivers/SB128/version.h @@ -1,3 +1,3 @@ #define VERSION 5 -#define REVISION 24 -#define VERS "5.24 (18.08.11)" +#define REVISION 25 +#define VERS "5.25 (28.08.11)" diff --git a/workbench/devs/AHI/Drivers/SB128/version.rev b/workbench/devs/AHI/Drivers/SB128/version.rev index a45fd52cc5..7273c0fa8c 100755 --- a/workbench/devs/AHI/Drivers/SB128/version.rev +++ b/workbench/devs/AHI/Drivers/SB128/version.rev @@ -1 +1 @@ -24 +25 -- 2.11.4.GIT