kerneltest/e32test/device/t_firco2.cpp
author Tom Cosgrove <tom.cosgrove@nokia.com>
Fri, 28 May 2010 16:29:07 +0100
changeset 30 8aab599e3476
parent 0 a41df078684a
permissions -rw-r--r--
Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h) Have multiple extension sections in the bld.inf, one for each version of the compiler. The RVCT version building the tools will build the runtime libraries for its version, but make sure we extract all the other versions from zip archives. Also add the archive for RVCT4.

// Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of the License "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:
// e32test\device\t_firco2.cpp
// 
//

#include "t_fir2.h"

#if defined(__VC32__) && _MSC_VER==1100
// Disable MSVC++ 5.0 aggressive warnings about non-expansion of inline functions. 
#pragma warning(disable : 4710)	// function '...' not expanded
#endif

#ifdef __WINS__
	#include <es_sock.h>
	RSocketServ ss;
#endif

TBuf8<2060> WriteBuf;
TBuf8<2060> ReadBuf;
TInt iTimeDelay=1000000;
TInt iBufSz=2000;
TBool iRWToWrite=EFalse;
TInt iDataStart=-1;
TInt iReadFramesCount=0;
TInt iFrameError=0;
void ResetReadBuffer()
	{
	TInt i=0;
	ReadBuf.SetLength(2060);
	for(i=0;i<2050;i++)
		ReadBuf[i] ='R';
	}

TBool CompareBuffers(TInt aLen)
	{
	TInt i=0;
	while(i<aLen)
		{
		if(ReadBuf[i]!=WriteBuf[i])
			return EFalse;
		i++;
		}
	return ETrue;
	}

void SetUpBuffers()
	{
	TInt i=0;
	WriteBuf.SetLength(2060);
	ReadBuf.SetLength(2060);
	for(i=0;i<2050;i++)
		{
		WriteBuf[i]=i+iDataStart;
		ReadBuf[i] ='R';
		}
	WriteBuf.SetLength(2000);
	}

CActiveConsole::CActiveConsole(CConsoleBase* aConsole) 
	: CActive(EPriorityNormal)
	{
	iConsole=aConsole;
	iInit1  =EFalse;
	iInit2  =EFalse;
	iInit3  =EFalse;
	}

CActiveConsole* CActiveConsole::NewLC(CConsoleBase* aConsole)
	{
	CActiveConsole* self = new (ELeave) CActiveConsole(aConsole);
	self->ConstructL();
	return self;
	}

void CActiveConsole::ConstructL ()
	{ 
	TFirCaps aCapsBuf;
	TFirCapsV01& aCaps=aCapsBuf();
	TFirConfig aConfigBuf;
	TFirConfigV01& aConfig=aConfigBuf();

	iConsole->Printf(_L("\r\n"));
	CActiveScheduler::Add(this);			// Add to active scheduler

	// Load Driver
	TInt ret=User::LoadPhysicalDevice(_L("Difir"));
	if (ret!=KErrNone)
		iConsole->Printf(_L("Error %d on loading Fir PDD\r\n"),ret);
	else
		iConsole->Printf(_L("Successfully loaded Fir PDD\r\n"));

	ret=User::LoadLogicalDevice(_L("Efir"));
	if (ret!=KErrNone)
		iConsole->Printf(_L("Error %d on loading Fir LDD\r\n"),ret);
	else
		iConsole->Printf(_L("Successfully loaded Fir LDD\r\n"));

	SetUpBuffers();

	ret=iPort.Open(0);
	if (ret!=KErrNone)
		iConsole->Printf(_L("Error %d on opening Fastir port\r\n"),ret);
	else
		iConsole->Printf(_L("Successfully opened Fastir port\r\n"));


	ret=iPort.Caps(aCapsBuf);
	if (ret!=KErrNone)
		iConsole->Printf(_L("Error %d on getting caps\r\n"),ret);
	else
		{
		if(aCaps.iRate & KCapsFirBps576000)
			iConsole->Printf(_L("576000 Bps supported\r\n"));
		if(aCaps.iRate & KCapsFirBps1152000)
			iConsole->Printf(_L("1152000 Bps supported\r\n"));
		if(aCaps.iRate & KCapsFirBps4000000)
			iConsole->Printf(_L("4000000 Bps supported\r\n"));
		}

	/*ret=iPort.Config(aConfigBuf);
	if (ret!=KErrNone)
		iConsole->Printf(_L("Error %d getting config\r\n"),ret);
	else
		{
		if(aConfig.iRate==EBps4000000)
			iConsole->Printf(_L("Fir config is 4Mbps\r\n"));
		}*/

	iRW=CActiveRW::NewL(iConsole,&iPort);
	if(iRW)
		iConsole->Printf(_L("Have created writer\r\n"));
	else
		iConsole->Printf(_L("Failed to create writer\r\n"));
	}

