navienginebsp/ne1_tb/inc/soundsc_plat.h
changeset 0 5de814552237
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/navienginebsp/ne1_tb/inc/soundsc_plat.h	Tue Sep 28 18:00:05 2010 +0100
@@ -0,0 +1,167 @@
+/*
+* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).
+* All rights reserved.
+* This component and the accompanying materials are made available
+* under the terms of "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:  
+* ne1_tb\inc\soundsc_plat.h
+* Definitions for the NE1_TBVariant shared chunk sound physical device driver (PDD).
+*
+*/
+
+
+
+/**
+ @file
+ @internalTechnology
+ @prototype
+*/
+
+#ifndef __SOUNDSC_PLAT_H__
+#define __SOUNDSC_PLAT_H__
+
+#include <dma.h>
+#include <soundsc.h>
+#include <i2s.h>
+#include "cs42l51.h"
+
+// macro to print out thread context and CPU that thread is running on..
+#define __THREAD_AND_CPU 	Kern::Printf("(Thread %T, CPU: %d)\n", NKern::CurrentThread(), NKern::CurrentCpu())
+#define __KTRACE_SND(s) __KTRACE_OPT(KSOUND1, s)
+//#define __KTRACE_SND(s) s
+
+// Fill in the maximum number of requests that may be outstanding on the playback and record DMA channels for this device.
+const TInt KMaxDmaRequests=2;
+
+// Fill in the maximum transfer length supported  on the playback and record DMA channels for this device.
+const TInt KMaxDmaTransferLen=0x2000;
+
+// fifo threshold values for I2S transfers..
+const TInt KFifoThreshold = 8;
+
+// Forward declarations
+class DNE1_TBSoundScDmaRequest;
+
+// Define the I2S channel number used by this driver 
+const TUint KI2sChanNum = 0;
+/**
+Factory class instantiated from ordinal 0.
+The NE1_TBVariant physical device for the shared chunk sound driver used to create the DSoundScPdd-derived channel objects.
+*/
+class DSoundScPddNE1_TB : public DPhysicalDevice
+	{
+public:
+	DSoundScPddNE1_TB();
+	~DSoundScPddNE1_TB();
+	virtual TInt Install();
+	virtual void GetCaps(TDes8& aDes) const;
+	virtual TInt Create(DBase*& aChannel, TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
+	virtual TInt Validate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
+private:
+	// The DFC queue (used also by the LDD).
+	TDynamicDfcQue* iDfcQ;
+
+	// A pointer to the audio codec object
+	RCS42AudioCodec* iCodec;
+
+	friend class DNE1_TBSoundScPddChannel;
+	};
+
+/**
+The NE1_TBVariant physical device driver (PDD) for the playback shared chunk sound driver.
+*/
+class DNE1_TBSoundScPddChannel : public DSoundScPdd
+	{
+public:
+	explicit DNE1_TBSoundScPddChannel(TSoundDirection aSoundDirection);
+	~DNE1_TBSoundScPddChannel();
+	TInt DoCreate();
+
+	// Implementations of the pure virtual functions inherited from DSoundScPdd (called by LDD).
+	virtual TDfcQue* DfcQ(TInt aUnit);
+	virtual void GetChunkCreateInfo(TChunkCreateInfo& aChunkCreateInfo);
+	virtual void Caps(TDes8& aCapsBuf) const;
+	virtual TInt MaxTransferLen() const;
+	virtual TInt SetConfig(const TDesC8& aConfigBuf);
+	virtual TInt SetVolume(TInt aVolume);
+	virtual TInt StartTransfer();
+	virtual TInt TransferData(TUint aTransferID,TLinAddr aLinAddr,TPhysAddr aPhysAddr,TInt aNumBytes);
+	virtual void StopTransfer();
+	virtual TInt PauseTransfer();
+	virtual TInt ResumeTransfer();
+	virtual TInt PowerUp();
+	virtual void PowerDown();
+	virtual TInt CustomConfig(TInt aFunction,TAny* aParam);
+	void PlayCallback(TUint aTransferID,TInt aTransferResult,TInt aBytesTransferred);
+
+private:
+	void SetCaps();
+	static void PowerUpCallback (TAny *aArg);
+
+private:
+	// A pointer to the PDD factory.
+	DSoundScPddNE1_TB* iPhysicalDevice;
+	// The capabilities of this device.
+	TSoundFormatsSupportedV02 iCaps;
+	// The playback DMA channel.
+	TDmaChannel* iDmaChannel;
+	// The DMA request structures used for transfers.
+	DNE1_TBSoundScDmaRequest* iDmaRequest[KMaxDmaRequests];
+	// The number of outstanding DMA play requests on the DMA channel.
+	TInt iPendingPlay;
+	// A flag selecting the next DMA request for transfer.
+	TInt iFlag;
+	// current configuration
+	TCurrentSoundFormatV02 iCurrentConfig;
+
+	// I2S direction (I2s::ETx or I2s::ERx) of this unit
+	I2s::TI2sDirection iI2sDirection;
+
+	// Dfc, semaphore and status -used to power up the Codec in the context of the driver thread
+	TDfc iPowerUpDfc;
+	static NFastSemaphore iFastSem;
+	TInt iPowerUpStatus;
+	
+	friend class DSoundScPddNE1_TB;
+	friend class DNE1_TBSoundScDmaRequest;
+	};
+
+/**
+Wrapper function for a shared chunk sound driver DMA request.
+*/
+class DNE1_TBSoundScDmaRequest : public DDmaRequest
+	{
+public:
+	DNE1_TBSoundScDmaRequest(TDmaChannel& aChannel,DNE1_TBSoundScPddChannel* aPdd,TInt aMaxTransferSize=0);
+	~DNE1_TBSoundScDmaRequest();
+	TInt CreateMonoBuffer();
+	TInt SetDmaTransfer(TUint aTransferID, TLinAddr aLinAddr, TInt aNumBytes);
+	static void DmaService(TResult aResult, TAny* aArg);
+public:
+	// Pointer back to the PDD.
+	DNE1_TBSoundScPddChannel* iPdd;
+	// The transfer ID for this DMA request - supplied by the LDD.
+	TUint iTransferID;
+	// The transfer sizes in progress.
+	TUint iTransferSize;
+
+private:
+	// To facilitate mono support:
+	// Linear start address of the data supplied by the client..
+	TLinAddr iAddrLinOrig;
+
+	// buffers needed to store mono samples
+	TPhysAddr iBuffPhys;
+	TLinAddr iBufLin;
+	DPlatChunkHw* iChunk;
+	};
+
+#endif /* __SOUNDSC_PLAT_H__ */