epoc32/include/drivers/usbcsc.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
// Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
williamr@4
     2
// All rights reserved.
williamr@4
     3
// This component and the accompanying materials are made available
williamr@4
     4
// under the terms of the License "Eclipse Public License v1.0"
williamr@4
     5
// which accompanies this distribution, and is available
williamr@4
     6
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
williamr@4
     7
//
williamr@4
     8
// Initial Contributors:
williamr@4
     9
// Nokia Corporation - initial contribution.
williamr@4
    10
//
williamr@4
    11
// Contributors:
williamr@4
    12
//
williamr@4
    13
// Description:
williamr@4
    14
// e32\include\drivers\usbcsc.h
williamr@4
    15
// Kernel side definitions for the USB Device driver stack (PIL + LDD).
williamr@4
    16
// 
williamr@4
    17
//
williamr@4
    18
williamr@4
    19
/**
williamr@4
    20
 @file usbcsc.h
williamr@4
    21
 @internalTechnology
williamr@4
    22
*/
williamr@4
    23
williamr@4
    24
#ifndef __USBCSC_H__
williamr@4
    25
#define __USBCSC_H__
williamr@4
    26
williamr@4
    27
#include <kernel/kernel.h>
williamr@4
    28
#include <kernel/kern_priv.h>
williamr@4
    29
#include <kernel/kpower.h>
williamr@4
    30
#include <platform.h>
williamr@4
    31
williamr@4
    32
#include <d32usbcsc.h>
williamr@4
    33
williamr@4
    34
#include <drivers/usbcshared.h>
williamr@4
    35
williamr@4
    36
/** LDD Major version, This should agree with the information in RDevUsbcClient::TVer.
williamr@4
    37
*/
williamr@4
    38
const TInt KUsbcScMajorVersion = 0;
williamr@4
    39
williamr@4
    40
/** LDD Minor version, This should agree with the information in RDevUsbcClient::TVer.
williamr@4
    41
*/
williamr@4
    42
const TInt KUsbcScMinorVersion = 1;
williamr@4
    43
williamr@4
    44
/** LDD Build version, This should agree with the information in RDevUsbcClient::TVer.
williamr@4
    45
*/
williamr@4
    46
const TInt KUsbcScBuildVersion = KE32BuildVersionNumber;
williamr@4
    47
williamr@4
    48
/** Must correspond to the max enum of TRequest + 1;
williamr@4
    49
	currently this is ERequestOtgFeaturesNotify = 10.
williamr@4
    50
*/
williamr@4
    51
const TInt KUsbcScMaxRequests = 11;
williamr@4
    52
williamr@4
    53
// Request queue sizes need to be power of 2.
williamr@4
    54
williamr@4
    55
/** The number of requests that can be queued on any IN endpoint */
williamr@4
    56
const TInt KUsbcScInRequests = 4;
williamr@4
    57
/** The number of requests that can be queued on any OUT endpoint */
williamr@4
    58
const TInt KUsbcScOutRequests = 2;
williamr@4
    59
williamr@4
    60
/** In TUsbcScBuffer.iDirection, this indicates that the endpoint is an IN endpoint */
williamr@4
    61
const TInt KUsbcScIn =  0;
williamr@4
    62
/** In TUsbcScBuffer.iDirection, this indicates that the endpoint is an OUT endpoint */
williamr@4
    63
const TInt KUsbcScOut = 1;
williamr@4
    64
williamr@4
    65
williamr@4
    66
/** In TUsbcScBuffer.iDirection, this indicates that the endpoint is an Bidirectional endpoint
williamr@4
    67
currently operating as an IN endpoint */
williamr@4
    68
const TInt KUsbcScBiIn = 2;
williamr@4
    69
/** In TUsbcScBuffer.iDirection, this indicates that the endpoint is an Bidirectional endpoint
williamr@4
    70
currently operating as an OUT endpoint */
williamr@4
    71
const TInt KUsbcScBiOut = 3;
williamr@4
    72
williamr@4
    73
/** The number of directions supported for endpoints, other then EP0.  Currently 2, IN and OUT. */
williamr@4
    74
const TInt KUsbcScDirections = 2;
williamr@4
    75
williamr@4
    76