CActiveConsole::~CActiveConsole()
	{
	// Make sure we're cancelled
	Cancel();

	if(iRW)
		delete iRW;

	iPort.Close();
	}

void  CActiveConsole::DoCancel()
	{
	iConsole->ReadCancel();
	}

void  CActiveConsole::RunL()
	{
	ProcessKeyPressL(TChar(iConsole->KeyCode()));
//	iConsole->Printf(_L("CActiveConsole - Completed with code %d\r\n\r\n"), iStatus.Int ());
	}

void CActiveConsole::RequestCharacter()
	{
	if(!iInit1)
		{
		Options1();
		return;
		}
	if(!iInit2)
		{
		Options2();
		return;
		}
	if(!iInit3)
		{
		Options3();
		return;
		}
	  // A request is issued to the CConsoleBase to accept a
	  // character from the keyboard.
	iConsole->Printf(_L("*********************************\r\n"));
	iConsole->Printf(_L("press Escape to quit\r\n"));
	iConsole->Printf(_L("press '1'/'2' to start as reader/writer\r\n"));
	iConsole->Printf(_L("press '3' stop \r\n"));
	iConsole->Printf(_L("press '8' to show FIR regs\r\n"));
	iConsole->Printf(_L("press '9' to show Dma reader regs\r\n"));
	iConsole->Printf(_L("press '0' to show Dma writer regs\r\n"));
	iConsole->Printf(_L("press 'a' to show TxBuf info\r\n"));
	iConsole->Printf(_L("press 'b' to show RxBuf info\r\n"));
	iConsole->Printf(_L("press 'c' to show Chunk info\r\n"));
	iConsole->Printf(_L("press 'd' to show misc info\r\n"));
	iConsole->Read(iStatus); 
	SetActive();
	}

void CActiveConsole::Options1()
	{
	iConsole->Printf(_L("*****Choose Delay*****\r\n"));
	iConsole->Printf(_L("press '1'  576000 baud\r\n"));
	iConsole->Printf(_L("press '2' 1152000 baud\r\n"));
	iConsole->Printf(_L("press '3' 4000000 baud\r\n"));
	iConsole->Read(iStatus); 
	SetActive();	
	}

void CActiveConsole::Options2()
	{
	iConsole->Printf(_L("*****Choose Delay*****\r\n"));
	iConsole->Printf(_L("press '1' 1.00 sec delay\r\n"));
	iConsole->Printf(_L("press '2'  100  ms delay\r\n"));
	iConsole->Printf(_L("press '3'   10  ms delay\r\n"));
	iConsole->Printf(_L("press '4'    1  ms delay\r\n"));
	iConsole->Printf(_L("press '5' 0.00 sec delay\r\n"));
	iConsole->Read(iStatus); 
	SetActive();	
	}

