1// ****************************************************************************
2//
3//		OsSupportBeOS.H
4//
5//		Set editor tabs to 3 for your viewing pleasure.
6//
7// ----------------------------------------------------------------------------
8//
9// This file is part of Echo Digital Audio's generic driver library.
10// Copyright Echo Digital Audio Corporation (c) 1998 - 2005
11// All rights reserved
12// www.echoaudio.com
13//
14// This library is free software; you can redistribute it and/or
15// modify it under the terms of the GNU Lesser General Public
16// License as published by the Free Software Foundation; either
17// version 2.1 of the License, or (at your option) any later version.
18//
19// This library is distributed in the hope that it will be useful,
20// but WITHOUT ANY WARRANTY; without even the implied warranty of
21// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
22// Lesser General Public License for more details.
23//
24// You should have received a copy of the GNU Lesser General Public
25// License along with this library; if not, write to the Free Software
26// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
27//
28// ****************************************************************************
29
30//	Prevent problems with multiple includes
31#ifndef _ECHOOSSUPPORTBEOS_
32#define _ECHOOSSUPPORTBEOS_
33
34#include <KernelExport.h>
35#include <SupportDefs.h>
36#include <ByteOrder.h>
37#include "queue.h"
38#include "debug.h"
39
40#include <stdio.h>
41#include <string.h>
42#include "util/kernel_cpp.h"
43
44#if DEBUG > 0
45// BeOS debug printf macro
46#define ECHO_DEBUGPRINTF( strings ) TRACE(strings)
47#define ECHO_DEBUGBREAK()                       kernel_debugger("echo driver debug break");
48#define ECHO_DEBUG
49
50#else
51
52#define ECHO_DEBUGPRINTF( strings )
53#define ECHO_DEBUGBREAK()
54
55#endif
56
57//
58// Assert macro
59//
60//#define ECHO_ASSERT(exp)	ASSERT(exp)
61#define ECHO_ASSERT(exp)
62
63//
64//	Specify OS specific types
65//
66typedef char 		*PCHAR ;
67typedef uint8	 	BYTE;
68typedef uint8 		*PBYTE;
69typedef uint16	 	WORD;
70typedef uint16	 	*PWORD;
71typedef uint32	 	DWORD;
72typedef unsigned long 	ULONG;
73typedef unsigned long 	NUINT;
74typedef long 		NINT;
75typedef void 		*PVOID;
76typedef DWORD 		*PDWORD;
77#define VOID 		void
78typedef bool 		BOOL;
79typedef bool 		BOOLEAN;
80typedef char 		*PTCHAR;
81typedef char		TCHAR;
82typedef char		CHAR;
83typedef char*		LPSTR;
84//typedef SInt32	INT;
85typedef int32		INT32;
86typedef int32	 	*PINT;
87typedef int8		INT8;
88typedef long		HANDLE;
89typedef long		LONG;
90typedef int64 		LONGLONG;
91typedef uint64 		ULONGLONG ;
92typedef uint64 		*PULONGLONG ;
93typedef long 		*PKEVENT ;
94#undef NULL
95#define NULL 0
96#define CALLBACK
97
98#define CONST const
99typedef	void **		PPVOID;
100
101#ifndef PAGE_SIZE
102#define PAGE_SIZE                B_PAGE_SIZE
103#endif
104
105#define WideToSInt64(x)         (*((int64*)(&x)))
106#define WideToUInt64(x)         (*((uint64*)(&x)))
107
108//
109// Return Status Values
110//
111typedef unsigned long	ECHOSTATUS;
112
113
114//
115// Define our platform specific things here.
116//
117typedef struct _echo_mem {
118	LIST_ENTRY(_echo_mem) next;
119	void		*log_base;
120	phys_addr_t	phy_base;
121	area_id 	area;
122	size_t		size;
123} echo_mem;
124
125//
126//	Define generic byte swapping functions
127//
128#define SWAP(x)B_HOST_TO_LENDIAN_INT32(x)
129
130//
131//	Define what a physical address is on this OS
132//
133typedef	phys_addr_t		PHYS_ADDR;			// Define physical addr type
134typedef	phys_addr_t*	PPHYS_ADDR;			// Define physical addr pointer type
135
136typedef echo_mem* PPAGE_BLOCK;
137
138
139//
140//	Version information.
141//	In NT, we want to get this from a resource
142//
143#define	APPVERSION			OsGetVersion()
144#define	APPREVISION			OsGetRevision()
145#define	APPRELEASE			OsGetRelease()
146
147BYTE OsGetVersion();
148BYTE OsGetRevision();
149BYTE OsGetRelease();
150
151//
152//	Global Memory Management Functions
153//
154
155//
156// This tag is used to mark all memory allocated by EchoGals.
157//	Due to the way PoolMon displays things, we spell Echo backwards
158//	so it displays correctly.
159//
160#define ECHO_POOL_TAG      'OHCE'
161
162
163//
164// OsAllocateInit - Set up memory tracking.  Call this once - not
165// once per PCI card, just one time.
166//
167void OsAllocateInit();
168
169//
170// Allocate locked, non-pageable block of memory.  Does not have to be
171//	physically contiguous.  Primarily used to implement the overloaded
172//	new operator for classes that must remain memory resident.
173//
174ECHOSTATUS OsAllocateNonPaged
175(
176    DWORD	dwByteCt,
177    PPVOID	ppMemAddr
178);
179
180
181//
182// Unlock and free, non-pageable block of memory.
183//
184ECHOSTATUS OsFreeNonPaged
185(
186    PVOID	pMemAddr
187);
188
189
190//
191// Copy memory
192//
193//!!! Anything faster we can use?
194#define OsCopyMemory(pDest, pSrc, dwBytes) 	memcpy(pDest, pSrc, dwBytes)
195
196//
197// Set memory to zero
198//
199#define OsZeroMemory(pDest, dwBytes)			memset(pDest, 0, dwBytes)
200
201
202//
203// This class is uniquely defined for each OS.  It provides
204//	information that other components may require.
205// For example, in Windows NT it contains a device object used by various
206//	memory management methods.
207// Since static variables are used in place of globals, an instance must
208//	be constructed and initialized by the OS Interface object prior to
209//	constructing the CEchoGals derived object.  The CEchoGals and
210//	CDspCommObject classes must have access to it during their respective
211// construction times.
212//
213class COsSupport
214{
215public:
216	//
217	//	Construction/destruction
218	//
219	COsSupport
220	(
221		WORD				wDeviceId,		// PCI bus device id
222		WORD				wCardRev			// Hardware revision number
223	);
224
225	~COsSupport();
226
227	//
228	//	Timer Methods
229	//
230
231	//
232	// Return the system time in microseconds.
233	// Return error status if the OS doesn't support this function.
234	//
235	ECHOSTATUS OsGetSystemTime
236	(
237		PULONGLONG	pullTime
238	);
239
240
241	//
242	// Stall execution for dwTime microseconds.
243	// Return error status if the OS doesn't support this function.
244	//
245	ECHOSTATUS OsSnooze
246	(
247		DWORD	dwTime						// Duration in micro seconds
248	);
249
250
251	//
252	//	Memory Management Methods
253	//
254
255	//
256	// Allocate a block of physical memory pages
257	//
258	ECHOSTATUS AllocPhysPageBlock
259	(
260		DWORD			dwBytes,
261		PPAGE_BLOCK	&pPageBlock
262	);
263
264	//
265	// Free a block of physical memory
266	//
267	ECHOSTATUS FreePhysPageBlock
268	(
269		DWORD			dwBytes,
270		PPAGE_BLOCK	pPageBlock
271	);
272
273	//
274	// Get the virtual address for a page block
275	//
276	PVOID GetPageBlockVirtAddress
277	(
278		PPAGE_BLOCK	pPageBlock
279	);
280
281	//
282	// Get the physical address for a segment of a page block
283	//
284	ECHOSTATUS GetPageBlockPhysSegment
285	(
286		PPAGE_BLOCK	pPageBlock,			// pass in a previously allocated block
287		DWORD			dwOffset,			// pass in the offset into the block
288		PHYS_ADDR	&PhysAddr,			// returns the physical address
289		DWORD			&dwSegmentSize		// and the length of the segment
290	);
291
292
293	//
294	// Add additional methods here
295	//
296
297	//
298	//	Display and/or log an error message w/title
299	//
300	void EchoErrorMsg
301	(
302		const char* pszMsg,
303		const char* pszTitle
304	);
305
306	//
307	//	Return PCI card device ID
308	//
309	WORD GetDeviceId()
310		{ return( m_wDeviceId ); }
311
312	//
313	// Return the hardware revision number
314	//
315	WORD GetCardRev()
316	{
317		return m_wCardRev;
318	}
319
320	//
321	// Get the current timestamp for MIDI input data
322	//
323	LONGLONG GetMidiInTimestamp()
324	{
325		return system_time();
326	}
327
328	//
329	//	Overload new & delete so memory for this object is allocated
330	//	from non-paged memory.
331	//
332	PVOID operator new( size_t Size );
333	VOID	operator delete( PVOID pVoid );
334
335protected:
336
337private:
338	WORD					m_wDeviceId;		// PCI Device ID
339	WORD					m_wCardRev;			// Hardware revision
340
341	//
342	// Define data here.
343	//
344#ifdef ECHO_DEBUG
345	DWORD					m_dwPageBlockCount;
346#endif
347
348};		// class COsSupport
349
350typedef COsSupport * PCOsSupport;
351
352#endif // _ECHOOSSUPPORTBEOS_
353