/** In TUsbcScBuffer::iDirection, this indicates that the endpoint direction is Unknown. */
williamr@4
    77
const TInt KUsbcScUnknown = 4;
williamr@4
    78
williamr@4
    79
const TInt KPageSize = 0x1000;
williamr@4
    80
williamr@4
    81
/** The default buffer size requested for a endpoint, if the user app does not specify a size.*/
williamr@4
    82
const TInt KUsbcScDefaultBufferSize = 0x10000; // 64k
williamr@4
    83
williamr@4
    84
/** The size of the unmapped region of memory between endpoint buffers.
williamr@4
    85
This serves as a guard region, making memory over/under runs more obviose.*/
williamr@4
    86
const TInt KGuardSize = KPageSize;
williamr@4
    87
williamr@4
    88
/** The size put aside for the chunk header structre.*/
williamr@4
    89
const TInt KHeaderSize = KPageSize;
williamr@4
    90
williamr@4
    91
/** For buffers of size >= KUsbScBigBuffIs, The smallest unit of continiouse memory that will be used.
williamr@4
    92
No read will be set up smaller then this, to avoid overly fragmenting the data.
williamr@4
    93
*/
williamr@4
    94
const TInt KUsbSc_BigBuff_MinimumRamRun = KPageSize;
williamr@4
    95
williamr@4
    96
/** For buffers of size < KUsbScBigBuffIs, The smallest unit of continiouse memory that will be used.
williamr@4
    97
No read will be set up smaller then this, to avoid overly fragmenting the data.*/
williamr@4
    98
const TInt KUsbSc_SmallBuff_MinimumRamRun = 1024;
williamr@4
    99
williamr@4
   100
/** The size a buffer request has to be to switch to using KUsbSc_BigBuff_MinimumRamRun.
williamr@4
   101
If the requested buffer is smaller, then the smallest memory allocated to a buffer is KPageSize*/
williamr@4
   102
const TInt KUsbScBigBuffIs = KPageSize*6;
williamr@4
   103
williamr@4
   104
williamr@4
   105
williamr@4
   106
// EP0 is mapped manually, unlike the other endpoints.
williamr@4
   107
williamr@4
   108
/** The position, within the chunk, that the EP0 IN buffer appears*/
williamr@4
   109
const TInt KUsbScEP0InBufPos = 0x800;
williamr@4
   110
/** The position, within the chunk, that the EP0 IN buffer ends*/
williamr@4
   111
const TInt KUsbScEP0InBufEnd = KUsbScEP0InBufPos + 0x400;
williamr@4
   112
williamr@4
   113
// Its better for Out to go 2nd, so gaurd page after it.
williamr@4
   114
/** The position, within the chunk, that the EP0 OUT buffer appears*/
williamr@4
   115
const TInt KUsbScEP0OutBufPos = 0xc00;
williamr@4
   116
/** The position, within the chunk, that the EP0 OUT buffer ends*/
williamr@4
   117
const TInt KUsbScEP0OutBufEnd = KUsbScEP0OutBufPos + 0x400;
williamr@4
   118
williamr@4
   119
/** The number of the entry within the chunk BufferRecord table, for the OUT ep0 buffer.*/
williamr@4
   120
const TInt KUsbcScEp0OutBuff = 0;
williamr@4
   121
/** The number of the entry within the chunk BufferRecord table, for the IN ep0 buffer.*/
williamr@4
   122
const TInt KUsbcScEp0InBuff = 1;
williamr@4
   123
williamr@4
   124
williamr@4
   125
//
williamr@4
   126
//########################### Logical Device Driver (LDD) #############################
williamr@4
   127
//
williamr@4
   128
williamr@4
   129
/** USB LDD factory class.
williamr@4
   130
*/
williamr@4
   131
class DUsbcScLogDevice : public DLogicalDevice
williamr@4
   132
	{
williamr@4
   133
public:
williamr@4
   134
	DUsbcScLogDevice();
williamr@4
   135
	virtual TInt Install();
williamr@4
   136
	virtual void GetCaps(TDes8& aDes) const;
williamr@4
   137
	virtual TInt Create(DLogicalChannelBase*& aChannel);
williamr@4
   138
	};
