diff -r 000000000000 -r c6b0df440bee dbgagents/trkagent/engine/TrkSerialCommPort.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbgagents/trkagent/engine/TrkSerialCommPort.cpp Tue Mar 02 10:33:16 2010 +0530 @@ -0,0 +1,444 @@ +/* +* Copyright (c) 2004 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: +* +*/ + + +#include +#include + +#include "TrkEngineModel.h" +#include "TrkSerialCommPort.h" +#include "TrkFramingLayer.h" + + +// +// Static helper functions +// +static void BuildPortName(const TDesC& aModuleName, TUint aUnit, TDes& aCompleteName) +{ + aCompleteName.Zero(); + aCompleteName.Append(aModuleName); + aCompleteName.AppendFill(':', 2); + aCompleteName.AppendNum(aUnit); +} + +static TUint RateCapacityBitMaskFromRate(TUint aRate) +{ + switch (aRate) + { + case 50: return KCapsBps50; + case 75: return KCapsBps75; + case 110: return KCapsBps110; + case 134: return KCapsBps134; + case 150: return KCapsBps150; + case 300: return KCapsBps300; + case 600: return KCapsBps600; + case 1200: return KCapsBps1200; + case 1800: return KCapsBps1800; + case 2000: return KCapsBps2000; + case 2400: return KCapsBps2400; + case 3600: return KCapsBps3600; + case 4800: return KCapsBps4800; + case 7200: return KCapsBps7200; + case 9600: return KCapsBps9600; + case 19200: return KCapsBps19200; + case 38400: return KCapsBps38400; + case 57600: return KCapsBps57600; + case 115200: return KCapsBps115200; + case 230400: return KCapsBps230400; + case 460800: return KCapsBps460800; + case 576000: return KCapsBps576000; + case 1152000: return KCapsBps1152000; + case 4000000: return KCapsBps4000000; + default: return 0; + } +} + +static TBps TBpsRateFromRate(TUint aRate) +{ + switch (aRate) + { + case 50: return EBps50; + case 75: return EBps75; + case 110: return EBps110; + case 134: return EBps134; + case 150: return EBps150; + case 300: return EBps300; + case 600: return EBps600; + case 1200: return EBps1200; + case 1800: return EBps1800; + case 2000: return EBps2000; + case 2400: return EBps2400; + case 3600: return EBps3600; + case 4800: return EBps4800; + case 7200: return EBps7200; + case 9600: return EBps9600; + case 19200: return EBps19200; + case 38400: return EBps38400; + case 57600: return EBps57600; + case 115200: return EBps115200; + case 230400: return EBps230400; + case 460800: return EBps460800; + case 576000: return EBps576000; + case 1152000: return EBps1152000; + case 4000000: return EBps4000000; + default: return EBpsAutobaud; + } +} + + +// +// +// CTrkSerialCommPort implementation +// +// + +// +// CTrkSerialCommPort constructor +// +CTrkSerialCommPort::CTrkSerialCommPort() + : CTrkCommPort(CActive::EPriorityStandard), + iPDD(NULL), + iPDD2(NULL), + iLDD(NULL), + iCSY(NULL), + iServerStarted(EFalse), + iConnected(EFalse), + iListening(EFalse), + iLineNumber(0) +{ +} + +// +// CTrkSerialCommPort::ConstructL +// +void CTrkSerialCommPort::ConstructL(TTrkConnData& aTrkConnData , TDes& aErrorMessage) +{ + iPDD = aTrkConnData.iPDD; + iLDD = aTrkConnData.iLDD; + iCSY = aTrkConnData.iCSY; + iUnitNumber = aTrkConnData.iPortNumber; + iRate = aTrkConnData.iRate; + + + TBuf initFile(KInitFilePath); + initFile.Append(KInitFileName); + + if (!iPDD.Size()) + { + aErrorMessage.Format(_L("PDD not specified in %S.\r\n"), &initFile); + User::Leave(KErrCorrupt); + } + + if (!iLDD.Size()) + { + aErrorMessage.Format(_L("LDD not specified in %S.\r\n"), &initFile); + User::Leave(KErrCorrupt); + } + + if (!iCSY.Size()) + { + aErrorMessage.Format(_L("CSY not specified in %S.\r\n"), &initFile); + User::Leave(KErrCorrupt); + } + + if (!iRate) + { + aErrorMessage.Format(_L("RATE not specified in %S.\r\n"), &initFile); + User::Leave(KErrCorrupt); + } + + iPDD2.Format(iPDD, iUnitNumber+1); + + iConnectionMessage.Format(_L("PDD: %S\r\nLDD: %S\r\nCSY: %S\r\nPort number: %d\r\nBaud rate: %d\r\n"), &iPDD2, &iLDD, &iCSY, iUnitNumber, iRate); + + if (aTrkConnData.iDefault) + { + iConnectionMessage.Insert(0, _L("No init file found, using default values.\r\n")); + } +} + +// +// CTrkSerialCommPort destructor +// +CTrkSerialCommPort::~CTrkSerialCommPort() +{ + // make sure we cancel the request for data before shutting down + Cancel(); + + iPort.Close(); + iConnected = EFalse; + iServer.Close(); + iServerStarted = EFalse; +} + +// +// CTrkSerialCommPort::NewL +// +CTrkSerialCommPort* CTrkSerialCommPort::NewL(TTrkConnData& aTrkConnData, TDes& aErrorMessage) +{ + CTrkSerialCommPort* self = new(ELeave) CTrkSerialCommPort; + CleanupStack::PushL(self); + self->ConstructL(aTrkConnData, aErrorMessage); + CleanupStack::Pop(self); + return self; +} + +// +// CTrkSerialCommPort::OpenPortL +// +// Open the serial type communications port +// +void CTrkSerialCommPort::OpenPortL() +{ + TInt error = KErrNone; + + if (!iServerStarted) + { + StartC32(); + ReportAndLeaveIfErrorL(iServer.Connect(), + _L("Failed to connect to RCommServ.")); + iServerStarted = ETrue; + } + + // load the csy module + ReportAndLeaveIfErrorL(iServer.LoadCommModule(iCSY), _L("Failed to load CSY module.")); + + TInt ports = 0; + ReportAndLeaveIfErrorL(iServer.NumPorts(ports), + _L("Unable to obtain information about port.")); + + // make sure the unit number is in range + TSerialInfo serialInfo; + + error = KErrNotFound; + + TBuf<32> csyModule; + csyModule = iCSY; + csyModule.LowerCase(); + for (TInt i=0; i module; + ReportAndLeaveIfErrorL(iServer.GetPortInfo(i, module, serialInfo), + _L("Unable to obtain information about port.")); + module.LowerCase(); + if (module == csyModule) + error = KErrNone; + } + + ReportAndLeaveIfErrorL(error, _L("Unable to obtain port information for comm module.")); + + //If pdd is "NONE", don't try to load it. + //This is true incase of USB, where the USB pdd is a kernel extension on most of the phones + //and so can't be loaded. + TBuf<10> defaultUsbPdd; + defaultUsbPdd.Copy(KDefaultUsbPDD); + if (iPDD2.Compare(defaultUsbPdd)) + { + error = User::LoadPhysicalDevice(iPDD2); + if (error != KErrNone && error != KErrAlreadyExists) + ReportAndLeaveIfErrorL(error, _L("Failed to load physical device.")); + } + + error = User::LoadLogicalDevice(iLDD); + if (error != KErrNone && error != KErrAlreadyExists) + ReportAndLeaveIfErrorL(error, _L("Failed to load logical device.")); + + // Open port (try first in DTE mode and then if unsuccessful in + // DCE mode - necessary for cogent). + + TBuf portName; + BuildPortName(serialInfo.iName, iUnitNumber, portName); + error = iPort.Open(iServer, portName, ECommExclusive, ECommRoleDTE); + if (error != KErrNone) + { + ReportAndLeaveIfErrorL(iPort.Open(iServer, portName, ECommExclusive, ECommRoleDCE), + _L("Failed to open port.")); + } + iConnected = ETrue; + + // Check Speed + TCommCaps caps; + iPort.Caps(caps); + + TUint rateBitMask = RateCapacityBitMaskFromRate(iRate); + if (rateBitMask == 0 || (rateBitMask & caps().iRate) == 0) + ReportAndLeaveIfErrorL(KErrGeneral, _L("Unsupported baud rate.")); + + // Configure physical and logical characteristics + TCommConfig config; + iPort.Config(config); + config().iRate = TBpsRateFromRate(iRate); + config().iParity = EParityNone; + config().iDataBits = EData8; + config().iStopBits = EStop1; + config().iFifo = EFifoEnable; + + config().iHandshake = 0; // no flow control at all + + ReportAndLeaveIfErrorL(iPort.SetConfig(config), _L("Failed to set port configuration.")); + + iPort.SetReceiveBufferLength(MAXMESSAGESIZE); + + //reset the rx and tx buffers just in case + //if there is any stale data lying around from the previous debug sessions + iPort.ResetBuffers(); +} + +// +// CTrkSerialCommPort::ClosePort +// +// Close the communications port +// +void CTrkSerialCommPort::ClosePort() +{ + Cancel(); + + if (iConnected) + { + iPort.Close(); + iConnected = EFalse; + } + + if (iServerStarted) + { + iServer.Close(); + iServerStarted = EFalse; + } +} + +// +// CTrkSerialCommPort::SendDataL +// +// Write data to the serial type port +// +void CTrkSerialCommPort::SendDataL(const TDesC8& aBuffer) +{ + //_LIT8(KPrefix, "TrkToCarbide: "); + //PrintMessage(KPrefix(), aBuffer); + + TRequestStatus status; + iPort.Write(status, aBuffer); + User::WaitForRequest(status); + + User::LeaveIfError(status.Int()); +} + +// +// CTrkSerialCommPort::Listen +// +// Start listening for data coming into the serial type communications port +// +void CTrkSerialCommPort::Listen(CTrkFramingLayer *aFramingLayer) +{ + iFramingLayer = aFramingLayer; + CActiveScheduler::Add(this); + IssueReadRequest(); + iListening = ETrue; +} + +// +// CTrkSerialCommPort::StopListening +// +// Stop listening for data coming into the serial type communications port +// +void CTrkSerialCommPort::StopListening() +{ + if (iListening) + { + Cancel(); + Deque(); + } + + iListening = EFalse; +} + +// +// CTrkSerialCommPort::ReportAndLeaveIfErrorL +// +// If an error occurred, print the error information to the screen and bail out +// +void CTrkSerialCommPort::ReportAndLeaveIfErrorL(TInt aError, const TDesC& aDesc) +{ + if (KErrNone != aError) + { + iErrorMessage.Format(_L("%S\r\nError Code: %d\r\n"), &aDesc, aError); + User::Leave(aError); + } +} + +// +// CTrkSerialCommPort::IssueReadRequest +// +// Wait for data to come into the communications port +// +void CTrkSerialCommPort::IssueReadRequest() +{ + iNextReadChar = 0; + iReceivedChars.Zero(); + iPort.ReadOneOrMore(iStatus, iReceivedChars); + + SetActive(); +} + +// +// CTrkSerialCommPort::DoCancel +// +// Cancel the request for data from the communications port +// +void CTrkSerialCommPort::DoCancel() +{ + iPort.ReadCancel(); +} + +// +// CTrkSerialCommPort::RunL +// +// Called when data comes into the communications port +// +void CTrkSerialCommPort::RunL() +{ + //_LIT8(KPrefix, "CarbideToTrk: "); + //PrintMessage(KPrefix(), iReceivedChars); + + // pass the data onto the framing layer + if (iStatus.Int() == KErrNone) + while (iNextReadChar < iReceivedChars.Length()) + iFramingLayer->HandleByte(iReceivedChars[iNextReadChar++]); + + // continue waiting for data + IssueReadRequest(); +} + +void CTrkSerialCommPort::PrintMessage(const TDesC8& aPrefix, const TDesC8& aBinaryData) const + { + TInt msgLength = aBinaryData.Length(); + //RDebug::Printf("%S - start", &aPrefix); + for(TInt i=0; i tempBuf; + tempBuf.SetLength(0); + for(TInt j=i; (j