diff -r 000000000000 -r bde4ae8d615e os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcscldd.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/os/kernelhwsrv/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransportusbcscldd.h Fri Jun 15 03:10:57 2012 +0200 @@ -0,0 +1,174 @@ +/* +* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: +* Class declaration for CBulkOnlyTransportUsbcScLdd. +* +*/ + + +/** + @file + @internalTechnology +*/ + +#ifndef __CBULKONLYTRANSPORTUSBCSCLDD_H__ +#define __CBULKONLYTRANSPORTUSBCSCLDD_H__ + +#include "cbulkonlytransport.h" +#include "cactivedevicestatenotifierbase.h" + +// This the length of every buffer corresponding to each Bulk endpoint. +// Length is to support double buffering, maximum size of host transfers(64 for Windows/128 for MAC) + 2K (to send CSW(IN ep's) and to recwive CBW's(OUT ep's)) +LOCAL_D const TUint KMaxScBufferSize = 258 * 1024; +LOCAL_D const TUint KMaxScReadSize = 64 * 1024; + + +//Forward Declaration +class CBulkOnlyTransportUsbcScLdd; + +/** +Represent session with control endpoint (Ep0). +handles the control interface, and responds to the class specific commands (RESET and GET_MAX_LUN). +*/ + +class CControlInterfaceUsbcScLdd : public CActive + { +public: + enum TControlState + { + ENone, + EReadEp0Data, + ESendMaxLun + }; + +public: + static CControlInterfaceUsbcScLdd* NewL(CBulkOnlyTransportUsbcScLdd& aParent); + ~CControlInterfaceUsbcScLdd(); + TInt Start(); + void Stop(); + virtual void RunL(); + virtual void DoCancel(); + TInt OpenEp0(); + +private: + CControlInterfaceUsbcScLdd(CBulkOnlyTransportUsbcScLdd& aParent); + void ConstructL(); + TInt ReadEp0Data(); + void DecodeEp0Data(); + TInt ReadUsbEp0(); + +private: + TEndpointBuffer iEp0Buf; + TAny* iEp0Packet; + TUint iEp0Size; + TBool iEp0Zlp; + + TUsbRequestHdr iRequestHeader; + + /** reference to the CBulkOnlyTransport*/ + CBulkOnlyTransportUsbcScLdd& iParent; + + /** represent carrent state for state mashine */ + TControlState iCurrentState; + }; + + +/** Transport Class that accessess the SC LDD */ +class CBulkOnlyTransportUsbcScLdd : public CBulkOnlyTransport, public MLddDeviceStateNotification + { +public: + CBulkOnlyTransportUsbcScLdd(TInt aNumDrives,CUsbMassStorageController& aController); + + ~CBulkOnlyTransportUsbcScLdd(); + void ConstructL(); + + RDevUsbcScClient& Ldd(); + TInt BytesAvailable(); // from Mtransport base class + + TInt SetupConfigurationDescriptor(TBool aUnset = EFalse); + TInt SetupInterfaceDescriptors(); + void ReleaseInterface(); + void CancelControlInterface(); + TInt StartControlInterface(); + void ActivateDeviceStateNotifier(); + void CancelDeviceStateNotifier(); + void CancelReadWriteRequests(); + void AllocateEndpointResources(); + TInt GetDeviceStatus(TUsbcDeviceState& deviceStatus); + void FlushData(); + void ReadAndDiscardData(TInt aBytes); + void ReadCBW(); + void ExpireData(TAny* aAddress = NULL); + void ProcessCbwEvent(); + void StallEndpointAndWaitForClear(); + void ReadData(TUint aLength = 0); + void WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse); + void SetCbwPtr(); + TPtr8& SetCommandBufPtr(TUint aLength); + TPtr8& SetDataBufPtr(); + void SetPaddingBufPtr(TUint aLength); + void SetCswBufPtr(TUint aLength); + void ProcessReadingDataEvent(); + void DiscardData(TUint aLength); + void WriteToClient(TUint aLength); + void SetReadDataBufPtr( TUint aLength); + +#ifdef MSDC_MULTITHREADED + virtual void GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2); +#endif + + void Activate(TRequestStatus& aStatus, TUint& aValue); + void Cancel(); + +private: + TInt ReadUsb(TUint aLength = 0); + TInt OpenEndpoints(); + void ProcessDataFromHost(); // As USB Read API can return with KErrCompletion saying there is data already and + // that we can process the data without queuong a request, this function effectively does + // what Runl() did earlier + +private: + RChunk* iChunk; + RDevUsbcScClient iLdd; + CControlInterfaceUsbcScLdd* iControlInterface; + CActiveDeviceStateNotifierBase* iDeviceStateNotifier; + + /** To remember chunk specifics one defined, instead of walking it every time something required */ + TUint iInEndpoint; + TUint iOutEndpoint; + TEndpointBuffer iSCReadEndpointBuf; + TEndpointBuffer iSCWriteEndpointBuf; + + /** Pointer to the data in chunk which is read from the host */ + TAny* iSCReadData; + + /** Size of data read from the host in a 'transfer' */ + TUint iSCReadSize; + + /** If data read from host was termintated with a ZLP or not */ + TBool iReadZlp; + + /** Pointer to start of IN buffer in chunk which can be written into by protocol/media */ + TAny* iDataPtr; + + /** Length of IN buffer */ + TUint iInBufferLength; + }; + +#endif + + + + +