williamr@4
   139
williamr@4
   140
williamr@4
   141
class DLddUsbcScChannel;
williamr@4
   142
class TUsbcScBuffer;
williamr@4
   143
/** Endpoint tracking for the LDD buffering etc.
williamr@4
   144
*/
williamr@4
   145
class TUsbcScEndpoint
williamr@4
   146
	{
williamr@4
   147
public:
williamr@4
   148
	TUsbcScEndpoint(DLddUsbcScChannel* aLDD, DUsbClientController* aController,
williamr@4
   149
				  const TUsbcScEndpointInfo* aEndpointInfo, TInt aEndpointNum
williamr@4
   150
				  );
williamr@4
   151
	~TUsbcScEndpoint();
williamr@4
   152
	TInt Construct();
williamr@4
   153
	void CancelTransfer(DThread* aThread);
williamr@4
   154
	void AbortTransfer();
williamr@4
   155
	inline TUsbcScEndpointInfo* EndpointInfo();
williamr@4
   156
	inline TInt RxBytesAvailable() const;
williamr@4
   157
	inline void ResetTransferInfo();
williamr@4
   158
	inline void SetClientReadPending(TBool aVal);
williamr@4
   159
	inline void SetClientWritePending(TBool aVal);
williamr@4
   160
	inline TBool ClientWritePending();
williamr@4
   161
	inline TBool ClientReadPending();
williamr@4
   162
	inline void SetRealEpNumber(TInt aRealEpNumber);
williamr@4
   163
	inline TInt RealEpNumber() const;
williamr@4
   164
	inline TInt EpNumber() const;
williamr@4
   165
	inline void StartBuffer();
williamr@4
   166
	inline void SetBuffer(TUsbcScBuffer* aBuffer);
williamr@4
   167
	inline TUsbcScBuffer* GetBuffer();
williamr@4
   168
williamr@4
   169
williamr@4
   170
private:
williamr@4
   171
	static void RequestCallback(TAny* aTUsbcScEndpoint);
williamr@4
   172
	void TxComplete();
williamr@4
   173
	TInt RxComplete(TBool aReEntrant);
williamr@4
   174
	void RxCompleteNow();
williamr@4
   175
williamr@4
   176
williamr@4
   177
williamr@4
   178
public:
williamr@4
   179
	TUsbcRequestCallback* iRequestCallbackInfo;
williamr@4
   180
williamr@4
   181
private:
williamr@4
   182
	DUsbClientController* iController;
williamr@4
   183
	TUsbcScEndpointInfo iEndpointInfo;
williamr@4
   184
	TBool iClientReadPending;
williamr@4
   185
	TBool iClientWritePending;
williamr@4
   186
	TInt iEndpointNumber;
williamr@4
   187
	TInt iRealEpNumber;
williamr@4
   188
	DLddUsbcScChannel* iLdd;
williamr@4
   189
	TInt iError;
williamr@4
   190
	TUint32 iBytesTransferred;
williamr@4
   191
	TInt iBandwidthPriority;
williamr@4
   192
	TUsbcScBuffer* iBuffer;
williamr@4
   193
williamr@4
   194
	};
williamr@4
   195
williamr@4
   196
williamr@4
   197
/** Linked list of 'alternate setting' info for use by the LDD.
williamr@4
   198
*/
williamr@4
   199
class TUsbcScAlternateSetting
williamr@4
   200
	{
williamr@4
   201
public:
williamr@4
   202
	TUsbcScAlternateSetting();
williamr@4
   203
	~TUsbcScAlternateSetting();
williamr@4
   204
williamr@4
   205
public:
williamr@4
   206
	TUsbcScAlternateSetting* iNext;
williamr@4
   207
	TUsbcScAlternateSetting* iPrevious;
williamr@4
   208
	TInt iNumberOfEndpoints;
williamr@4
   209
	TUint iSetting;
williamr@4
   210
	TUsbcScEndpoint* iEndpoint[KMaxEndpointsPerClient + 1];
williamr@4
   211
	};
williamr@4
   212
williamr@4
   213
