diff -r a179b74831c9 -r c1f20ce4abcf kerneltest/e32test/iic/iic_psl/iic_client.cpp --- a/kerneltest/e32test/iic/iic_psl/iic_client.cpp Thu Aug 19 11:14:22 2010 +0300 +++ b/kerneltest/e32test/iic/iic_psl/iic_client.cpp Tue Aug 31 16:34:26 2010 +0300 @@ -90,7 +90,7 @@ class DIicClientChan : public DBase { public: - DIicClientChan(DIicBusChannel* aChan, TInt8 aChanNum, TUint8 aChanType):iChan(aChan),iChanNumber(aChanNum),iChanType(aChanType){}; + DIicClientChan(DIicBusChannel* aChan, TInt8 aChanNum, TUint8 aChanType):iChanNumber(aChanNum),iChanType(aChanType),iChan(aChan){}; ~DIicClientChan(); TInt GetChanNum()const {return iChanNumber;}; TUint8 GetChanType()const {return iChanType;}; @@ -112,8 +112,13 @@ #ifdef STANDALONE_CHANNEL +#ifdef IIC_STUBS +_LIT(KLddRootName,"iic_client_stubs"); +#else _LIT(KLddRootName,"iic_client_ctrless"); -#else +#endif/*IIC_STUBS*/ + +#else/*STANDALONE_CHANNEL*/ _LIT(KLddRootName,"iic_client"); #endif _LIT(KIicClientThreadName,"IicClientLddThread"); @@ -403,6 +408,7 @@ TInt StaticExtension(TUint aId, TUint aFunction, TAny* aParam1, TAny* aParam2); TInt CaptureChannel(TInt aBusId, TDes8* aConfigHdr, TIicBusSlaveCallback* aCallback, TInt& aChannelId, TBool aAsynch=NULL); TInt ReleaseChannel(TInt aChannelId); + TInt Spare1(TInt aBusId); public: inline void Lock() {Kern::MutexWait(*iArrayMutex);} inline void Unlock() {Kern::MutexSignal(*iArrayMutex);} @@ -499,7 +505,7 @@ // Constructor { CLIENT_PRINT(("> DDeviceIicClient::DDeviceIicClient()")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("> DDeviceIicClient::DDeviceIicClient()")); + __KTRACE_OPT(KIIC, Kern::Printf("> DDeviceIicClient::DDeviceIicClient()")); iParseMask=0; // No info, no PDD, no Units iUnitsMask=0; iVersion=TVersion(KIicClientMajorVersionNumber, @@ -529,7 +535,7 @@ DDeviceIicClient::~DDeviceIicClient() { CLIENT_PRINT(("> DDeviceIicClient::~DDeviceIicClient()")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("> DDeviceIicClient::~DDeviceIicClient()")); + __KTRACE_OPT(KIIC, Kern::Printf("> DDeviceIicClient::~DDeviceIicClient()")); #ifdef STANDALONE_CHANNEL //For Standalone Channel, the client is responsible for channel destroy ChannelArray.ResetAndDestroy(); @@ -540,7 +546,7 @@ // Install the device driver. { CLIENT_PRINT(("> DDeviceIicClient::Install()")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("> DDeviceIicClient::Install()")); + __KTRACE_OPT(KIIC, Kern::Printf("> DDeviceIicClient::Install()")); return(SetName(&KLddRootName)); } @@ -763,7 +769,7 @@ DIicClientChan* aClientChan; TInt r = KErrNone; DIicBusChannel *chan = NULL, *chanM = NULL, *chanS = NULL; - TInt i; + TUint i; for(i=0; i DChannelIicClient::~DChannelIicClient()")); - __KTRACE_OPT(KRESMANAGER, Kern::Printf("> DChannelIicClient::~DChannelIicClient()")); + __KTRACE_OPT(KIIC, Kern::Printf("> DChannelIicClient::~DChannelIicClient()")); delete iNotif; iArrayMutex->Close(NULL); iChanArrWrtSem->Close(NULL); @@ -1324,6 +1330,56 @@ return r; } +//this function is added for improving the code coverage of IIC. +//Spare1 is a placeholder for future expansion, and so returns KErrNotSupported. +#ifdef STANDALONE_CHANNEL +TInt DChannelIicClient::Spare1(TInt aBusId) + { + TInt r = KErrNone; + + TInt chanIndex = 0; + DIicClientChan* chanPtr = NULL; + if(r == KErrNone) + { + r = GetChanPtr(aBusId, chanIndex, chanPtr); + if(r == KErrNone) + { + if(!chanPtr) + { + r = KErrArgument; + } + else + { + switch(chanPtr->GetChanType()) + { + case DIicBusChannel::EMaster: + { + r = ((DIicBusChannelMaster*)(chanPtr->GetChannelPtr()))->Spare1(0,NULL,NULL); + break; + } + case DIicBusChannel::EMasterSlave: + { + r = KErrNotSupported; + break; + } + case DIicBusChannel::ESlave: + { + r = ((DIicBusChannelSlave*)(chanPtr->GetChannelPtr()))->Spare1(0,NULL,NULL); + break; + } + default: + { + r = KErrArgument; + } + } + } + } + } + return r; + } +#endif + +#ifndef IIC_STUBS void DChannelIicClient::DoCancel(TInt aMask) { // Cancel an outstanding request. @@ -1406,7 +1462,68 @@ return; } +#else/*IIC_STUBS*/ +//should only be called in IIC_STUBS mode +//DoCancel is used to cancel an asynchronous request which is still waiting in the queue and +//has not yet been handled by IIC. +//In the stub test, QueueTransaction should always return a KErrNotSupported error code +//So we pretend there is an request waiting in the queue that can be cancelled by calling DoCancel. +void DChannelIicClient::DoCancel(TInt aMask) + { + // Cancel an outstanding request. + CLIENT_PRINT(("DChannelIicClient::DoCancel invoked with aMask=0x%x\n", aMask)); + // inline void CancelAsyncOperation(TRequestStatus* aStatus, TInt aBusId) {TInt* parms[2]; parms[0]=(TInt*)aStatus; parms[1]=(TInt*)aBusId;DoCancel((TInt)&parms[0]);} + // aMask has the address on TInt* parms[2] + // parms[0] = TRequestStatus pointer + // parms[1] = Bus Identifier + TInt* parms[2]; + TInt r=Kern::ThreadRawRead(iClient,(TAny*)aMask,&(parms[0]),2*sizeof(TInt*)); + if(r!=KErrNone) + { + CLIENT_PRINT(("DChannelIicClient::DoCancel ERROR - Can't read parms[]\n")); + return; // Can't proceed if can't access request parameters + } + CLIENT_PRINT(("DChannelIicClient::DoCancel - TRequestStatus 0x%x, BusID = 0x%x\n",parms[0],parms[1])); + TRequestStatus* status= (TRequestStatus*)(parms[0]); + + //A valid transaction object is required here in order to exercise the API + TInt busIdI2c = (TInt)(parms[1]); + TConfigI2cBufV01* i2cBuf=NULL; + SET_BUS_TYPE(busIdI2c,EI2c); + SET_CHAN_NUM(busIdI2c,10); + // aDeviceId=1 ... 100kHz ... aTimeoutPeriod=100 ... aTransactionWaitCycles=10 - arbitrary paarmeters. + r=CreateI2cBuf(i2cBuf, EI2cAddr7Bit, 36, ELittleEndian, 100); + if(r!=KErrNone) + { + CLIENT_PRINT(("DChannelIicClient::DoCancel ERROR - Can't allocate memory for I2c buffer\n")); + return; // Can't proceed if can't access request parameters + } + + TIicBusTransfer* tfer = new TIicBusTransfer(TIicBusTransfer::EMasterWrite,8,i2cBuf); + if(tfer == NULL) + { + CLIENT_PRINT(("DChannelIicClient::DoCancel ERROR - Can't allocate memory for the transfer\n")); + delete i2cBuf; + return; + } + + TIicBusTransaction* transac = new TIicBusTransaction((TDes8*)i2cBuf, tfer); + if(transac == NULL) + { + CLIENT_PRINT(("DChannelIicClient::DoCancel ERROR - Can't allocate memory for the transaction\n")); + delete i2cBuf; + delete tfer; + return; + } + + r = CancelTransaction(busIdI2c, transac); + Kern::RequestComplete(iClient, status, r); + delete i2cBuf; + delete tfer; + delete transac; + } +#endif/*IIC_STUBS*/ // Function to support preamble testing void PreambleCallbackFunc(TIicBusTransaction* /*aTrans*/, TAny* aParam) @@ -2075,7 +2192,6 @@ delete iI2cBuf; iI2cBuf=NULL; TIicBusTransfer* currTfer = iTfer; - TIicBusTransfer* nextTfer = NULL; while(currTfer) { TIicBusTransfer* nextTfer = (TIicBusTransfer*)(currTfer->Next()); @@ -2087,7 +2203,6 @@ }; iTfer=NULL; currTfer = iFdTfer; - nextTfer = NULL; while(currTfer) { TIicBusTransfer* nextTfer = (TIicBusTransfer*)(currTfer->Next()); @@ -2397,8 +2512,17 @@ r = channelInterface.TestInterface(); break; } + case(RBusDevIicClient::ETestSpare1): + { + r = Spare1((TInt)a1); + break; + } + case(RBusDevIicClient::ETestStaticEx): + { + r = StaticExtension((TUint32)a1, (TUint)RBusDevIicClient::ECtlIoNone, NULL, NULL); + break; + } #endif - default: { CLIENT_PRINT(("DChannelIicClient::DoControl - unrecognised value for aId=0x%x\n",aId));