userlibandfileserver/fileserver/smassstorage/inc/cbulkonlytransport.h
changeset 0 a41df078684a
--- /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 <e32std.h> 
+#include <d32usbcsc.h>
+#include <d32usbc.h>
+#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__
+
+