class TUsbcScAlternateSettingList
williamr@4
   214
	{
williamr@4
   215
public:
williamr@4
   216
	TUsbcScAlternateSettingList();
williamr@4
   217
	~TUsbcScAlternateSettingList();
williamr@4
   218
williamr@4
   219
public:
williamr@4
   220
	TUsbcScAlternateSetting* iHead;
williamr@4
   221
	TUsbcScAlternateSetting* iTail;
williamr@4
   222
	};
williamr@4
   223
williamr@4
   224
class TUsbcScChunkInfo
williamr@4
   225
	{
williamr@4
   226
public:
williamr@4
   227
	TUsbcScChunkInfo(DLogicalDevice* aLdd);
williamr@4
   228
	TInt CreateChunk(TInt aTotalSize);
williamr@4
   229
	void Close();
williamr@4
   230
	TInt ChunkAlloc(TInt aOffset, TInt aSize);
williamr@4
   231
	void ChunkCleanup();
williamr@4
   232
	TInt GetPhysical(TInt aOffset, TPhysAddr* aPhysical);
williamr@4
   233
	static TInt New(TUsbcScChunkInfo*& aChunk, TInt aSize, DLogicalDevice* aLdd);
williamr@4
   234
private:
williamr@4
   235
	TUint* iPhysicalMap;
williamr@4
   236
public:
williamr@4
   237
	DChunk* iChunk;
williamr@4
   238
	TDfc iCleanup;
williamr@4
   239
williamr@4
   240
	TInt8 iPageNtz; // Number of trailing zeros for a page. (Eg 4k page has 12 t.z.)
williamr@4
   241
	TInt iAllocatedSize;
williamr@4
   242
	TInt8* iChunkMem;
williamr@4
   243
	TUint32 iChunkMapAttr;
williamr@4
   244
	DLogicalDevice* iLdd;
williamr@4
   245
	};
williamr@4
   246
williamr@4
   247
williamr@4
   248
// Used to represent a matrix of endpoints with a column of sizes.
williamr@4
   249
// Used by TRealizeInfo
williamr@4
   250
williamr@4
   251
class TEndpointSortBufs
williamr@4
   252
	{
williamr@4
   253
	public:
williamr@4
   254
		TUsbcScEndpoint** iEp;
williamr@4
   255
		TInt* iSizes;
williamr@4
   256
		TInt iEps;
williamr@4
   257
	};
williamr@4
   258
williamr@4
   259
// This is used to calculate the layout of the shared chunk
williamr@4
   260
// based on a list of alternative settings / endpoints provided.
williamr@4
   261
 
williamr@4
   262
class TRealizeInfo
williamr@4
   263
	{
williamr@4
   264
	public:
williamr@4
   265
		void Init(TUsbcScAlternateSettingList* aAlternateSettingList);
williamr@4
   266
		TInt CopyAndSortEndpoints();
williamr@4
   267
		void CalcBuffSizes();
williamr@4
   268
		void Free();
williamr@4
   269
williamr@4
   270
		void LayoutChunkHeader(TUsbcScChunkInfo* aChunkInfo);
williamr@4
   271
	public:
williamr@4
   272
		TInt iMaxEndpoints;
williamr@4
   273
		TInt iTotalSize;
williamr@4
   274
		TInt iTotalBuffers;
williamr@4
   275
		TInt iAltSettings;
williamr@4
   276
		TEndpointSortBufs iBufs[KUsbcScDirections];
williamr@4
   277
		TUsbcScAlternateSettingList* iAlternateSettingList;
williamr@4
   278
williamr@4
   279
		// Chunk layout info.
williamr@4
   280
		TUsbcScChunkBuffersHeader* iChunkStuct;
williamr@4
   281
		TUsbcScChunkAltSettingHeader* iAltSettingsTbl;
williamr@4
   282
	};
williamr@4
   283
williamr@4
   284
williamr@4
   285
williamr@4
   286
/** The channel class - the actual USB LDD.
williamr@4
   287
*/
williamr@4
   288