void CActiveConsole::Options3()
	{
	iConsole->Printf(_L("****Choose Buf Sz*****\r\n"));
	iConsole->Printf(_L("press '1' 1    byte \r\n"));
	iConsole->Printf(_L("press '2' 4    bytes\r\n"));
	iConsole->Printf(_L("press '3' 2000 bytes\r\n"));
	iConsole->Printf(_L("press '4' 2042 bytes\r\n"));
	iConsole->Read(iStatus); 
	SetActive();	
	}

void CActiveConsole::ProcessKeyPressL(TChar aChar)
	{
	if (aChar == EKeyEscape)
		{
		CActiveScheduler::Stop();
		return;
		}

	if(!iInit1)
		{
		switch(aChar)
			{
		case '1':
			iBaudRate=EBps576000;
			break;
		case '2':
			iBaudRate=EBps1152000;
			break;
		case '3':
			iBaudRate=EBps4000000;
			break;
		default:
			iBaudRate=EBps4000000;
			break;
			}
		iConsole->Printf(_L("Baud rate: %d\r\n"),iBaudRate);
		iInit1=ETrue;
		TFirConfig aConfigBuf;
		TFirConfigV01& aConfig=aConfigBuf();
		aConfig.iRate=iBaudRate;
		TInt ret=iPort.SetConfig(aConfigBuf);
		iConsole->Printf(_L("Error %d on SetConfig\r\n"),ret);
		RequestCharacter();
		return;
		}

	if(!iInit2)
		{
		switch(aChar)
			{
		case '1'://1 sec
			iTimeDelay=1000000;
			break;
		case '2'://100ms
			iTimeDelay=100000;
			break;
		case '3'://10ms
			iTimeDelay=10000;
			break;
		case '4'://1ms
			iTimeDelay=1000;
			break;
		case '5'://0 sec
			iTimeDelay=0;
			break;
		default:
			iTimeDelay=1000000;
			break;
			}
		iConsole->Printf(_L("Time Delay: %d\r\n"),iTimeDelay);
		iInit2=ETrue;
		RequestCharacter();
		return;
		}
	if(!iInit3)
		{
		switch(aChar)
			{
		case '1':
			iBufSz=1;
			break;
		case '2':
			iBufSz=4;
			break;
		case '3':
			iBufSz=2000;
			break;
		case '4':
			iBufSz=2042;
			break;
		default:
			iBufSz=2000;
			break;
			}
		iConsole->Printf(_L("Buffer size: %d\r\n"),iBufSz);
		iInit3=ETrue;
		RequestCharacter();
		return;
		}

	switch (aChar)
		{
	case '1'://start reader
		iRW->Start(EFalse);
		break;
	case '2'://stop reader
		iRW->Start(ETrue);
		break;
	case '3'://start writer
		iRW->Stop();
		break;
	case '8'://get fir regs
		GetFirRegs();
		break;
	case '9'://get dma reader regs
		GetDmaReaderRegs();
		break;
	case '0'://get dma writer regs
		GetDmaWriterRegs();
		break;
	case 'a'://get TxBuf info
		GetWriteBufInfo();
		break;
	case 'b'://get RxBuf info
		GetReadBufInfo();
		break;
	case 'c'://get RxBuf info
		GetChunkInfo();
		break;
	case 'd':
		GetMiscInfo();
		break;
	default:
		iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
		break;
		}
	RequestCharacter ();
	return;
	}

