diff -r 000000000000 -r c6b0df440bee dbgagents/trkagent/dbgtrccomm/server/dbgtrcportmgr.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dbgagents/trkagent/dbgtrccomm/server/dbgtrcportmgr.cpp Tue Mar 02 10:33:16 2010 +0530 @@ -0,0 +1,359 @@ +/* +* Copyright (c) 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: +* +*/ + + +#include +#include + +#include "logging.h" +#include "portreader.h" +#include "portwriter.h" +#include "dbgtrcportmgr.h" + +//default USB settings +_LIT(KDefaultUsbPDD, "NONE"); +_LIT(KDefaultUsbLDD, "EUSBC"); +_LIT(KDefaultUsbCSY, "ECACM"); +#define KDefaultUsbPort 1 + +// uncomment the line below for testing with serial port on H4 or H2 board +//#define SERIAL + +// +// 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 TBps TBpsRateFromDbgTrcBaudRate(TBaudRates aRate) +{ + switch (aRate) + { + case EBaud50: return EBps50; + case EBaud75: return EBps75; + case EBaud110: return EBps110; + case EBaud134: return EBps134; + case EBaud150: return EBps150; + case EBaud300: return EBps300; + case EBaud600: return EBps600; + case EBaud1200: return EBps1200; + case EBaud1800: return EBps1800; + case EBaud2000: return EBps2000; + case EBaud2400: return EBps2400; + case EBaud3600: return EBps3600; + case EBaud4800: return EBps4800; + case EBaud7200: return EBps7200; + case EBaud9600: return EBps9600; + case EBaud19200: return EBps19200; + case EBaud38400: return EBps38400; + case EBaud57600: return EBps57600; + case EBaud115200: return EBps115200; + case EBaud230400: return EBps230400; + case EBaud460800: return EBps460800; + case EBaud576000: return EBps576000; + case EBaud1152000: return EBps1152000; + case EBaud4000000: return EBps4000000; + default: return EBpsAutobaud; + } +} + + +CDbgTrcPortMgr* CDbgTrcPortMgr::NewL() +{ + LOG_MSG("CDbgTrcPortMgr::NewL"); + + CDbgTrcPortMgr* self = new(ELeave) CDbgTrcPortMgr; + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + return self; +} + +CDbgTrcPortMgr::~CDbgTrcPortMgr() +{ + LOG_MSG("CDbgTrcPortMgr::~CDbgTrcPortMgr"); + + SafeDelete(iReader); + SafeDelete(iWriter); +} + +void CDbgTrcPortMgr::ConstructL() +{ + LOG_MSG("CDbgTrcPortMgr::ConstructL"); + + iReader = NULL; + iWriter = NULL; + +#ifdef SERIAL // for testing with serial on H4 or H2 board. + iPDD.Copy(_L("EUART1")); + iLDD.Copy(_L("ECOMM")); + iCSY.Copy(_L("ECUART")); + iPortNumber = 3; +#else + //set the default ACM port settings. + iPDD.Copy(KDefaultUsbPDD); + iLDD.Copy(KDefaultUsbLDD); + iCSY.Copy(KDefaultUsbCSY); + iPortNumber = KDefaultUsbPort; +#endif + + iRate = EBaud115200; + + iConnected = EFalse; + iActiveConnections = 0; + iServerStarted = EFalse; + + iAcmConfig.iBaudRate = iRate; + iAcmConfig.iPortNumber = iPortNumber; +} + +void CDbgTrcPortMgr::GetPortConfig(TDes8& aDes) +{ + LOG_MSG("CDbgTrcPortMgr::GetPortConfig"); + + TPtrC8 cfg((const TUint8*)&iAcmConfig, sizeof(iAcmConfig)); + aDes.Copy(cfg); +} + +TInt CDbgTrcPortMgr::SetPortConfig(const TDesC8& aDes) +{ + LOG_MSG("CDbgTrcPortMgr::SetPortConfig"); + + if (iConnected) + return KErrInUse; + + if (aDes.Length()<(TInt)sizeof(TAcmConfigV01)) + return KErrGeneral; + TAcmConfigV01 config(*(TAcmConfigV01*)aDes.Ptr()); + + iPortNumber = config.iPortNumber; + iRate = config.iBaudRate; + + iAcmConfig.iBaudRate = iRate; + iAcmConfig.iPortNumber = iPortNumber; + + return KErrNone; +} + + +// +// CDbgTrcPortMgr::OpenPortL +// +// Open the ACM port +// +TInt CDbgTrcPortMgr::OpenPortL() +{ + LOG_MSG("CDbgTrcPortMgr::OpenPort"); + + TInt error = KErrNone; + + if (iConnected) + { + iActiveConnections++; + return error; //return KErrNone if the connection is already opened by another client. + } + + if (!iServerStarted) + { + StartC32(); + error = iServer.Connect(); + if (error == KErrNone) + { + iServerStarted = ETrue; + LOG_MSG("C32 Server started"); + } + } + + if (iServerStarted) + { + error = iServer.LoadCommModule(iCSY); + if (error == KErrNone) + { + LOG_MSG("CSY Loaded:"); + + TInt ports = 0; + error = iServer.NumPorts(ports); + + if (error == KErrNone) + { + LOG_MSG2("Number of ports: %d", ports); + + // 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; + TInt err1 = iServer.GetPortInfo(i, module, serialInfo); + + // come out of the loop and error out if we are not able + // to get the port info. + if (err1 != KErrNone) + break; + + module.LowerCase(); + LOG_MSG("Module name: "); + + if (!module.Compare(csyModule)) + { + error = KErrNone; + LOG_MSG("CSY Module matched"); + } + } + + if (error == KErrNone) + { + LOG_MSG("CSY Module found"); + if (iPDD.Compare(KDefaultUsbPDD)) + error = User::LoadPhysicalDevice(iPDD); + + if (error == KErrNone || error == KErrAlreadyExists) + { + error = User::LoadLogicalDevice(iLDD); + if (error == KErrNone || error == KErrAlreadyExists) + { + error = KErrNone; + TBuf portName; + BuildPortName(serialInfo.iName, iPortNumber, portName); + + error = iPort.Open(iServer, portName, ECommExclusive, ECommRoleDTE); + if (error != KErrNone) + { + LOG_MSG("Unable to open port in DTE mode"); + + error = iPort.Open(iServer, portName, ECommExclusive, ECommRoleDCE); + } + + if (error == KErrNone) + { + LOG_MSG("Port opened"); + + // Configure physical and logical characteristics + TCommConfig config; + iPort.Config(config); + config().iRate = TBpsRateFromDbgTrcBaudRate(iRate); + config().iParity = EParityNone; + config().iDataBits = EData8; + config().iStopBits = EStop1; + config().iFifo = EFifoEnable; + + config().iHandshake = 0; // no flow control at all + + error = iPort.SetConfig(config); + + if (error == KErrNone) + { + LOG_MSG("Port configuration set"); + + //iPort.SetReceiveBufferLength(MAX_BUF_SIZE); + iConnected = ETrue; + //reset the rx and tx buffers just in case + //if there is any stale data lying around from the previous debug sessions + iPort.ResetBuffers(); + + // now increment the active connections counter + iActiveConnections++; + + // now create the port reader and writer. + iReader = CPortReader::NewL(iPort); + iWriter = CPortWriter::NewL(iPort); + } + } + } + } + } + } + } + } + + if (iServerStarted && !iConnected) + { + iServer.Close(); + iServerStarted = EFalse; + } + + return error; +} + + +// +// CDbgTrcPortMgr::ClosePort +// +// Close the ACM port +// +TInt CDbgTrcPortMgr::ClosePort() +{ + // now decrement the active connections counter + if (iActiveConnections > 0) + iActiveConnections--; + + if (iActiveConnections == 0) // close the actual port only when the number of active connections is 0 + { + SafeDelete(iReader); + SafeDelete(iWriter); + + if (iConnected) + { + iPort.Close(); + iConnected = EFalse; + } + + if (iServerStarted) + { + iServer.Close(); + iServerStarted = EFalse; + } + } + + return KErrNone; +} + +// +// CDbgTrcPortMgr::GetPortReader +// +// +CPortReader* CDbgTrcPortMgr::GetPortReader() +{ + if (iConnected) + return iReader; + + return NULL; +} + +// +// CDbgTrcPortMgr::GetPortReader +// +// +CPortWriter* CDbgTrcPortMgr::GetPortWriter() +{ + if (iConnected) + return iWriter; + + return NULL; +} + +