--- 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<NUM_CHANNELS_SPI; i++)
{
CLIENT_PRINT(("\n"));
@@ -1019,7 +1025,7 @@
// Destructor
{
CLIENT_PRINT(("> 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));