diff -r a5496987b1da -r 189ece41fa29 kerneltest/e32test/iic/iic_psl/iic_client.cpp --- a/kerneltest/e32test/iic/iic_psl/iic_client.cpp Thu Jul 01 17:57:33 2010 +0100 +++ b/kerneltest/e32test/iic/iic_psl/iic_client.cpp Fri Jul 09 13:13:20 2010 +0100 @@ -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);} @@ -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) @@ -2395,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));