class DLddUsbcScChannel : public DLogicalChannel
williamr@4
   289
	{
williamr@4
   290
public:
williamr@4
   291
	DLddUsbcScChannel();
williamr@4
   292
	~DLddUsbcScChannel();
williamr@4
   293
	virtual void HandleMsg(TMessageBase* aMsg);
williamr@4
   294
	virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
williamr@4
   295
	virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
williamr@4
   296
	inline DThread* Client() const {return iClient;}
williamr@4
   297
	inline TBool ChannelClosing() const {return iChannelClosing;}
williamr@4
   298
	inline TUint AlternateSetting() const {return iAlternateSetting;}
williamr@4
   299
	
williamr@4
   300
	static void RequestCallbackEp0(TAny* aTUsbcScChannel);
williamr@4
   301
williamr@4
   302
private:
williamr@4
   303
williamr@4
   304
	TInt DoCancel(TInt aReqNo, TUint aMask, TUint a1);
williamr@4
   305
	TInt DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
williamr@4
   306
	TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
williamr@4
   307
	TInt DoReadDataNotify(TRequestStatus* aStatus, TInt aBufferNum, TInt aLength);
williamr@4
   308
	void StartDataRead(TInt aBufferNum);
williamr@4
   309
	TInt DoWriteData(TRequestStatus* aStatus,TInt aBufferNum, TUint aStart, TUint aLength, TUint aFlags);
williamr@4
   310
	TBool AlternateDeviceStateTestComplete();
williamr@4
   311
	TInt SetInterface(TInt aInterfaceNum, TUsbcScIfcInfo* aUserInterfaceInfoBuf);
williamr@4
   312
	void StartEpReads();
williamr@4
   313
	void DestroyAllInterfaces();
williamr@4
   314
	void DestroyInterface(TUint aInterface);
williamr@4
   315
	void DestroyEp0();
williamr@4
   316
	inline TBool ValidEndpoint(TInt aEndpoint);
williamr@4
   317
	TInt GetRealEpForEpResource(TInt aEndpoint, TInt& aRealEp);
williamr@4
   318
	inline TBool Configured();
williamr@4
   319
	TInt DoEmergencyComplete();
williamr@4
   320
	void ReadDes8(const TAny* aPtr, TDes8& aDes);
williamr@4
   321
	TInt SetupEp0();
williamr@4
   322
	void CancelNotifyEndpointStatus();
williamr@4
   323
	void CancelNotifyOtgFeatures();
williamr@4
   324
	static void StatusChangeCallback(TAny* aDLddUsbcChannel);
williamr@4
   325
	static void EndpointStatusChangeCallback(TAny* aDLddUsbcChannel);
williamr@4
   326
	static void OtgFeatureChangeCallback(TAny* aDLddUsbcChannel);
williamr@4
   327
	static void EmergencyCompleteDfc(TAny* aDLddUsbcChannel);
williamr@4
   328
	void DeConfigure(TInt aErrorCode);
williamr@4
   329
	TInt SelectAlternateSetting(TUint aAlternateSetting);
williamr@4
   330
	TInt EpFromAlternateSetting(TUint aAlternateSetting, TInt aEndpoint);
williamr@4
   331
	TInt ProcessAlternateSetting(TUint aAlternateSetting);
williamr@4
   332
	TInt32 StartNextInAlternateSetting();
williamr@4
   333
	TInt ProcessDeviceState(TUsbcDeviceState aDeviceState);
williamr@4
   334
	void ResetInterface(TInt aErrorCode);
williamr@4
   335
	void PanicClientThread(TInt aReason);
williamr@4
   336
williamr@4
   337
	TInt RealizeInterface(void);
williamr@4
   338
williamr@4
   339
private:
williamr@4
   340
	DUsbClientController* iController;
williamr@4
   341
	DThread* iClient;
williamr@4
   342
	TBool iValidInterface;
williamr@4
   343
	
williamr@4
   344
	TUsbcScAlternateSettingList* iAlternateSettingList;
williamr@4
   345
	TUsbcScEndpoint** iEndpoint;  // Pointer to the current endpoint set.
williamr@4
   346
williamr@4
   347
	static const TInt KUsbcMaxRequests = RDevUsbcScClient::ERequestMaxRequests;
williamr@4
   348
	TRequestStatus* iRequestStatus[KUsbcMaxRequests];
williamr@4
   349
	TUsbcClientCallback iCompleteAllCallbackInfo;
williamr@4
   350
	TAny* iStatusChangePtr;
williamr@4
   351
	TUsbcStatusCallback iStatusCallbackInfo;
williamr@4
   352
	TAny* iEndpointStatusChangePtr;
williamr@4
   353
	TUsbcEndpointStatusCallback iEndpointStatusCallbackInfo;
williamr@4
   354
	TAny* iOtgFeatureChangePtr;
williamr@4
   355
	TUsbcOtgFeatureCallback iOtgFeatureCallbackInfo;
williamr@4
   356
	TUint8* iBufferBaseEp0;
williamr@4
   357
	TInt iBufferSizeEp0;
williamr@4
   358
	TInt iNumberOfEndpoints;
williamr@4
   359
	TUsbcDeviceState iDeviceState;
williamr@4
   360
	TUsbcDeviceState iOldDeviceState;
williamr@4
   361
	TBool iOwnsDeviceControl;
williamr@4
   362
	TUint16 iAlternateSetting;
williamr@4
   363
	TUint16 iAsSeq;
williamr@4
   364
williamr@4
   365
	TUsbcDeviceStatusQueue* iStatusFifo;
williamr@4
   366
	TBool iUserKnowsAltSetting;
williamr@4
   367
	TBool iDeviceStatusNeeded;
williamr@4
   368
	TBool iChannelClosing;
williamr@4
   369
	TBool iRealizeCalled;
williamr@4
   370
williamr@4
   371
	TUsbcScChunkInfo* iChunkInfo;
williamr@4
   372
	TInt iNumBuffers;
williamr@4
   373
	TUsbcScBuffer *iBuffers;
williamr@4
   374
williamr@4
   375
	TUsbcScEndpoint* iEp0Endpoint;
williamr@4
   376
	TInt iEP0InBuff;
williamr@4
   377
	TInt iEP0OutBuff;
williamr@4
   378
williamr@4
   379
	friend class TUsbcScBuffer;
williamr@4
   380
	friend void TUsbcScEndpoint::AbortTransfer();
williamr@4
   381
	};