void CActiveConsole::GetFirRegs()
	{
/*	TInt r=0;
	TDebugFirRegs FirRegs;
	r=iPort.GetFirRegs(FirRegs);
	iConsole->Printf(_L("RxFrameStatus  : 0x%x\r\n"),FirRegs.RxFrameStatus);
	iConsole->Printf(_L("RxBufferEmpty  : 0x%x\r\n"),FirRegs.RxBufferEmpty);
	iConsole->Printf(_L("RxError        : 0x%x\r\n"),FirRegs.RxError);
	iConsole->Printf(_L("RxOverrun      : 0x%x\r\n"),FirRegs.RxOverrun);
	iConsole->Printf(_L("CrcError       : 0x%x\r\n"),FirRegs.CrcError);
	iConsole->Printf(_L("TxFrameStatus  : 0x%x\r\n"),FirRegs.TxFrameStatus);
	iConsole->Printf(_L("TxBufferEmpty  : 0x%x\r\n"),FirRegs.TxBufferEmpty);
	iConsole->Printf(_L("TxBufferSz     : 0x%x\r\n"),FirRegs.TxBufferSz);
	iConsole->Printf(_L("TxOverrun      : 0x%x\r\n"),FirRegs.TxOverrun);*/
	}

void CActiveConsole::GetDmaReaderRegs()
	{
/*	TInt r=0;
	TDebugDmaChannelRegs DmaRxRegs;
	r=iPort.GetDmaRxRegs(DmaRxRegs);
	iConsole->Printf(_L("Rx Chan       : %d\n"),DmaRxRegs.DmaRxChannel);
	iConsole->Printf(_L("Tx Chan       : %d\n"),DmaRxRegs.DmaTxChannel);
	iConsole->Printf(_L("Rx DmaMode    : %d\n"),DmaRxRegs.DmaMode);
	iConsole->Printf(_L("Rx DmaState   : %d\n"),DmaRxRegs.DmaState);
	iConsole->Printf(_L("Rx DmaBuffer  : %x\n"),DmaRxRegs.DmaBuffer);
	User::After(1000000);
	iConsole->Printf(_L("Rx DmGauge    : %d\n"),DmaRxRegs.DmaGauge);
	iConsole->Printf(_L("Rx DmaSrcAddr : %x\n"),DmaRxRegs.DmaSrcAddr);
	iConsole->Printf(_L("Rx DmaSrcInc  : %d\n"),DmaRxRegs.DmaSrcInc);
	iConsole->Printf(_L("Rx DmaDestAddr: %x\n"),DmaRxRegs.DmaDestAddr);
	iConsole->Printf(_L("Rx DmaDestInc : %d\n"),DmaRxRegs.DmaDestInc);
	iConsole->Printf(_L("Rx DmaCount   : %d\n"),DmaRxRegs.DmaCount);
	iConsole->Printf(_L("Rx MatchClear : %x\n"),DmaRxRegs.MatchClear);
	iConsole->Printf(_L("Rx MatchSet   : %x\n"),DmaRxRegs.MatchSet);*/
	}

void CActiveConsole::GetDmaWriterRegs()
	{
/*	TInt r=0;
	TDebugDmaChannelRegs DmaTxRegs;
	r=iPort.GetDmaTxRegs(DmaTxRegs);
	iConsole->Printf(_L("Rx Chan       : %d\n"),DmaTxRegs.DmaRxChannel);
	iConsole->Printf(_L("Tx Chan       : %d\n"),DmaTxRegs.DmaTxChannel);
	iConsole->Printf(_L("Tx DmaMode    : %d\n"),DmaTxRegs.DmaMode);
	iConsole->Printf(_L("Tx DmaState   : %d\n"),DmaTxRegs.DmaState);
	iConsole->Printf(_L("Tx DmaBuffer  : %x\n"),DmaTxRegs.DmaBuffer);
	User::After(1000000);
	iConsole->Printf(_L("Tx DmGauge    : %d\n"),DmaTxRegs.DmaGauge);
	iConsole->Printf(_L("Tx DmaSrcAddr : %x\n"),DmaTxRegs.DmaSrcAddr);
	iConsole->Printf(_L("Tx DmaSrcInc  : %d\n"),DmaTxRegs.DmaSrcInc);
	iConsole->Printf(_L("Tx DmaDestAddr: %x\n"),DmaTxRegs.DmaDestAddr);
	iConsole->Printf(_L("Tx DmaDestInc : %d\n"),DmaTxRegs.DmaDestInc);
	iConsole->Printf(_L("Tx DmaCount   : %d\n"),DmaTxRegs.DmaCount);
	iConsole->Printf(_L("Tx MatchClear : %x\n"),DmaTxRegs.MatchClear);
	iConsole->Printf(_L("Tx MatchSet   : %x\n"),DmaTxRegs.MatchSet);*/
	}

