Fix for bug 2283 (RVCT 4.0 support is missing from PDK 3.0.h)
Have multiple extension sections in the bld.inf, one for each version
of the compiler. The RVCT version building the tools will build the
runtime libraries for its version, but make sure we extract all the other
versions from zip archives. Also add the archive for RVCT4.
// 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__