williamr@4
   382
williamr@4
   383
/**
williamr@4
   384
This class is used by TUsbcScStatusList to form a queue of status requests.
williamr@4
   385
These requests are on a buffer basis, so that all buffers can have at least two requests
williamr@4
   386
pending, at the same time. (i.e. buffer 1 could have two requests outstanding, as well as 2 on buffer 2.)
williamr@4
   387
*/
williamr@4
   388
williamr@4
   389
class TUsbcScStatusElement
williamr@4
   390
{
williamr@4
   391
public:
williamr@4
   392
	TRequestStatus* iStatus;
williamr@4
   393
	TInt iLength;
williamr@4
   394
	TUint iStart;
williamr@4
   395
	TUint iFlags;	
williamr@4
   396
};
williamr@4
   397
williamr@4
   398
enum TUsbcScStatusState
williamr@4
   399
{
williamr@4
   400
	ENotRunning,
williamr@4
   401
	EInProgress,
williamr@4
   402
	EReadingAhead,
williamr@4
   403
	EFramgementInProgress
williamr@4
   404
};
williamr@4
   405
williamr@4
   406
class TUsbcScStatusList
williamr@4
   407
{
williamr@4
   408
public:
williamr@4
   409
	TInt Construct(TInt aSize, DThread* aThread);
williamr@4
   410
	void Destroy();
williamr@4
   411
williamr@4
   412
	TUsbcScStatusElement* Next();
williamr@4
   413
	void Pop();
williamr@4
   414
	TInt Add(TRequestStatus* aStatus, TInt aLength, TUint aStart, TUint aFlags);
williamr@4
   415
	void CancelQueued(TInt aErrorCode=KErrCancel);
williamr@4
   416
	TInt Complete(TInt aError);
williamr@4
   417
	void Complete();
williamr@4
   418
public:
williamr@4
   419
	TUsbcScStatusState iState;
williamr@4
   420
williamr@4
   421
private:
williamr@4
   422
	DThread* iClient;
williamr@4
   423
	TInt iHead;   // The element at the head of the queue, ie, the earliest added, and next to be removed.
williamr@4
   424
	TInt iLength; // Length of queue, ie number of elements within
williamr@4
   425
	TInt iSize;   // size of array, ie, max # of requests at a time.
williamr@4
   426
	TUsbcScStatusElement* iElements;
williamr@4
   427
williamr@4
   428
};
williamr@4
   429