void CActiveConsole::GetReadBufInfo()
	{
/*	TInt r=0;
	TDebugBufInfo RxBufInfo;
	r=iPort.GetRxBufInfo(RxBufInfo);
	iConsole->Printf(_L("Rx no frames: %d\r\n"),RxBufInfo.iNoFrames);
	iConsole->Printf(_L("Rx insert pt: %d\r\n"),RxBufInfo.iInsertPt);
	iConsole->Printf(_L("Rx remove pt: %d\r\n"),RxBufInfo.iRemovePt);
	iConsole->Printf(_L("Rx head     : %d\r\n"),RxBufInfo.iHead);
	iConsole->Printf(_L("Rx tail     : %d\r\n"),RxBufInfo.iTail);
	iConsole->Printf(_L("Rx active   : %x\r\n"),RxBufInfo.iActive);
	iConsole->Printf(_L("Rx cancelled: %x\r\n"),RxBufInfo.iCancelled);
	iConsole->Printf(_L("Client read pending: %d\r\n"),RxBufInfo.iClientPending);*/
	}

void CActiveConsole::GetWriteBufInfo()
	{
/*	TInt r=0;
	TDebugBufInfo TxBufInfo;
	r=iPort.GetTxBufInfo(TxBufInfo);
	iConsole->Printf(_L("Tx no frames: %d\r\n"),TxBufInfo.iNoFrames);
	iConsole->Printf(_L("Tx insert pt: %d\r\n"),TxBufInfo.iInsertPt);
	iConsole->Printf(_L("Tx remove pt: %d\r\n"),TxBufInfo.iRemovePt);
	iConsole->Printf(_L("Tx head     : %d\r\n"),TxBufInfo.iHead);
	iConsole->Printf(_L("Tx tail     : %d\r\n"),TxBufInfo.iTail);
	iConsole->Printf(_L("Tx active   : %x\r\n"),TxBufInfo.iActive);
	iConsole->Printf(_L("Tx cancelled: %x\r\n"),TxBufInfo.iCancelled);
	iConsole->Printf(_L("Client write pending: %d\r\n"),TxBufInfo.iClientPending);*/
	}

void CActiveConsole::GetChunkInfo()
	{
/*	TInt r=0;
	TDebugDmaChunkInfo DmaChunkInfo;
	r=iPort.GetDmaChunkInfo(DmaChunkInfo);
	iConsole->Printf(_L("Write Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.iWriteChunkPhysAddr);
	iConsole->Printf(_L("Write Chunk Lin  Addr: 0x%x\r\n"),DmaChunkInfo.iWriteChunkLinAddr);
	iConsole->Printf(_L("Read  Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.iReadChunkPhysAddr);
	iConsole->Printf(_L("Read  Chunk Lin  Addr: 0x%x\r\n"),DmaChunkInfo.iReadChunkLinAddr);
	//iConsole->Printf(_L("Write Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.);*/
	}

void CActiveConsole::GetMiscInfo()
	{
/*	TInt r=0;
	TDebugInterruptInfo IntInfo;
	r=iPort.GetInterruptsInfo(IntInfo);
	iConsole->Printf(_L("No writer dma interrupts: %d\r\n"),IntInfo.iNoTxDmaInts);	
	iConsole->Printf(_L("No reader dma interrupts: %d\r\n"),IntInfo.iNoRxDmaInts);
	//iConsole->Printf(_L("Total Hspp interrupts: %d\r\n"),IntInfo.iNoHsspInts);
	iConsole->Printf(_L("Total Framing errors : %d\r\n"),IntInfo.iNoFREs);
	iConsole->Printf(_L("No xtra chars        : %d\r\n"),IntInfo.iNoXtraChars);
	iConsole->Printf(_L("No unwanted chars    : %d\r\n"),IntInfo.iNoUnwantedChars);
	iConsole->Printf(_L("No Rx dma leftovers  : %d\r\n"),IntInfo.iNoRxDmaInts);*/
	}



