williamr@4: // Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies). williamr@4: // All rights reserved. williamr@4: // This component and the accompanying materials are made available williamr@4: // under the terms of the License "Eclipse Public License v1.0" williamr@4: // which accompanies this distribution, and is available williamr@4: // at the URL "http://www.eclipse.org/legal/epl-v10.html". williamr@4: // williamr@4: // Initial Contributors: williamr@4: // Nokia Corporation - initial contribution. williamr@4: // williamr@4: // Contributors: williamr@4: // williamr@4: // Description: williamr@4: // e32\include\drivers\usbcshared.inl williamr@4: // Kernel side definitions for the USB Device driver stack (PIL + LDD). williamr@4: // williamr@4: // williamr@4: williamr@4: /** williamr@4: @file usbcshared.inl williamr@4: @internalTechnology williamr@4: */ williamr@4: williamr@4: #ifndef __USBCSHARED_INL__ williamr@4: #define __USBCSHARED_INL__ williamr@4: williamr@4: // williamr@4: // --- DUsbClientController (USB PDD) --- williamr@4: // williamr@4: williamr@4: // --- Private member functions, used by controller itself --- williamr@4: williamr@4: const DBase* DUsbClientController::PEndpoint2ClientId(TInt aRealEndpoint) const williamr@4: { williamr@4: if (iRealEndpoints[aRealEndpoint].iLEndpoint) williamr@4: return iRealEndpoints[aRealEndpoint].iLEndpoint->iInterface->iInterfaceSet->iClientId; williamr@4: else williamr@4: return NULL; williamr@4: } williamr@4: williamr@4: williamr@4: TInt DUsbClientController::PEndpoint2LEndpoint(TInt aRealEndpoint) const williamr@4: { williamr@4: if (iRealEndpoints[aRealEndpoint].iLEndpoint) williamr@4: return iRealEndpoints[aRealEndpoint].iLEndpoint->iLEndpointNum; williamr@4: else williamr@4: return -1; williamr@4: } williamr@4: williamr@4: williamr@4: const TUsbcConfiguration* DUsbClientController::CurrentConfig() const williamr@4: { williamr@4: return (iCurrentConfig ? iConfigs[iCurrentConfig - 1] : NULL); williamr@4: } williamr@4: williamr@4: williamr@4: TUsbcConfiguration* DUsbClientController::CurrentConfig() williamr@4: { williamr@4: return (iCurrentConfig ? iConfigs[iCurrentConfig - 1] : NULL); williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::InterfaceExists(TInt aNumber) const williamr@4: { williamr@4: const TInt num_ifcsets = iConfigs[0]->iInterfaceSets.Count(); williamr@4: RPointerArray& ifcsets = iConfigs[0]->iInterfaceSets; williamr@4: for (TInt i = 0; i < num_ifcsets; i++) williamr@4: { williamr@4: if (ifcsets[i]->iInterfaceNumber == aNumber) williamr@4: { williamr@4: return ETrue; williamr@4: } williamr@4: } williamr@4: return EFalse; williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::EndpointExists(TUint aAddress) const williamr@4: { williamr@4: // Ep0 doesn't have a "logical ep" pointer (there's no virtual endpoint zero); williamr@4: // that's why this pointer being non-NULL is not a sufficient criterion for williamr@4: // endpoint-existence. (Apart from that, ep0 always exists.) williamr@4: const TInt idx = EpAddr2Idx(aAddress); williamr@4: return ((idx < iDeviceTotalEndpoints) && williamr@4: ((iRealEndpoints[idx].iLEndpoint != NULL) || williamr@4: ((aAddress & KUsbEpAddress_Portmask) == 0))); williamr@4: } williamr@4: williamr@4: williamr@4: void DUsbClientController::Buffer2Setup(const TAny* aBuf, TUsbcSetup& aSetup) const williamr@4: { williamr@4: // TUint8 index williamr@4: aSetup.iRequestType = static_cast(aBuf)[0]; williamr@4: aSetup.iRequest = static_cast(aBuf)[1]; williamr@4: // TUint16 index from here! williamr@4: aSetup.iValue = SWAP_BYTES_16((static_cast(aBuf))[1]); williamr@4: aSetup.iIndex = SWAP_BYTES_16((static_cast(aBuf))[2]); williamr@4: aSetup.iLength = SWAP_BYTES_16((static_cast(aBuf))[3]); williamr@4: } williamr@4: williamr@4: williamr@4: TUint DUsbClientController::EpIdx2Addr(TUint aRealEndpoint) const williamr@4: { williamr@4: return ((aRealEndpoint << 7) & 0x80) | ((aRealEndpoint >> 1) & 0x0f); williamr@4: } williamr@4: williamr@4: williamr@4: TUint DUsbClientController::EpAddr2Idx(TUint aAddress) const williamr@4: { williamr@4: return ((aAddress & 0x80) >> 7) | ((aAddress & 0x0f) << 1); williamr@4: } williamr@4: williamr@4: williamr@4: void DUsbClientController::SetEp0DataOutVars(const TUsbcSetup& aPacket, const DBase* aClientId) williamr@4: { williamr@4: __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::SetEp0DataOutVars()")); williamr@4: iSetup = aPacket; williamr@4: iEp0DataReceiving = ETrue; williamr@4: iEp0DataReceived = 0; williamr@4: iEp0ClientId = aClientId; williamr@4: } williamr@4: williamr@4: williamr@4: void DUsbClientController::ResetEp0DataOutVars() williamr@4: { williamr@4: __KTRACE_OPT(KUSB, Kern::Printf("DUsbClientController::ResetEp0DataOutVars()")); williamr@4: iEp0DataReceiving = EFalse; williamr@4: iEp0DataReceived = 0; williamr@4: iEp0ClientId = NULL; williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::IsInTheRequestList(const TUsbcRequestCallback& aCallback) williamr@4: { williamr@4: const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock); williamr@4: TSglQueIter iter(iEp0ReadRequestCallbacks); williamr@4: TUsbcRequestCallback* p; williamr@4: while ((p = iter++) != NULL) williamr@4: { williamr@4: if (p == &aCallback) williamr@4: { williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return ETrue; williamr@4: } williamr@4: } williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return EFalse; williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::IsInTheStatusList(const TUsbcStatusCallback& aCallback) williamr@4: { williamr@4: const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock); williamr@4: TSglQueIter iter(iStatusCallbacks); williamr@4: TUsbcStatusCallback* p; williamr@4: while ((p = iter++) != NULL) williamr@4: { williamr@4: if (p == &aCallback) williamr@4: { williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return ETrue; williamr@4: } williamr@4: } williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return EFalse; williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::IsInTheEpStatusList(const TUsbcEndpointStatusCallback& aCallback) williamr@4: { williamr@4: const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock); williamr@4: TSglQueIter iter(iEpStatusCallbacks); williamr@4: TUsbcEndpointStatusCallback* p; williamr@4: while ((p = iter++) != NULL) williamr@4: { williamr@4: if (p == &aCallback) williamr@4: { williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return ETrue; williamr@4: } williamr@4: } williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return EFalse; williamr@4: } williamr@4: williamr@4: williamr@4: TBool DUsbClientController::IsInTheOtgFeatureList(const TUsbcOtgFeatureCallback& aCallback) williamr@4: { williamr@4: const TInt irq = __SPIN_LOCK_IRQSAVE(iUsbLock); williamr@4: TSglQueIter iter(iOtgCallbacks); williamr@4: TUsbcOtgFeatureCallback* p; williamr@4: while ((p = iter++) != NULL) williamr@4: { williamr@4: if (p == &aCallback) williamr@4: { williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return ETrue; williamr@4: } williamr@4: } williamr@4: __SPIN_UNLOCK_IRQRESTORE(iUsbLock, irq); williamr@4: return EFalse; williamr@4: } williamr@4: williamr@4: // williamr@4: // --- Misc classes --- williamr@4: // williamr@4: williamr@4: // --- TUsbcClientCallback williamr@4: williamr@4: /** Constructor. williamr@4: */ williamr@4: TUsbcClientCallback::TUsbcClientCallback(DBase* aOwner, TDfcFn aCallback, TInt aPriority) williamr@4: : iOwner(aOwner), williamr@4: iDfc(aCallback, aOwner, aPriority) williamr@4: {} williamr@4: williamr@4: williamr@4: /** Returns a pointer to the owner of this request. williamr@4: williamr@4: @return A pointer to the owner of this request. williamr@4: */ williamr@4: DBase* TUsbcClientCallback::Owner() const williamr@4: { williamr@4: return iOwner; williamr@4: } williamr@4: williamr@4: williamr@4: /** Executes the callback function set by the owner of this request. williamr@4: williamr@4: @return KErrNone. williamr@4: */ williamr@4: TInt TUsbcClientCallback::DoCallback() williamr@4: { williamr@4: __ASSERT_DEBUG((NKern::CurrentContext() == EThread), Kern::Fault(KUsbPILPanicCat, __LINE__)); williamr@4: iDfc.Enque(); williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: williamr@4: /** Cancels the callback function set by the owner of this request. williamr@4: */ williamr@4: void TUsbcClientCallback::Cancel() williamr@4: { williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets the DFC queue used by the callback function. williamr@4: @param aDfcQ DFC queue to be set williamr@4: */ williamr@4: void TUsbcClientCallback::SetDfcQ(TDfcQue* aDfcQ) williamr@4: { williamr@4: iDfc.SetDfcQ(aDfcQ); williamr@4: } williamr@4: williamr@4: williamr@4: // --- TUsbcEndpointStatusCallback williamr@4: williamr@4: /** Constructor. williamr@4: */ williamr@4: TUsbcEndpointStatusCallback::TUsbcEndpointStatusCallback(DBase* aOwner, TDfcFn aCallback, williamr@4: TInt aPriority) williamr@4: : iOwner(aOwner), williamr@4: iDfc(aCallback, aOwner, aPriority), williamr@4: iState(0) williamr@4: {} williamr@4: williamr@4: williamr@4: /** Sets the state of this request to aState. williamr@4: williamr@4: @param aState The new state to be set. williamr@4: */ williamr@4: void TUsbcEndpointStatusCallback::SetState(TUint aState) williamr@4: { williamr@4: iState = aState; williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns the state value of this request. williamr@4: williamr@4: @return The state value of this request. williamr@4: */ williamr@4: TUint TUsbcEndpointStatusCallback::State() const williamr@4: { williamr@4: return iState; williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns a pointer to the owner of this request. williamr@4: williamr@4: @return A pointer to the owner of this request. williamr@4: */ williamr@4: DBase* TUsbcEndpointStatusCallback::Owner() const williamr@4: { williamr@4: return iOwner; williamr@4: } williamr@4: williamr@4: williamr@4: /** Executes the callback function set by the owner of this request. williamr@4: williamr@4: @return KErrNone. williamr@4: */ williamr@4: TInt TUsbcEndpointStatusCallback::DoCallback() williamr@4: { williamr@4: if (NKern::CurrentContext() == EThread) williamr@4: iDfc.Enque(); williamr@4: else williamr@4: iDfc.Add(); williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: williamr@4: /** Cancels the callback function set by the owner of this request. williamr@4: */ williamr@4: void TUsbcEndpointStatusCallback::Cancel() williamr@4: { williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets the DFC queue used by the callback function. williamr@4: */ williamr@4: void TUsbcEndpointStatusCallback::SetDfcQ(TDfcQue* aDfcQ) williamr@4: { williamr@4: iDfc.SetDfcQ(aDfcQ); williamr@4: } williamr@4: williamr@4: williamr@4: // --- TUsbcStatusCallback williamr@4: williamr@4: /** Constructor. williamr@4: */ williamr@4: TUsbcStatusCallback::TUsbcStatusCallback(DBase* aOwner, TDfcFn aCallback, TInt aPriority) williamr@4: : iOwner(aOwner), williamr@4: iDfc(aCallback, aOwner, aPriority) williamr@4: { williamr@4: ResetState(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets the state of this request to aState (at the first available position williamr@4: in the state value array). williamr@4: williamr@4: @param aState The new state to be set. williamr@4: */ williamr@4: void TUsbcStatusCallback::SetState(TUsbcDeviceState aState) williamr@4: { williamr@4: for (TInt i = 0; i < KUsbcDeviceStateRequests; i++) williamr@4: { williamr@4: if (iState[i] == EUsbcNoState) williamr@4: { williamr@4: iState[i] = aState; williamr@4: return; williamr@4: } williamr@4: } williamr@4: __KTRACE_OPT(KPANIC, Kern::Printf(" Error: KUsbcDeviceStateRequests too small (%d)!", williamr@4: KUsbcDeviceStateRequests)); williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns the state value of this request at a certain index. williamr@4: williamr@4: @param aIndex The index to be used for referencing the state array. williamr@4: williamr@4: @return The state value of this request at aIndex. williamr@4: */ williamr@4: TUsbcDeviceState TUsbcStatusCallback::State(TInt aIndex) const williamr@4: { williamr@4: if (aIndex >= 0 && aIndex < KUsbcDeviceStateRequests) williamr@4: { williamr@4: return iState[aIndex]; williamr@4: } williamr@4: else williamr@4: { williamr@4: __KTRACE_OPT(KPANIC, Kern::Printf(" Error: aIndex too large (%d)!", aIndex)); williamr@4: return EUsbcNoState; williamr@4: } williamr@4: } williamr@4: williamr@4: williamr@4: /** Resets the entire state value array of this request. williamr@4: */ williamr@4: void TUsbcStatusCallback::ResetState() williamr@4: { williamr@4: for (TInt i = 0; i < KUsbcDeviceStateRequests; ++i) williamr@4: { williamr@4: iState[i] = EUsbcNoState; williamr@4: } williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns a pointer to the owner of this request. williamr@4: williamr@4: @return A pointer to the owner of this request. williamr@4: */ williamr@4: DBase* TUsbcStatusCallback::Owner() const williamr@4: { williamr@4: return iOwner; williamr@4: } williamr@4: williamr@4: williamr@4: /** Executes the callback function set by the owner of this request. williamr@4: williamr@4: @return KErrNone. williamr@4: */ williamr@4: TInt TUsbcStatusCallback::DoCallback() williamr@4: { williamr@4: if (NKern::CurrentContext() == EThread) williamr@4: iDfc.Enque(); williamr@4: else williamr@4: iDfc.Add(); williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: williamr@4: /** Cancels the callback function set by the owner of this request. williamr@4: */ williamr@4: void TUsbcStatusCallback::Cancel() williamr@4: { williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets the DFC queue used by the callback function. williamr@4: */ williamr@4: void TUsbcStatusCallback::SetDfcQ(TDfcQue* aDfcQ) williamr@4: { williamr@4: iDfc.SetDfcQ(aDfcQ); williamr@4: } williamr@4: williamr@4: // --- TUsbcRequestCallback williamr@4: williamr@4: /** Constructor. williamr@4: */ williamr@4: TUsbcRequestCallback::TUsbcRequestCallback(const DBase* aOwner, TInt aEndpointNum, TDfcFn aDfcFunc, williamr@4: TAny* aEndpoint, TDfcQue* aDfcQ, TInt aPriority) williamr@4: : iEndpointNum(aEndpointNum), williamr@4: iRealEpNum(-1), williamr@4: iOwner(aOwner), williamr@4: iDfc(aDfcFunc, aEndpoint, aDfcQ, aPriority), williamr@4: iTransferDir(EControllerNone), williamr@4: iBufferStart(NULL), williamr@4: iPacketIndex(NULL), // actually TUint16 (*)[] williamr@4: iPacketSize(NULL), // actually TUint16 (*)[] williamr@4: iLength(0), williamr@4: iZlpReqd(EFalse), williamr@4: iTxBytes(0), williamr@4: iRxPackets(0), williamr@4: iError(KErrNone) williamr@4: { williamr@4: } williamr@4: williamr@4: williamr@4: /** Destructor. williamr@4: */ williamr@4: TUsbcRequestCallback::~TUsbcRequestCallback() williamr@4: { williamr@4: __KTRACE_OPT(KUSB, Kern::Printf("TUsbcRequestCallback::~TUsbcRequestCallback()")); williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets some data members of this request for a read request. williamr@4: williamr@4: @param aBufferStart The start of the data buffer to be filled. williamr@4: @param aBufferAddr The physical address of the buffer (used for DMA). williamr@4: @param aPacketIndex A pointer to the packet index values array. williamr@4: @param aPacketSize A pointer to the packet size values array. williamr@4: @param aLength The number of bytes to be received. williamr@4: */ williamr@4: void TUsbcRequestCallback::SetRxBufferInfo(TUint8* aBufferStart, TPhysAddr aBufferAddr, williamr@4: TUsbcPacketArray* aPacketIndex, williamr@4: TUsbcPacketArray* aPacketSize, williamr@4: TInt aLength) williamr@4: { williamr@4: iTransferDir = EControllerRead; williamr@4: iBufferStart = aBufferStart; williamr@4: iBufferAddr = aBufferAddr; williamr@4: iPacketIndex = aPacketIndex; williamr@4: iPacketSize = aPacketSize; williamr@4: iLength = aLength; williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets some data members of this request for a write request. williamr@4: williamr@4: @param aBufferStart The start of the buffer that contains the data to be sent. williamr@4: @param aBufferAddr The physical address of the buffer (used for DMA). williamr@4: @param aLength The number of bytes to be transmitted. williamr@4: */ williamr@4: void TUsbcRequestCallback::SetTxBufferInfo(TUint8* aBufferStart, TPhysAddr aBufferAddr, TInt aLength) williamr@4: { williamr@4: iTransferDir = EControllerWrite; williamr@4: iBufferStart = aBufferStart; williamr@4: iBufferAddr = aBufferAddr; williamr@4: iLength = aLength; williamr@4: } williamr@4: williamr@4: williamr@4: /** Sets the transfer direction for this request. williamr@4: williamr@4: @param aTransferDir The new transfer direction. williamr@4: */ williamr@4: void TUsbcRequestCallback::SetTransferDirection(TTransferDirection aTransferDir) williamr@4: { williamr@4: iTransferDir = aTransferDir; williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns a pointer to the owner of this request. williamr@4: williamr@4: @return A pointer to the owner of this request. williamr@4: */ williamr@4: const DBase* TUsbcRequestCallback::Owner() const williamr@4: { williamr@4: return iOwner; williamr@4: } williamr@4: williamr@4: williamr@4: /** Executes the callback function set by the owner of this request. williamr@4: williamr@4: @return KErrNone. williamr@4: */ williamr@4: TInt TUsbcRequestCallback::DoCallback() williamr@4: { williamr@4: if (NKern::CurrentContext() == NKern::EThread) williamr@4: iDfc.Enque(); williamr@4: else williamr@4: iDfc.Add(); williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: williamr@4: /** Cancels the callback function set by the owner of this request. williamr@4: */ williamr@4: void TUsbcRequestCallback::Cancel() williamr@4: { williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: // --- TUsbcOtgFeatureCallback williamr@4: williamr@4: /** Constructor. williamr@4: */ williamr@4: TUsbcOtgFeatureCallback::TUsbcOtgFeatureCallback(DBase* aOwner, TDfcFn aCallback, williamr@4: TInt aPriority) williamr@4: : iOwner(aOwner), williamr@4: iDfc(aCallback, aOwner, aPriority), williamr@4: iValue(0) williamr@4: {} williamr@4: williamr@4: williamr@4: /** Returns a pointer to the owner of this request. williamr@4: @return A pointer to the owner of this request. williamr@4: */ williamr@4: DBase* TUsbcOtgFeatureCallback::Owner() const williamr@4: { williamr@4: return iOwner; williamr@4: } williamr@4: williamr@4: williamr@4: /** Set feature value which is to be notified to client. williamr@4: @param OTG feature value to be set williamr@4: */ williamr@4: void TUsbcOtgFeatureCallback::SetFeatures(TUint8 aFeatures) williamr@4: { williamr@4: iValue = aFeatures; williamr@4: } williamr@4: williamr@4: williamr@4: /** Set feature value which is to be notified to client. williamr@4: @return Value of OTG features williamr@4: */ williamr@4: TUint8 TUsbcOtgFeatureCallback::Features() const williamr@4: { williamr@4: return iValue; williamr@4: } williamr@4: williamr@4: williamr@4: /** Set DFC queue. williamr@4: @param aDfcQ DFC queue to be set williamr@4: */ williamr@4: void TUsbcOtgFeatureCallback::SetDfcQ(TDfcQue* aDfcQ) williamr@4: { williamr@4: iDfc.SetDfcQ(aDfcQ); williamr@4: } williamr@4: williamr@4: williamr@4: /** Executes the callback function set by the owner of this request. williamr@4: @return KErrNone. williamr@4: */ williamr@4: TInt TUsbcOtgFeatureCallback::DoCallback() williamr@4: { williamr@4: if (NKern::CurrentContext() == EThread) williamr@4: iDfc.Enque(); williamr@4: else williamr@4: iDfc.Add(); williamr@4: return KErrNone; williamr@4: } williamr@4: williamr@4: williamr@4: /** Cancels the callback function set by the owner of this request. williamr@4: */ williamr@4: void TUsbcOtgFeatureCallback::Cancel() williamr@4: { williamr@4: iDfc.Cancel(); williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns a pointer to the currently selected (active) setting of this interface. williamr@4: williamr@4: @return A pointer to the currently selected (active) setting of this interface. williamr@4: */ williamr@4: const TUsbcInterface* TUsbcInterfaceSet::CurrentInterface() const williamr@4: { williamr@4: return iInterfaces[iCurrentInterface]; williamr@4: } williamr@4: williamr@4: williamr@4: /** Returns a pointer to the currently selected (active) setting of this interface. williamr@4: williamr@4: @return A pointer to the currently selected (active) setting of this interface. williamr@4: */ williamr@4: williamr@4: TUsbcInterface* TUsbcInterfaceSet::CurrentInterface() williamr@4: { williamr@4: return iInterfaces[iCurrentInterface]; williamr@4: } williamr@4: williamr@4: williamr@4: #endif // __USBCSHARED_INL__ williamr@4: williamr@4: williamr@4: