⛏️ index : haiku.git

// ****************************************************************************
//
//		OsSupportBeOS.H
//
//		Set editor tabs to 3 for your viewing pleasure.
//
// ----------------------------------------------------------------------------
//
// This file is part of Echo Digital Audio's generic driver library.
// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
// All rights reserved
// www.echoaudio.com
//
// This library is free software; you can redistribute it and/or
// modify it under the terms of the GNU Lesser General Public
// License as published by the Free Software Foundation; either
// version 2.1 of the License, or (at your option) any later version.
//
// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// Lesser General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
//
// ****************************************************************************

//	Prevent problems with multiple includes
#ifndef _ECHOOSSUPPORTBEOS_
#define _ECHOOSSUPPORTBEOS_

#include <KernelExport.h>
#include <SupportDefs.h>
#include <ByteOrder.h>
#include "queue.h"
#include "debug.h"

#include <stdio.h>
#include <string.h>
#include "util/kernel_cpp.h"

#if DEBUG > 0
// BeOS debug printf macro
#define ECHO_DEBUGPRINTF( strings ) TRACE(strings)
#define ECHO_DEBUGBREAK()                       kernel_debugger("echo driver debug break");
#define ECHO_DEBUG

#else

#define ECHO_DEBUGPRINTF( strings )
#define ECHO_DEBUGBREAK()

#endif

//
// Assert macro
//
//#define ECHO_ASSERT(exp)	ASSERT(exp)
#define ECHO_ASSERT(exp)

//
//	Specify OS specific types
//
typedef char 		*PCHAR ;
typedef uint8	 	BYTE;
typedef uint8 		*PBYTE;
typedef uint16	 	WORD;
typedef uint16	 	*PWORD;
typedef uint32	 	DWORD;
typedef unsigned long 	ULONG;
typedef unsigned long 	NUINT;
typedef long 		NINT;
typedef void 		*PVOID;
typedef DWORD 		*PDWORD;
#define VOID 		void
typedef bool 		BOOL;
typedef bool 		BOOLEAN;
typedef char 		*PTCHAR;
typedef char		TCHAR;
typedef char		CHAR;
typedef char*		LPSTR;
//typedef SInt32	INT;
typedef int32		INT32;
typedef int32	 	*PINT;
typedef int8		INT8;
typedef long		HANDLE;
typedef long		LONG;
typedef int64 		LONGLONG;
typedef uint64 		ULONGLONG ;
typedef uint64 		*PULONGLONG ;
typedef long 		*PKEVENT ;
#undef NULL
#define NULL 0
#define CALLBACK

#define CONST const
typedef	void **		PPVOID;

#ifndef PAGE_SIZE
#define PAGE_SIZE                B_PAGE_SIZE
#endif

#define WideToSInt64(x)         (*((int64*)(&x)))
#define WideToUInt64(x)         (*((uint64*)(&x)))

//
// Return Status Values
//
typedef unsigned long	ECHOSTATUS;


//
// Define our platform specific things here.
//
typedef struct _echo_mem {
	LIST_ENTRY(_echo_mem) next;
	void		*log_base;
	phys_addr_t	phy_base;
	area_id 	area;
	size_t		size;
} echo_mem;

//
//	Define generic byte swapping functions
//
#define SWAP(x)B_HOST_TO_LENDIAN_INT32(x)

//
//	Define what a physical address is on this OS
//
typedef	phys_addr_t		PHYS_ADDR;			// Define physical addr type
typedef	phys_addr_t*	PPHYS_ADDR;			// Define physical addr pointer type

typedef echo_mem* PPAGE_BLOCK;


//
//	Version information.
//	In NT, we want to get this from a resource
//
#define	APPVERSION			OsGetVersion()
#define	APPREVISION			OsGetRevision()
#define	APPRELEASE			OsGetRelease()

BYTE OsGetVersion();
BYTE OsGetRevision();
BYTE OsGetRelease();

//
//	Global Memory Management Functions
//

//
// This tag is used to mark all memory allocated by EchoGals.
//	Due to the way PoolMon displays things, we spell Echo backwards
//	so it displays correctly.
//
#define ECHO_POOL_TAG      'OHCE'