williamr@4
   430
williamr@4
   431
williamr@4
   432
/**
williamr@4
   433
This class holds the kernel's copy of all the details related to a shared endpoint buffer,
williamr@4
   434
and provides methods for the LDD to manipulate it.
williamr@4
   435
*/
williamr@4
   436
class TUsbcScBuffer
williamr@4
   437
{
williamr@4
   438
public:
williamr@4
   439
	static const TInt8 KNoEpAssigned=0;
williamr@4
   440
	static const TInt8 KEpIsEnding=1;
williamr@4
   441
	static const TInt8 KEpIsStarting=2;
williamr@4
   442
williamr@4
   443
public:
williamr@4
   444
	TInt Construct(TInt aDirection, DLddUsbcScChannel* aLdd, TInt aBufferOffset, TInt aBufferEndOffset, TInt aMinReadSize, TInt aMaxPacketSize, TInt aMaxReadSize);
williamr@4
   445
	void CreateChunkBufferHeader();
williamr@4
   446
	void StartEndpoint(TUsbcRequestCallback* iRequestInfo, TUint iFlags);
williamr@4
   447
williamr@4
   448
	void Destroy();
williamr@4
   449
williamr@4
   450
	TInt StartDataRead();
williamr@4
   451
	void CompleteRead(TBool aStartNextRead=ETrue);
williamr@4
   452
	void PopStall();
williamr@4
   453
	void StartDataWrite();
williamr@4
   454
	void CompleteWrite();
williamr@4
   455
	void Cancel(TInt aErrorCode);
williamr@4
   456
williamr@4
   457
	void UpdateBufferList(TInt aByteCount,TUint aFlags, TBool aStartNextRead=ETrue);
williamr@4
   458
	void Ep0CancelLddRead();
williamr@4
   459
	void SendEp0StatusPacket(TInt aState);
williamr@4
   460
williamr@4
   461
public:
williamr@4
   462
	
williamr@4
   463
	TInt8 iDirection;
williamr@4
   464
	TInt8 iMode;
williamr@4
   465
	TInt8 iNeedsPacket;
williamr@4
   466
	TInt8 iReserved;
williamr@4
   467
	DLddUsbcScChannel* iLdd;
williamr@4
   468
	TLinAddr iChunkAddr;
williamr@4
   469
	SUsbcScBufferHeader* iBufferStart;
williamr@4
   470
	TUint iBufferEnd; // One word on from the last word in the buffer.
williamr@4
   471
	TUint iAlignMask;
williamr@4
   472
	TUsbcScStatusList iStatusList;
williamr@4
   473
	TUsbcRequestCallback* iCallback;
williamr@4
   474
	union 
williamr@4
   475
	{
williamr@4
   476
		TInt iHead; // Out endpoints only;
williamr@4
   477
		TUint iSent; // In endpoints only
williamr@4
   478
	};
williamr@4
   479
	TUsbcScChunkInfo* iChunkInfo;
williamr@4
   480
	TInt iMinReadSize;
williamr@4
   481
	TInt iMaxReadSize;
williamr@4
   482
	TInt iMaxPacketSize;  // 0 indicates unconfiured.
williamr@4
   483
	TInt iFirstPacket;
williamr@4
   484
	TInt iStalled;
williamr@4
   485
williamr@4
   486
	// needed for backwards compatibility
williamr@4
   487
	TUsbcPacketArray iIndexArray[KUsbcDmaBufNumMax]; // Has 2 elements
williamr@4
   488
	TUsbcPacketArray iSizeArray[KUsbcDmaBufNumMax];  // Has 2 elements
williamr@4
   489
#ifdef _DEBUG
williamr@4
   490
	TUint iSequence;
williamr@4
   491
#endif
williamr@4
   492
williamr@4
   493
};
williamr@4
   494
williamr@4
   495
williamr@4
   496
williamr@4
   497
#include <drivers/usbcsc.inl>
williamr@4
   498
williamr@4
   499
#endif	// __USBCSC_H__