os/kernelhwsrv/kerneltest/e32test/device/t_firco2.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 // Copyright (c) 1997-2009 Nokia Corporation and/or its subsidiary(-ies).
     2 // All rights reserved.
     3 // This component and the accompanying materials are made available
     4 // under the terms of the License "Eclipse Public License v1.0"
     5 // which accompanies this distribution, and is available
     6 // at the URL "http://www.eclipse.org/legal/epl-v10.html".
     7 //
     8 // Initial Contributors:
     9 // Nokia Corporation - initial contribution.
    10 //
    11 // Contributors:
    12 //
    13 // Description:
    14 // e32test\device\t_firco2.cpp
    15 // 
    16 //
    17 
    18 #include "t_fir2.h"
    19 
    20 #if defined(__VC32__) && _MSC_VER==1100
    21 // Disable MSVC++ 5.0 aggressive warnings about non-expansion of inline functions. 
    22 #pragma warning(disable : 4710)	// function '...' not expanded
    23 #endif
    24 
    25 #ifdef __WINS__
    26 	#include <es_sock.h>
    27 	RSocketServ ss;
    28 #endif
    29 
    30 TBuf8<2060> WriteBuf;
    31 TBuf8<2060> ReadBuf;
    32 TInt iTimeDelay=1000000;
    33 TInt iBufSz=2000;
    34 TBool iRWToWrite=EFalse;
    35 TInt iDataStart=-1;
    36 TInt iReadFramesCount=0;
    37 TInt iFrameError=0;
    38 void ResetReadBuffer()
    39 	{
    40 	TInt i=0;
    41 	ReadBuf.SetLength(2060);
    42 	for(i=0;i<2050;i++)
    43 		ReadBuf[i] ='R';
    44 	}
    45 
    46 TBool CompareBuffers(TInt aLen)
    47 	{
    48 	TInt i=0;
    49 	while(i<aLen)
    50 		{
    51 		if(ReadBuf[i]!=WriteBuf[i])
    52 			return EFalse;
    53 		i++;
    54 		}
    55 	return ETrue;
    56 	}
    57 
    58 void SetUpBuffers()
    59 	{
    60 	TInt i=0;
    61 	WriteBuf.SetLength(2060);
    62 	ReadBuf.SetLength(2060);
    63 	for(i=0;i<2050;i++)
    64 		{
    65 		WriteBuf[i]=i+iDataStart;
    66 		ReadBuf[i] ='R';
    67 		}
    68 	WriteBuf.SetLength(2000);
    69 	}
    70 
    71 CActiveConsole::CActiveConsole(CConsoleBase* aConsole) 
    72 	: CActive(EPriorityNormal)
    73 	{
    74 	iConsole=aConsole;
    75 	iInit1  =EFalse;
    76 	iInit2  =EFalse;
    77 	iInit3  =EFalse;
    78 	}
    79 
    80 CActiveConsole* CActiveConsole::NewLC(CConsoleBase* aConsole)
    81 	{
    82 	CActiveConsole* self = new (ELeave) CActiveConsole(aConsole);
    83 	self->ConstructL();
    84 	return self;
    85 	}
    86 
    87 void CActiveConsole::ConstructL ()
    88 	{ 
    89 	TFirCaps aCapsBuf;
    90 	TFirCapsV01& aCaps=aCapsBuf();
    91 	TFirConfig aConfigBuf;
    92 	TFirConfigV01& aConfig=aConfigBuf();
    93 
    94 	iConsole->Printf(_L("\r\n"));
    95 	CActiveScheduler::Add(this);			// Add to active scheduler
    96 
    97 	// Load Driver
    98 	TInt ret=User::LoadPhysicalDevice(_L("Difir"));
    99 	if (ret!=KErrNone)
   100 		iConsole->Printf(_L("Error %d on loading Fir PDD\r\n"),ret);
   101 	else
   102 		iConsole->Printf(_L("Successfully loaded Fir PDD\r\n"));
   103 
   104 	ret=User::LoadLogicalDevice(_L("Efir"));
   105 	if (ret!=KErrNone)
   106 		iConsole->Printf(_L("Error %d on loading Fir LDD\r\n"),ret);
   107 	else
   108 		iConsole->Printf(_L("Successfully loaded Fir LDD\r\n"));
   109 
   110 	SetUpBuffers();
   111 
   112 	ret=iPort.Open(0);
   113 	if (ret!=KErrNone)
   114 		iConsole->Printf(_L("Error %d on opening Fastir port\r\n"),ret);
   115 	else
   116 		iConsole->Printf(_L("Successfully opened Fastir port\r\n"));
   117 
   118 
   119 	ret=iPort.Caps(aCapsBuf);
   120 	if (ret!=KErrNone)
   121 		iConsole->Printf(_L("Error %d on getting caps\r\n"),ret);
   122 	else
   123 		{
   124 		if(aCaps.iRate & KCapsFirBps576000)
   125 			iConsole->Printf(_L("576000 Bps supported\r\n"));
   126 		if(aCaps.iRate & KCapsFirBps1152000)
   127 			iConsole->Printf(_L("1152000 Bps supported\r\n"));
   128 		if(aCaps.iRate & KCapsFirBps4000000)
   129 			iConsole->Printf(_L("4000000 Bps supported\r\n"));
   130 		}
   131 
   132 	/*ret=iPort.Config(aConfigBuf);
   133 	if (ret!=KErrNone)
   134 		iConsole->Printf(_L("Error %d getting config\r\n"),ret);
   135 	else
   136 		{
   137 		if(aConfig.iRate==EBps4000000)
   138 			iConsole->Printf(_L("Fir config is 4Mbps\r\n"));
   139 		}*/
   140 
   141 	iRW=CActiveRW::NewL(iConsole,&iPort);
   142 	if(iRW)
   143 		iConsole->Printf(_L("Have created writer\r\n"));
   144 	else
   145 		iConsole->Printf(_L("Failed to create writer\r\n"));
   146 	}
   147 
   148 CActiveConsole::~CActiveConsole()
   149 	{
   150 	// Make sure we're cancelled
   151 	Cancel();
   152 
   153 	if(iRW)
   154 		delete iRW;
   155 
   156 	iPort.Close();
   157 	}
   158 
   159 void  CActiveConsole::DoCancel()
   160 	{
   161 	iConsole->ReadCancel();
   162 	}
   163 
   164 void  CActiveConsole::RunL()
   165 	{
   166 	ProcessKeyPressL(TChar(iConsole->KeyCode()));
   167 //	iConsole->Printf(_L("CActiveConsole - Completed with code %d\r\n\r\n"), iStatus.Int ());
   168 	}
   169 
   170 void CActiveConsole::RequestCharacter()
   171 	{
   172 	if(!iInit1)
   173 		{
   174 		Options1();
   175 		return;
   176 		}
   177 	if(!iInit2)
   178 		{
   179 		Options2();
   180 		return;
   181 		}
   182 	if(!iInit3)
   183 		{
   184 		Options3();
   185 		return;
   186 		}
   187 	  // A request is issued to the CConsoleBase to accept a
   188 	  // character from the keyboard.
   189 	iConsole->Printf(_L("*********************************\r\n"));
   190 	iConsole->Printf(_L("press Escape to quit\r\n"));
   191 	iConsole->Printf(_L("press '1'/'2' to start as reader/writer\r\n"));
   192 	iConsole->Printf(_L("press '3' stop \r\n"));
   193 	iConsole->Printf(_L("press '8' to show FIR regs\r\n"));
   194 	iConsole->Printf(_L("press '9' to show Dma reader regs\r\n"));
   195 	iConsole->Printf(_L("press '0' to show Dma writer regs\r\n"));
   196 	iConsole->Printf(_L("press 'a' to show TxBuf info\r\n"));
   197 	iConsole->Printf(_L("press 'b' to show RxBuf info\r\n"));
   198 	iConsole->Printf(_L("press 'c' to show Chunk info\r\n"));
   199 	iConsole->Printf(_L("press 'd' to show misc info\r\n"));
   200 	iConsole->Read(iStatus); 
   201 	SetActive();
   202 	}
   203 
   204 void CActiveConsole::Options1()
   205 	{
   206 	iConsole->Printf(_L("*****Choose Delay*****\r\n"));
   207 	iConsole->Printf(_L("press '1'  576000 baud\r\n"));
   208 	iConsole->Printf(_L("press '2' 1152000 baud\r\n"));
   209 	iConsole->Printf(_L("press '3' 4000000 baud\r\n"));
   210 	iConsole->Read(iStatus); 
   211 	SetActive();	
   212 	}
   213 
   214 void CActiveConsole::Options2()
   215 	{
   216 	iConsole->Printf(_L("*****Choose Delay*****\r\n"));
   217 	iConsole->Printf(_L("press '1' 1.00 sec delay\r\n"));
   218 	iConsole->Printf(_L("press '2'  100  ms delay\r\n"));
   219 	iConsole->Printf(_L("press '3'   10  ms delay\r\n"));
   220 	iConsole->Printf(_L("press '4'    1  ms delay\r\n"));
   221 	iConsole->Printf(_L("press '5' 0.00 sec delay\r\n"));
   222 	iConsole->Read(iStatus); 
   223 	SetActive();	
   224 	}
   225 
   226 void CActiveConsole::Options3()
   227 	{
   228 	iConsole->Printf(_L("****Choose Buf Sz*****\r\n"));
   229 	iConsole->Printf(_L("press '1' 1    byte \r\n"));
   230 	iConsole->Printf(_L("press '2' 4    bytes\r\n"));
   231 	iConsole->Printf(_L("press '3' 2000 bytes\r\n"));
   232 	iConsole->Printf(_L("press '4' 2042 bytes\r\n"));
   233 	iConsole->Read(iStatus); 
   234 	SetActive();	
   235 	}
   236 
   237 void CActiveConsole::ProcessKeyPressL(TChar aChar)
   238 	{
   239 	if (aChar == EKeyEscape)
   240 		{
   241 		CActiveScheduler::Stop();
   242 		return;
   243 		}
   244 
   245 	if(!iInit1)
   246 		{
   247 		switch(aChar)
   248 			{
   249 		case '1':
   250 			iBaudRate=EBps576000;
   251 			break;
   252 		case '2':
   253 			iBaudRate=EBps1152000;
   254 			break;
   255 		case '3':
   256 			iBaudRate=EBps4000000;
   257 			break;
   258 		default:
   259 			iBaudRate=EBps4000000;
   260 			break;
   261 			}
   262 		iConsole->Printf(_L("Baud rate: %d\r\n"),iBaudRate);
   263 		iInit1=ETrue;
   264 		TFirConfig aConfigBuf;
   265 		TFirConfigV01& aConfig=aConfigBuf();
   266 		aConfig.iRate=iBaudRate;
   267 		TInt ret=iPort.SetConfig(aConfigBuf);
   268 		iConsole->Printf(_L("Error %d on SetConfig\r\n"),ret);
   269 		RequestCharacter();
   270 		return;
   271 		}
   272 
   273 	if(!iInit2)
   274 		{
   275 		switch(aChar)
   276 			{
   277 		case '1'://1 sec
   278 			iTimeDelay=1000000;
   279 			break;
   280 		case '2'://100ms
   281 			iTimeDelay=100000;
   282 			break;
   283 		case '3'://10ms
   284 			iTimeDelay=10000;
   285 			break;
   286 		case '4'://1ms
   287 			iTimeDelay=1000;
   288 			break;
   289 		case '5'://0 sec
   290 			iTimeDelay=0;
   291 			break;
   292 		default:
   293 			iTimeDelay=1000000;
   294 			break;
   295 			}
   296 		iConsole->Printf(_L("Time Delay: %d\r\n"),iTimeDelay);
   297 		iInit2=ETrue;
   298 		RequestCharacter();
   299 		return;
   300 		}
   301 	if(!iInit3)
   302 		{
   303 		switch(aChar)
   304 			{
   305 		case '1':
   306 			iBufSz=1;
   307 			break;
   308 		case '2':
   309 			iBufSz=4;
   310 			break;
   311 		case '3':
   312 			iBufSz=2000;
   313 			break;
   314 		case '4':
   315 			iBufSz=2042;
   316 			break;
   317 		default:
   318 			iBufSz=2000;
   319 			break;
   320 			}
   321 		iConsole->Printf(_L("Buffer size: %d\r\n"),iBufSz);
   322 		iInit3=ETrue;
   323 		RequestCharacter();
   324 		return;
   325 		}
   326 
   327 	switch (aChar)
   328 		{
   329 	case '1'://start reader
   330 		iRW->Start(EFalse);
   331 		break;
   332 	case '2'://stop reader
   333 		iRW->Start(ETrue);
   334 		break;
   335 	case '3'://start writer
   336 		iRW->Stop();
   337 		break;
   338 	case '8'://get fir regs
   339 		GetFirRegs();
   340 		break;
   341 	case '9'://get dma reader regs
   342 		GetDmaReaderRegs();
   343 		break;
   344 	case '0'://get dma writer regs
   345 		GetDmaWriterRegs();
   346 		break;
   347 	case 'a'://get TxBuf info
   348 		GetWriteBufInfo();
   349 		break;
   350 	case 'b'://get RxBuf info
   351 		GetReadBufInfo();
   352 		break;
   353 	case 'c'://get RxBuf info
   354 		GetChunkInfo();
   355 		break;
   356 	case 'd':
   357 		GetMiscInfo();
   358 		break;
   359 	default:
   360 		iConsole->Printf(_L("\r\nUnknown Command\r\n\r\n"));
   361 		break;
   362 		}
   363 	RequestCharacter ();
   364 	return;
   365 	}
   366 
   367 void CActiveConsole::GetFirRegs()
   368 	{
   369 /*	TInt r=0;
   370 	TDebugFirRegs FirRegs;
   371 	r=iPort.GetFirRegs(FirRegs);
   372 	iConsole->Printf(_L("RxFrameStatus  : 0x%x\r\n"),FirRegs.RxFrameStatus);
   373 	iConsole->Printf(_L("RxBufferEmpty  : 0x%x\r\n"),FirRegs.RxBufferEmpty);
   374 	iConsole->Printf(_L("RxError        : 0x%x\r\n"),FirRegs.RxError);
   375 	iConsole->Printf(_L("RxOverrun      : 0x%x\r\n"),FirRegs.RxOverrun);
   376 	iConsole->Printf(_L("CrcError       : 0x%x\r\n"),FirRegs.CrcError);
   377 	iConsole->Printf(_L("TxFrameStatus  : 0x%x\r\n"),FirRegs.TxFrameStatus);
   378 	iConsole->Printf(_L("TxBufferEmpty  : 0x%x\r\n"),FirRegs.TxBufferEmpty);
   379 	iConsole->Printf(_L("TxBufferSz     : 0x%x\r\n"),FirRegs.TxBufferSz);
   380 	iConsole->Printf(_L("TxOverrun      : 0x%x\r\n"),FirRegs.TxOverrun);*/
   381 	}
   382 
   383 void CActiveConsole::GetDmaReaderRegs()
   384 	{
   385 /*	TInt r=0;
   386 	TDebugDmaChannelRegs DmaRxRegs;
   387 	r=iPort.GetDmaRxRegs(DmaRxRegs);
   388 	iConsole->Printf(_L("Rx Chan       : %d\n"),DmaRxRegs.DmaRxChannel);
   389 	iConsole->Printf(_L("Tx Chan       : %d\n"),DmaRxRegs.DmaTxChannel);
   390 	iConsole->Printf(_L("Rx DmaMode    : %d\n"),DmaRxRegs.DmaMode);
   391 	iConsole->Printf(_L("Rx DmaState   : %d\n"),DmaRxRegs.DmaState);
   392 	iConsole->Printf(_L("Rx DmaBuffer  : %x\n"),DmaRxRegs.DmaBuffer);
   393 	User::After(1000000);
   394 	iConsole->Printf(_L("Rx DmGauge    : %d\n"),DmaRxRegs.DmaGauge);
   395 	iConsole->Printf(_L("Rx DmaSrcAddr : %x\n"),DmaRxRegs.DmaSrcAddr);
   396 	iConsole->Printf(_L("Rx DmaSrcInc  : %d\n"),DmaRxRegs.DmaSrcInc);
   397 	iConsole->Printf(_L("Rx DmaDestAddr: %x\n"),DmaRxRegs.DmaDestAddr);
   398 	iConsole->Printf(_L("Rx DmaDestInc : %d\n"),DmaRxRegs.DmaDestInc);
   399 	iConsole->Printf(_L("Rx DmaCount   : %d\n"),DmaRxRegs.DmaCount);
   400 	iConsole->Printf(_L("Rx MatchClear : %x\n"),DmaRxRegs.MatchClear);
   401 	iConsole->Printf(_L("Rx MatchSet   : %x\n"),DmaRxRegs.MatchSet);*/
   402 	}
   403 
   404 void CActiveConsole::GetDmaWriterRegs()
   405 	{
   406 /*	TInt r=0;
   407 	TDebugDmaChannelRegs DmaTxRegs;
   408 	r=iPort.GetDmaTxRegs(DmaTxRegs);
   409 	iConsole->Printf(_L("Rx Chan       : %d\n"),DmaTxRegs.DmaRxChannel);
   410 	iConsole->Printf(_L("Tx Chan       : %d\n"),DmaTxRegs.DmaTxChannel);
   411 	iConsole->Printf(_L("Tx DmaMode    : %d\n"),DmaTxRegs.DmaMode);
   412 	iConsole->Printf(_L("Tx DmaState   : %d\n"),DmaTxRegs.DmaState);
   413 	iConsole->Printf(_L("Tx DmaBuffer  : %x\n"),DmaTxRegs.DmaBuffer);
   414 	User::After(1000000);
   415 	iConsole->Printf(_L("Tx DmGauge    : %d\n"),DmaTxRegs.DmaGauge);
   416 	iConsole->Printf(_L("Tx DmaSrcAddr : %x\n"),DmaTxRegs.DmaSrcAddr);
   417 	iConsole->Printf(_L("Tx DmaSrcInc  : %d\n"),DmaTxRegs.DmaSrcInc);
   418 	iConsole->Printf(_L("Tx DmaDestAddr: %x\n"),DmaTxRegs.DmaDestAddr);
   419 	iConsole->Printf(_L("Tx DmaDestInc : %d\n"),DmaTxRegs.DmaDestInc);
   420 	iConsole->Printf(_L("Tx DmaCount   : %d\n"),DmaTxRegs.DmaCount);
   421 	iConsole->Printf(_L("Tx MatchClear : %x\n"),DmaTxRegs.MatchClear);
   422 	iConsole->Printf(_L("Tx MatchSet   : %x\n"),DmaTxRegs.MatchSet);*/
   423 	}
   424 
   425 void CActiveConsole::GetReadBufInfo()
   426 	{
   427 /*	TInt r=0;
   428 	TDebugBufInfo RxBufInfo;
   429 	r=iPort.GetRxBufInfo(RxBufInfo);
   430 	iConsole->Printf(_L("Rx no frames: %d\r\n"),RxBufInfo.iNoFrames);
   431 	iConsole->Printf(_L("Rx insert pt: %d\r\n"),RxBufInfo.iInsertPt);
   432 	iConsole->Printf(_L("Rx remove pt: %d\r\n"),RxBufInfo.iRemovePt);
   433 	iConsole->Printf(_L("Rx head     : %d\r\n"),RxBufInfo.iHead);
   434 	iConsole->Printf(_L("Rx tail     : %d\r\n"),RxBufInfo.iTail);
   435 	iConsole->Printf(_L("Rx active   : %x\r\n"),RxBufInfo.iActive);
   436 	iConsole->Printf(_L("Rx cancelled: %x\r\n"),RxBufInfo.iCancelled);
   437 	iConsole->Printf(_L("Client read pending: %d\r\n"),RxBufInfo.iClientPending);*/
   438 	}
   439 
   440 void CActiveConsole::GetWriteBufInfo()
   441 	{
   442 /*	TInt r=0;
   443 	TDebugBufInfo TxBufInfo;
   444 	r=iPort.GetTxBufInfo(TxBufInfo);
   445 	iConsole->Printf(_L("Tx no frames: %d\r\n"),TxBufInfo.iNoFrames);
   446 	iConsole->Printf(_L("Tx insert pt: %d\r\n"),TxBufInfo.iInsertPt);
   447 	iConsole->Printf(_L("Tx remove pt: %d\r\n"),TxBufInfo.iRemovePt);
   448 	iConsole->Printf(_L("Tx head     : %d\r\n"),TxBufInfo.iHead);
   449 	iConsole->Printf(_L("Tx tail     : %d\r\n"),TxBufInfo.iTail);
   450 	iConsole->Printf(_L("Tx active   : %x\r\n"),TxBufInfo.iActive);
   451 	iConsole->Printf(_L("Tx cancelled: %x\r\n"),TxBufInfo.iCancelled);
   452 	iConsole->Printf(_L("Client write pending: %d\r\n"),TxBufInfo.iClientPending);*/
   453 	}
   454 
   455 void CActiveConsole::GetChunkInfo()
   456 	{
   457 /*	TInt r=0;
   458 	TDebugDmaChunkInfo DmaChunkInfo;
   459 	r=iPort.GetDmaChunkInfo(DmaChunkInfo);
   460 	iConsole->Printf(_L("Write Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.iWriteChunkPhysAddr);
   461 	iConsole->Printf(_L("Write Chunk Lin  Addr: 0x%x\r\n"),DmaChunkInfo.iWriteChunkLinAddr);
   462 	iConsole->Printf(_L("Read  Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.iReadChunkPhysAddr);
   463 	iConsole->Printf(_L("Read  Chunk Lin  Addr: 0x%x\r\n"),DmaChunkInfo.iReadChunkLinAddr);
   464 	//iConsole->Printf(_L("Write Chunk Phys Addr: 0x%x\r\n"),DmaChunkInfo.);*/
   465 	}
   466 
   467 void CActiveConsole::GetMiscInfo()
   468 	{
   469 /*	TInt r=0;
   470 	TDebugInterruptInfo IntInfo;
   471 	r=iPort.GetInterruptsInfo(IntInfo);
   472 	iConsole->Printf(_L("No writer dma interrupts: %d\r\n"),IntInfo.iNoTxDmaInts);	
   473 	iConsole->Printf(_L("No reader dma interrupts: %d\r\n"),IntInfo.iNoRxDmaInts);
   474 	//iConsole->Printf(_L("Total Hspp interrupts: %d\r\n"),IntInfo.iNoHsspInts);
   475 	iConsole->Printf(_L("Total Framing errors : %d\r\n"),IntInfo.iNoFREs);
   476 	iConsole->Printf(_L("No xtra chars        : %d\r\n"),IntInfo.iNoXtraChars);
   477 	iConsole->Printf(_L("No unwanted chars    : %d\r\n"),IntInfo.iNoUnwantedChars);
   478 	iConsole->Printf(_L("No Rx dma leftovers  : %d\r\n"),IntInfo.iNoRxDmaInts);*/
   479 	}
   480 
   481 
   482 
   483 //
   484 // class CActiveRW
   485 //
   486 
   487 CActiveRW::CActiveRW(CConsoleBase* aConsole,RDevFir* aPort)
   488 	: CActive (EPriorityNormal)
   489 	{
   490 	iConsole=aConsole;
   491 	iPort=aPort;
   492 	iLength=0;
   493 	}
   494 
   495 CActiveRW* CActiveRW::NewL(CConsoleBase* aConsole,RDevFir* aPort)
   496 	{
   497 	CActiveRW* self = new (ELeave) CActiveRW(aConsole,aPort);
   498 
   499 	CleanupStack::PushL (self);
   500 	self->ConstructL();
   501 	CActiveScheduler::Add (self);
   502 	CleanupStack::Pop ();
   503 	return (self);
   504 	}
   505 
   506 void CActiveRW::ConstructL()
   507 	{
   508 	}
   509 
   510 CActiveRW::~CActiveRW()
   511 	{
   512 	Cancel();
   513 	}
   514 
   515 void CActiveRW::RunL ()
   516 	{
   517 	TInt i=0;
   518 	TInt wlength=0;
   519 	TInt rlength=0;
   520 	TInt iErrorRate=0;
   521 	if (iStatus != KErrNone)
   522 		iConsole->Printf(_L("Error %d\r\n"),iStatus.Int());
   523 
   524 	//return;
   525 		if(iTimeDelay)
   526 			User::After(iTimeDelay);
   527 
   528 
   529 	if(iNextXfer==EWriteXfer)
   530 		{
   531 //			;
   532 		iReadFramesCount++;
   533 		rlength=ReadBuf[0]+(ReadBuf[1]<<8);
   534 
   535 		if(rlength != ReadBuf.Length() || iStatus != KErrNone)
   536 			{
   537 			iFrameError++;
   538 			RDebug::Print(_L("********* SHORT READ %d %d*********\n\r"),rlength, ReadBuf.Length());
   539 			}
   540 
   541 		if(iReadFramesCount>0)
   542 			iErrorRate=(iFrameError*2000+iReadFramesCount)/(2*iReadFramesCount);
   543 		else
   544 			iErrorRate=0;
   545 
   546 		iConsole->Printf(_L("R:%-4d FR %d EC %d Err %3d.%1d%%\r\n"),
   547 			ReadBuf.Length(),iReadFramesCount,iFrameError, iErrorRate/10,iErrorRate%10);
   548 
   549 		iLength=(iLength+1)%10;
   550 		wlength=iBufSz+iLength;
   551 		WriteBuf.SetLength(wlength);
   552 		WriteBuf[0]=wlength;
   553 		WriteBuf[1]=wlength>>8;
   554 		iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
   555 		iNextXfer=EReadXfer;
   556 
   557 		}
   558 	else
   559 		{ // EReadXfer
   560 		iConsole->Printf(_L("W:%-4d "),WriteBuf.Length());
   561 		ResetReadBuffer();
   562 		iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
   563 		iNextXfer=EWriteXfer;
   564 		}
   565 	SetActive();
   566 	}
   567 
   568 void CActiveRW::Start(TBool StartWriting)
   569 	{
   570 	if(IsActive())
   571 		return;
   572 
   573 	if(StartWriting)
   574 		{
   575 		if(iDataStart==-1)
   576 			{
   577 			iDataStart=0x80;
   578 			SetUpBuffers();
   579 			}
   580 		iConsole->Printf(_L("Starting with write.....\r\n"));
   581 		WriteBuf.SetLength(iBufSz);
   582 			WriteBuf[0]=iBufSz;
   583 			WriteBuf[1]=iBufSz>>8;
   584 		iPort->Write(iStatus, WriteBuf, WriteBuf.Length());
   585 		iNextXfer=EReadXfer;
   586 		}
   587 	else
   588 		{
   589 		if(iDataStart==-1)
   590 			{
   591 			iDataStart=0x0;
   592 			SetUpBuffers();
   593 			}
   594 		iConsole->Printf(_L("Starting with read.....\r\n"));
   595 		iPort->Read(iStatus, ReadBuf, ReadBuf.Length());
   596 		iNextXfer=EWriteXfer;
   597 		}
   598 	SetActive();
   599 	}
   600 
   601 void CActiveRW::Stop()
   602 	{
   603 	iConsole->Printf(_L("Stopping.....\r\n"));
   604 	Cancel();
   605 	}
   606 
   607 void CActiveRW::DoCancel()
   608 	{
   609 	iPort->WriteCancel();
   610 	iPort->ReadCancel();
   611 	}
   612 
   613 #pragma warning (default:4710)