diff -r 000000000000 -r a41df078684a userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h Mon Oct 19 15:55:17 2009 +0100 @@ -0,0 +1,212 @@ +// 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 CBulkOnlyTransport. +// +// + +/** + @file + @internalTechnology +*/ + +#ifndef __CBULKONLYTRANSPORT_H__ +#define __CBULKONLYTRANSPORT_H__ + +#include +#include +#include +#include "protocol.h" +#include "cusbmassstoragecontroller.h" +#include "mldddevicestatenotification.h" + +static const TUint KCbwLength = 31; +static const TUint KCommandBufferLength = 36; +// for control endpoint +static const TUint KRequestHdrSize = 8; + + +/** size of buffer for command padding */ +static const TUint KBOTMaxBufSize = 512; + +/** size of csw */ +LOCAL_D const TInt KCswLength = 13; + + +/** +Represent Endpoint0 request +*/ +class TUsbRequestHdr + { +public: + enum TEp0Request + { + EReqGetMaxLun = 0xFE, + EReqReset = 0xFF + }; +public: + TInt Decode(const TDesC8& aBuffer); + TBool IsDataResponseRequired() const; + +public: + TUint8 iRequestType; + TEp0Request iRequest; + TUint16 iValue; + TUint16 iIndex; + TUint16 iLength; + }; + + +/** handles the data transport and communications with the SCSI protocol */ +class CBulkOnlyTransport : public CActive, public MTransportBase + { +public: + enum TCswStatus + { + ECommandPassed = 0, + ECommandFailed = 1, + EPhaseError = 2 + }; + + enum TTransportState + { + ENone, + EWaitForCBW, + ESendingCSW, + EWritingData, + EReadingData, + EPermErr + }; +public: + static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController, CUsbMassStorageController::TTransportldd aTransportLddFlag); + static CBulkOnlyTransport* NewL(TInt aNumDrives,CUsbMassStorageController& aController); + + CBulkOnlyTransport(TInt aNumDrives,CUsbMassStorageController& aController); + TInt InitialiseTransportL(TInt aTransportLddFlag); + ~CBulkOnlyTransport(); + + TInt Start(); + TInt Stop(); + void RegisterProtocol(MProtocolBase& aProtocol); + + CUsbMassStorageController& Controller(); + TInt MaxLun(); + void SetupReadData(TUint aLength); + void SetupWriteData(TPtrC8& aData); + + void GetCommandBufPtr(TPtr8& aDes, TUint aLength); // Ptr to iCommandBuf to send responses to commands + void GetReadDataBufPtr(TPtr8& aDes); // Ptr to DataBuf's + void GetWriteDataBufPtr(TPtrC8& aDes); +#ifdef MSDC_MULTITHREADED + void ProcessReadData(TAny* aAddress); +#endif + + TInt HwStart(TBool aDiscard = EFalse); + TInt HwStop(); + void StopBulkOnlyEndpoint(); + TInt HwSuspend(); + TInt HwResume(); + + virtual void RunL(); + virtual void DoCancel(); + + virtual TInt SetupConfigurationDescriptor(TBool aUnset = EFalse) = 0; + virtual TInt SetupInterfaceDescriptors() = 0; + virtual void ReleaseInterface() = 0; + virtual void CancelControlInterface() = 0; + virtual TInt StartControlInterface() = 0; + virtual void ActivateDeviceStateNotifier() = 0; + virtual void CancelDeviceStateNotifier() = 0; + virtual void CancelReadWriteRequests() = 0; + virtual void AllocateEndpointResources() = 0; + virtual TInt GetDeviceStatus(TUsbcDeviceState& deviceStatus) = 0; + virtual void FlushData() = 0; + virtual void ReadAndDiscardData(TInt aBytes) = 0; + virtual void ReadCBW() = 0; + virtual void ExpireData(TAny* aAddress = NULL) = 0; + virtual void ProcessCbwEvent() = 0; + virtual void StallEndpointAndWaitForClear() = 0; + virtual void ReadData(TUint aLength = 0) = 0; + virtual void WriteUsb(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse) = 0; + virtual void SetCbwPtr() = 0; + virtual TPtr8& SetCommandBufPtr(TUint aLength) = 0; // pointer to buf for sending responses to commands + virtual TPtr8& SetDataBufPtr() = 0; // to swap between the two buffers + virtual void SetPaddingBufPtr(TUint aLength) = 0; + virtual void SetCswBufPtr(TUint aLength) = 0; + virtual void ProcessReadingDataEvent() = 0; + virtual void DiscardData(TUint aLength) = 0; + virtual void WriteToClient(TUint aLength) = 0; + virtual void SetReadDataBufPtr( TUint aLength) = 0; + +#ifdef MSDC_MULTITHREADED + virtual void GetBufferPointers(TPtr8& aDes1, TPtr8& aDes2) = 0; +#endif + +protected: + void DecodeCBW(); + TBool CheckCBW(); + void SetPermError(); + void SendCSW(TUint aTag, TUint aDataResidue, TCswStatus aStatus); + void WriteData(TRequestStatus& aStatus, TPtrC8& aDes, TUint aLength, TBool aZlpRequired = EFalse); + + void CallReadAndDiscardData(TInt aBytes); + void Activate(TInt aReason); + +protected: + /** maximun logic unit number supported (started from 0*/ + TInt iMaxLun; + + CUsbMassStorageController& iController; + + MProtocolBase* iProtocol; + + TTransportState iCurrentState; + + /** Shows how much data was not send/received */ + TUint32 iDataResidue; + TUint32 iCbwTag; + TCswStatus iCmdStatus; + + /** Indicate if SCSI prot has data to sent */ + TBool iWriteSetUp; + + /** Indicate if SCSI prot expected additional data */ + TBool iReadSetUp; + + /** Indicate whether SCSI prot started or not */ + TBool iStarted; + + TBool iStallAllowed; + + TBool iInterfaceConfigured; + + TPtr8 iCommandBufPtr; // Ptr to buffer to write responses to commands + TPtr8 iDataBufPtr; + TPtr8 iCswBufPtr; + TPtr8 iPaddingBufPtr; + + /** Size of data, Used to tell transport how much protocol/media has to send */ + TUint iBufSize; + + TPtrC8 iWriteBufPtr; + + TPtr8 iReadBufPtr; + + /** Internal TPtr to check validity of and decode CBW */ + TPtrC8 iCbwBufPtr; + }; + + +#endif // __CBULKONLYTRANSPORT_H__ + +