//
// OsAllocateInit - Set up memory tracking.  Call this once - not
// once per PCI card, just one time.
//
void OsAllocateInit();

//
// Allocate locked, non-pageable block of memory.  Does not have to be
//	physically contiguous.  Primarily used to implement the overloaded
//	new operator for classes that must remain memory resident.
//
ECHOSTATUS OsAllocateNonPaged
(
    DWORD	dwByteCt,
    PPVOID	ppMemAddr
);


//
// Unlock and free, non-pageable block of memory.
//
ECHOSTATUS OsFreeNonPaged
(
    PVOID	pMemAddr
);


//
// Copy memory
//
//!!! Anything faster we can use?
#define OsCopyMemory(pDest, pSrc, dwBytes) 	memcpy(pDest, pSrc, dwBytes)

//
// Set memory to zero
//
#define OsZeroMemory(pDest, dwBytes)			memset(pDest, 0, dwBytes)


//
// This class is uniquely defined for each OS.  It provides
//	information that other components may require.
// For example, in Windows NT it contains a device object used by various
//	memory management methods.
// Since static variables are used in place of globals, an instance must
//	be constructed and initialized by the OS Interface object prior to
//	constructing the CEchoGals derived object.  The CEchoGals and
//	CDspCommObject classes must have access to it during their respective
// construction times.
//
class COsSupport
{
public:
	//
	//	Construction/destruction
	//
	COsSupport
	(
		WORD				wDeviceId,		// PCI bus device id
		WORD				wCardRev			// Hardware revision number
	);

	~COsSupport();

	//
	//	Timer Methods
	//

	//
	// Return the system time in microseconds.
	// Return error status if the OS doesn't support this function.
	//
	ECHOSTATUS OsGetSystemTime
	(
		PULONGLONG	pullTime
	);


	//
	// Stall execution for dwTime microseconds.
	// Return error status if the OS doesn't support this function.
	//
	ECHOSTATUS OsSnooze
	(
		DWORD	dwTime						// Duration in micro seconds
	);


	//
	//	Memory Management Methods
	//

	//
	// Allocate a block of physical memory pages
	//
	ECHOSTATUS AllocPhysPageBlock
	(
		DWORD			dwBytes,
		PPAGE_BLOCK	&pPageBlock
	);

	//
	// Free a block of physical memory
	//
	ECHOSTATUS FreePhysPageBlock
	(
		DWORD			dwBytes,
		PPAGE_BLOCK	pPageBlock
	);

	//
	// Get the virtual address for a page block
	//
	PVOID GetPageBlockVirtAddress
	(
		PPAGE_BLOCK	pPageBlock
	);

	//
	// Get the physical address for a segment of a page block
	//
	ECHOSTATUS GetPageBlockPhysSegment
	(
		PPAGE_BLOCK	pPageBlock,			// pass in a previously allocated block
		DWORD			dwOffset,			// pass in the offset into the block
		PHYS_ADDR	&PhysAddr,			// returns the physical address
		DWORD			&dwSegmentSize		// and the length of the segment
	);


	//
	// Add additional methods here
	//

	//
	//	Display and/or log an error message w/title
	//
	void EchoErrorMsg
	(
		const char* pszMsg,
		const char* pszTitle
	);

	//
	//	Return PCI card device ID
	//
	WORD GetDeviceId()
		{ return( m_wDeviceId ); }

	//
	// Return the hardware revision number
	//
	WORD GetCardRev()
	{
		return m_wCardRev;
	}

	//
	// Get the current timestamp for MIDI input data
	//
	LONGLONG GetMidiInTimestamp()
	{
		return system_time();
	}

	//
	//	Overload new & delete so memory for this object is allocated
	//	from non-paged memory.
	//
	PVOID operator new( size_t Size );
	VOID	operator delete( PVOID pVoid );

protected:

private:
	WORD					m_wDeviceId;		// PCI Device ID
	WORD					m_wCardRev;			// Hardware revision

	//
	// Define data here.
	//
#ifdef ECHO_DEBUG
	DWORD					m_dwPageBlockCount;
#endif

};		// class COsSupport

typedef COsSupport * PCOsSupport;

#endif // _ECHOOSSUPPORTBEOS_