//
// class CActiveRW
//

CActiveRW::CActiveRW(CConsoleBase* aConsole,RDevFir* aPort)
	: CActive (EPriorityNormal)
	{
	iConsole=aConsole;
	iPort=aPort;
	iLength=0;
	}

CActiveRW* CActiveRW::NewL(CConsoleBase* aConsole,RDevFir* aPort)
	{
	CActiveRW* self = new (ELeave) CActiveRW(aConsole,aPort);

	CleanupStack::PushL (self);
	self->ConstructL();
	CActiveScheduler::Add (self);
	CleanupStack::Pop ();
	return (self);
	}

void CActiveRW::ConstructL()
	{
	}

CActiveRW::~CActiveRW()
	{
	Cancel();
	}

void CActiveRW::RunL ()
	{
	TInt i=0;
	TInt wlength=0;
	TInt rlength=0;
	TInt iErrorRate=0;
	if (iStatus != KErrNone)
		iConsole->Printf(_L("Error %d\r\n"),iStatus.Int());

	//return;
		if(iTimeDelay)
			User::After(iTimeDelay);


	if(iNextXfer==EWriteXfer)
		{
//			;
		iReadFramesCount++;
		rlength=ReadBuf[0]+(ReadBuf[1]<<8);

		if(rlength != ReadBuf.Length() || iStatus != KErrNone)
			{
			iFrameError++;
			RDebug::Print(_L("********* SHORT READ %d %d*********\n\r"),rlength, ReadBuf.Length());
			}

		if(iReadFramesCount>0)
			iErrorRate=(iFrameError*2000+iReadFramesCount)/(2*iReadFramesCount);
		else
			iErrorRate=0;

		iConsole->Printf(_L("R:%-4d FR %d EC %d Err %3d.%1d%%\r\n"),
			ReadBuf.Length(),iReadFramesCount,iFrameError, iErrorRate/10,iErrorRate%10);

		iLength=(iLength+1)%10;
		wlength=iBufSz+iLength;
		WriteBuf.SetLength(wlength);
		WriteBuf[0]=wlength;
		WriteBuf[1]=wlength>>8;
		iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
		iNextXfer=EReadXfer;

		}
	else
		{ // EReadXfer
		iConsole->Printf(_L("W:%-4d "),WriteBuf.Length());
		ResetReadBuffer();
		iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
		iNextXfer=EWriteXfer;
		}
	SetActive();
	}

void CActiveRW::Start(TBool StartWriting)
	{
	if(IsActive())
		return;

	if(StartWriting)
		{
		if(iDataStart==-1)
			{
			iDataStart=0x80;
			SetUpBuffers();
			}
		iConsole->Printf(_L("Starting with write.....\r\n"));
		WriteBuf.SetLength(iBufSz);
			WriteBuf[0]=iBufSz;
			WriteBuf[1]=iBufSz>>8;
		iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
		iNextXfer=EReadXfer;
		}
	else
		{
		if(iDataStart==-1)
			{
			iDataStart=0x0;
			SetUpBuffers();
			}
		iConsole->Printf(_L("Starting with read.....\r\n"));
		iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
		iNextXfer=EWriteXfer;
		}
	SetActive();
	}

void CActiveRW::Stop()
	{
	iConsole->Printf(_L("Stopping.....\r\n"));
	Cancel();
	}

void CActiveRW::DoCancel()
	{
	iPort->WriteCancel();
	iPort->ReadCancel();
	}

#pragma warning (default:4710)