usbdrv/peripheral/public/usbc.h
author hgs
Wed, 03 Nov 2010 10:49:35 +0800
changeset 63 705964cc7132
parent 59 bbdce6bffaad
permissions -rw-r--r--
201043_01
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     1
/*
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     3
* All rights reserved.
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     4
* This component and the accompanying materials are made available
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     6
* which accompanies this distribution, and is available
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     8
*
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
     9
* Initial Contributors:
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    10
* Nokia Corporation - initial contribution.
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    11
*
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    12
* Contributors:
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    13
*
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    14
* Description:
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    15
* e32/include/drivers/usbc.h
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    16
* Kernel side definitions for the USB Device driver stack (PIL + LDD).
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    17
*
bbdce6bffaad 201041_02
hgs
parents: 48
diff changeset
    18
*/
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
    19
089413cdde3c 201028_02
hgs
parents:
diff changeset
    20
/**
089413cdde3c 201028_02
hgs
parents:
diff changeset
    21
 @file usbc.h
089413cdde3c 201028_02
hgs
parents:
diff changeset
    22
 @internalTechnology
089413cdde3c 201028_02
hgs
parents:
diff changeset
    23
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    24
089413cdde3c 201028_02
hgs
parents:
diff changeset
    25
#ifndef __USBC_H__
089413cdde3c 201028_02
hgs
parents:
diff changeset
    26
#define __USBC_H__
089413cdde3c 201028_02
hgs
parents:
diff changeset
    27
089413cdde3c 201028_02
hgs
parents:
diff changeset
    28
#include <kernel/kernel.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    29
#include <kernel/kern_priv.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    30
#include <kernel/kpower.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    31
#include <platform.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    32
089413cdde3c 201028_02
hgs
parents:
diff changeset
    33
#include <usb/d32usbc.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    34
089413cdde3c 201028_02
hgs
parents:
diff changeset
    35
//#include <drivers/usbcshared.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    36
#include <usb/usbcshared.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    37
089413cdde3c 201028_02
hgs
parents:
diff changeset
    38
089413cdde3c 201028_02
hgs
parents:
diff changeset
    39
089413cdde3c 201028_02
hgs
parents:
diff changeset
    40
/** LDD Major version, This should agree with the information in RDevUsbcClient::TVer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    41
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    42
const TInt KUsbcMajorVersion = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    43
089413cdde3c 201028_02
hgs
parents:
diff changeset
    44
/** LDD Minor version, This should agree with the information in RDevUsbcClient::TVer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    45
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    46
const TInt KUsbcMinorVersion = 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    47
089413cdde3c 201028_02
hgs
parents:
diff changeset
    48
/** LDD Build version, This should agree with the information in RDevUsbcClient::TVer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    49
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    50
const TInt KUsbcBuildVersion = KE32BuildVersionNumber;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    51
089413cdde3c 201028_02
hgs
parents:
diff changeset
    52
/** Must correspond to the max enum of TRequest + 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    53
    currently this is ERequestOtgFeaturesNotify = 10.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    54
*/
48
21625e5de155 201035_01
hgs
parents: 33
diff changeset
    55
const TInt KUsbcMaxRequests = 12;
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
    56
089413cdde3c 201028_02
hgs
parents:
diff changeset
    57
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
    58
//########################### Logical Device Driver (LDD) #############################
089413cdde3c 201028_02
hgs
parents:
diff changeset
    59
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
    60
089413cdde3c 201028_02
hgs
parents:
diff changeset
    61
/** USB LDD factory class.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    62
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    63
class DUsbcLogDevice : public DLogicalDevice
089413cdde3c 201028_02
hgs
parents:
diff changeset
    64
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    65
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    66
    DUsbcLogDevice();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    67
    virtual TInt Install();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    68
    virtual void GetCaps(TDes8& aDes) const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    69
    virtual TInt Create(DLogicalChannelBase*& aChannel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    70
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
    71
089413cdde3c 201028_02
hgs
parents:
diff changeset
    72
089413cdde3c 201028_02
hgs
parents:
diff changeset
    73
/** OUT buffering is a collection of flat buffers. Each is either fillable or drainable.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    74
    When one buffer becomes full (notified by the PIL) it is marked as not-fillable and the next
089413cdde3c 201028_02
hgs
parents:
diff changeset
    75
    fillable buffer is used. When the buffer has finished draining it is marked as fillable.
089413cdde3c 201028_02
hgs
parents:
diff changeset
    76
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    77
class TDmaBuf
089413cdde3c 201028_02
hgs
parents:
diff changeset
    78
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    79
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
    80
    TDmaBuf();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    81
     TDmaBuf(TUsbcEndpointInfo* aEndpointInfo, TInt aBandwidthPriority);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    82
    ~TDmaBuf();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    83
    TInt Construct(TUsbcEndpointInfo* aEndpointInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    84
    TInt BufferTotalSize() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    85
    TInt BufferSize() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    86
    TInt SetBufferAddr(TInt aBufInd, TUint8* aBufAddr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    87
    TInt BufferNumber() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    88
    void SetMaxPacketSize(TInt aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    89
    void Flush();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    90
    // Rx (OUT) variants
089413cdde3c 201028_02
hgs
parents:
diff changeset
    91
    void RxSetActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    92
    void RxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    93
    TBool RxIsActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    94
    TBool IsReaderEmpty();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    95
    void ReadXferComplete(TInt aNoBytesRx, TInt aNoPacketsRx, TInt aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    96
    TInt RxCopyDataToClient(DThread* aThread, TClientBuffer *aTcb, TInt aLength, TUint32& aDestOffset,
089413cdde3c 201028_02
hgs
parents:
diff changeset
    97
                            TBool aRUS, TBool& aCompleteNow);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    98
    TInt RxCopyPacketToClient(DThread* aThread,TClientBuffer *aTcb, TInt aLength);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    99
    TInt RxGetNextXfer(TUint8*& aBufferAddr, TUsbcPacketArray*& aIndexArray, TUsbcPacketArray*& aSizeArray,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   100
                       TInt& aLength, TPhysAddr& aBufferPhys);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   101
    TBool RxIsEnoughSpace(TInt aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   102
    inline TInt RxBytesAvailable() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   103
    inline void IncrementBufferIndex(TInt& aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   104
    inline TInt NoRxPackets() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   105
    TInt SetDrainable(TInt aBufferNum);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   106
    // Tx (IN) variants
089413cdde3c 201028_02
hgs
parents:
diff changeset
   107
    void TxSetActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   108
    void TxSetInActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   109
    TBool TxIsActive();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   110
    TInt TxStoreData(DThread* aThread,TClientBuffer *aTcb, TInt aTxLength, TUint32 aBufferOffset);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   111
    TInt TxGetNextXfer(TUint8*& aBufferAddr, TInt& aTxLength, TPhysAddr& aBufferPhys);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   112
    TBool ShortPacketExists();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   113
089413cdde3c 201028_02
hgs
parents:
diff changeset
   114
#if defined(USBC_LDD_BUFFER_TRACE)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   115
    TInt NoRxPacketsAlt() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   116
    TInt NoRxBytesAlt() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   117
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
   118
089413cdde3c 201028_02
hgs
parents:
diff changeset
   119
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   120
    TBool AdvancePacket();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   121
    inline TInt GetCurrentError();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   122
    TBool NextDrainableBuffer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   123
    TBool NextFillableBuffer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   124
    void FreeDrainedBuffers();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   125
    TInt PeekNextPacketSize();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   126
    TInt PeekNextDrainableBuffer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   127
    void ModifyTotalRxBytesAvail(TInt aVal);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   128
    void ModifyTotalRxPacketsAvail(TInt aVal);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   129
    void AddToDrainQueue(TInt aBufferIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   130
    inline TInt CopyToUser(DThread* aThread, const TUint8* aSourceAddr, TInt aLength,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   131
                           TClientBuffer *aTcb, TUint32& aDestOffset);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   132
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   133
    TInt iExtractOffset;                                    // offset into current packet for data read
089413cdde3c 201028_02
hgs
parents:
diff changeset
   134
    TInt iMaxPacketSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   135
    TInt iNumberofBuffers;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   136
    TInt iBufSz;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   137
    TBool iRxActive;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   138
    TBool iTxActive;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   139
    TInt iTotalRxBytesAvail;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   140
    TInt iTotalRxPacketsAvail;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   141
    //
089413cdde3c 201028_02
hgs
parents:
diff changeset
   142
    TUint8* iBufBasePtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   143
    TUint8* iCurrentDrainingBuffer;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   144
    TInt iCurrentDrainingBufferIndex;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   145
    TInt iCurrentFillingBufferIndex;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   146
    TUint iCurrentPacket;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   147
    TUsbcPacketArray* iCurrentPacketIndexArray;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   148
    TUsbcPacketArray* iCurrentPacketSizeArray;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   149
    TUint8* iBuffers[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   150
    TBool iDrainable[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   151
    TUsbcPacketArray iPacketInfoStorage[KUsbcDmaBufNumMax * KUsbcDmaBufNumArrays * KUsbcDmaBufMaxPkts];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   152
    TUsbcPacketArray* iPacketIndex[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   153
    TUsbcPacketArray* iPacketSize[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   154
    TUint iNumberofBytesRx[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   155
    TUint iNumberofPacketsRx[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   156
    TInt iError[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   157
    TPhysAddr iBufferPhys[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   158
    TBool iCanBeFreed[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   159
    TInt iDrainQueue[KUsbcDmaBufNumMax + 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   160
    TInt iDrainQueueIndex;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   161
    TUint iEndpointType;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   162
089413cdde3c 201028_02
hgs
parents:
diff changeset
   163
#if defined(USBC_LDD_BUFFER_TRACE)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   164
    TInt iFillingOrder;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   165
    TInt iFillingOrderArray[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   166
    TInt iDrainingOrder;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   167
     TUint iNumberofBytesRxRemain[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   168
     TUint iNumberofPacketsRxRemain[KUsbcDmaBufNumMax];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   169
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
   170
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   171
089413cdde3c 201028_02
hgs
parents:
diff changeset
   172
089413cdde3c 201028_02
hgs
parents:
diff changeset
   173
class DLddUsbcChannel;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   174
089413cdde3c 201028_02
hgs
parents:
diff changeset
   175
/** Endpoint tracking for the LDD buffering etc.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   176
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
   177
class TUsbcEndpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
   178
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   179
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   180
    TUsbcEndpoint();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   181
    TUsbcEndpoint(DLddUsbcChannel* aLDD, DUsbClientController* aController,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   182
                  const TUsbcEndpointInfo* aEndpointInfo, TInt aEndpointNum,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   183
                  TInt aBandwidthPriority);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   184
    ~TUsbcEndpoint();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   185
    TInt Construct();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   186
    TInt TryToStartRead(TBool aReEntrant);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   187
    TInt TryToStartWrite(TEndpointTransferInfo* pTfr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   188
    TInt CopyToClient(DThread* aThread, TClientBuffer *aTcb);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   189
    TInt CopyToClient(DThread* aClient, TBool& aCompleteNow, TClientBuffer *aTcb);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   190
    TInt ContinueWrite();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   191
    void SetMaxPacketSize(TInt aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   192
    void CancelTransfer(DThread* aThread, TClientBuffer *aTcb);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   193
    void AbortTransfer();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   194
    inline TUsbcEndpointInfo* EndpointInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   195
    inline TInt RxBytesAvailable() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   196
089413cdde3c 201028_02
hgs
parents:
diff changeset
   197
    inline TInt BufferSize() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   198
    inline TInt SetBufferAddr( TInt aBufInd, TUint8* aAddr);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   199
    inline TInt BufferNumber() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   200
089413cdde3c 201028_02
hgs
parents:
diff changeset
   201
    inline void SetTransferInfo(TEndpointTransferInfo* aTransferInfo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   202
    inline void ResetTransferInfo();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   203
    inline void SetClientReadPending(TBool aVal);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   204
    inline void SetClientWritePending(TBool aVal);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   205
    inline TBool ClientWritePending();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   206
    inline TBool ClientReadPending();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   207
    inline void SetRealEpNumber(TInt aRealEpNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   208
    inline TInt RealEpNumber() const;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   209
089413cdde3c 201028_02
hgs
parents:
diff changeset
   210
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   211
    TDmaBuf* iDmaBuffers;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   212
089413cdde3c 201028_02
hgs
parents:
diff changeset
   213
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   214
    static void RequestCallback(TAny* aTUsbcEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   215
    void TxComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   216
    TInt RxComplete(TBool aReEntrant);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   217
    void RxCompleteNow();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   218
    TInt EndpointComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   219
089413cdde3c 201028_02
hgs
parents:
diff changeset
   220
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   221
    DUsbClientController* iController;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   222
    TUsbcEndpointInfo iEndpointInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   223
    TEndpointTransferInfo iTransferInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   224
    TBool iClientReadPending;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   225
    TBool iClientWritePending;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   226
    TInt iEndpointNumber;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   227
    TInt iRealEpNumber;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   228
    DLddUsbcChannel* iLdd;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   229
    TInt iError;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   230
    TUsbcRequestCallback* iRequestCallbackInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   231
    TUint32 iBytesTransferred;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   232
    TInt iBandwidthPriority;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   233
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   234
089413cdde3c 201028_02
hgs
parents:
diff changeset
   235
089413cdde3c 201028_02
hgs
parents:
diff changeset
   236
/** Linked list of 'alternate setting' info for use by the LDD.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   237
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
   238
class TUsbcAlternateSettingList
089413cdde3c 201028_02
hgs
parents:
diff changeset
   239
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   240
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   241
    TUsbcAlternateSettingList();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   242
    ~TUsbcAlternateSettingList();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   243
089413cdde3c 201028_02
hgs
parents:
diff changeset
   244
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   245
    TUsbcAlternateSettingList* iNext;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   246
    TInt iNumberOfEndpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   247
    TUint iSetting;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   248
    TInt iEpNumDeOrderedByBufSize[KMaxEndpointsPerClient + 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   249
    TUsbcEndpoint* iEndpoint[KMaxEndpointsPerClient + 1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   250
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   251
089413cdde3c 201028_02
hgs
parents:
diff changeset
   252
089413cdde3c 201028_02
hgs
parents:
diff changeset
   253
struct TClientAsynchNotify
089413cdde3c 201028_02
hgs
parents:
diff changeset
   254
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   255
        TClientBufferRequest *iBufferRequest;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   256
        TClientBuffer *iClientBuffer;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   257
        void Reset();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   258
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   259
/** The channel class - the actual USB LDD.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   260
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
   261
class DLddUsbcChannel : public DLogicalChannel
089413cdde3c 201028_02
hgs
parents:
diff changeset
   262
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   263
public:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   264
    DLddUsbcChannel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   265
    ~DLddUsbcChannel();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   266
    virtual TInt SendMsg(TMessageBase * aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   267
    TInt PreSendRequest(TMessageBase * aMsg,TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   268
    TInt SendControl(TMessageBase* aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   269
    virtual void HandleMsg(TMessageBase* aMsg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   270
    virtual TInt DoCreate(TInt aUnit, const TDesC8* aInfo, const TVersion& aVer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   271
    virtual TInt RequestUserHandle(DThread* aThread, TOwnerType aType);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   272
    TInt DoRxComplete(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint, TBool aReentrant);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   273
    void DoRxCompleteNow(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   274
    void DoTxComplete(TUsbcEndpoint* aTUsbcEndpoint, TInt aEndpoint, TInt aError);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   275
    inline DThread* Client() const {return iClient;}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   276
    inline TBool ChannelClosing() const {return iChannelClosing;}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   277
    inline TUint AlternateSetting() const {return iAlternateSetting;}
089413cdde3c 201028_02
hgs
parents:
diff changeset
   278
    TClientBuffer *GetClientBuffer(TInt aEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   279
089413cdde3c 201028_02
hgs
parents:
diff changeset
   280
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   281
    TInt DoCancel(TInt aReqNo);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   282
    void DoRequest(TInt aReqNo, TRequestStatus* aStatus, TAny* a1, TAny* a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   283
    TInt DoControl(TInt aFunction, TAny* a1, TAny* a2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   284
    TInt DoTransferAsyncReq(TInt aEndpointNum, TAny* a1, TAny* a2, TBool& aNeedsCompletion);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   285
    TInt DoOtherAsyncReq(TInt aReqNo, TAny* a1, TAny* a2, TBool& aNeedsCompletion);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   286
    TBool AlternateDeviceStateTestComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   287
    TInt SetInterface(TInt aInterfaceNum, TUsbcIfcInfo* aUserInterfaceInfoBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   288
    void StartEpReads();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   289
    void DestroyAllInterfaces();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   290
    void DestroyInterface(TUint aInterface);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   291
    void DestroyEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   292
    inline TBool ValidEndpoint(TInt aEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   293
    TInt DoEmergencyComplete();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   294
    void ReadDes8(const TAny* aPtr, TDes8& aDes);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   295
    TInt SetupEp0();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   296
    DPlatChunkHw* ReAllocate(TInt aBuffersize, DPlatChunkHw* aHwChunk, TUint32 aCacheAttribs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   297
    DPlatChunkHw* Allocate(TInt aBuffersize, TUint32 aCacheAttribs);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   298
    void ClosePhysicalChunk(DPlatChunkHw* &aHwChunk);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   299
    void CancelNotifyEndpointStatus();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   300
    void CancelNotifyOtgFeatures();
48
21625e5de155 201035_01
hgs
parents: 33
diff changeset
   301
	void CancelNotifyChargerType();
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
   302
    static void StatusChangeCallback(TAny* aDLddUsbcChannel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   303
    static void EndpointStatusChangeCallback(TAny* aDLddUsbcChannel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   304
    static void OtgFeatureChangeCallback(TAny* aDLddUsbcChannel);
48
21625e5de155 201035_01
hgs
parents: 33
diff changeset
   305
    static void ChargerTypeChangeCallback(TAny* aDLddUsbcChannel);
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
   306
    static void EmergencyCompleteDfc(TAny* aDLddUsbcChannel);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   307
    void DeConfigure(TInt aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   308
    TInt SelectAlternateSetting(TUint aAlternateSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   309
    TInt EpFromAlternateSetting(TUint aAlternateSetting, TInt aEndpoint);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   310
    TInt ProcessAlternateSetting(TUint aAlternateSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   311
    TInt ProcessDeviceState(TUsbcDeviceState aDeviceState);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   312
    void ResetInterface(TInt aErrorCode);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   313
    void AbortInterface();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   314
    // Set buffer address of the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
   315
    void ReSetInterfaceMemory(TUsbcAlternateSettingList* aAlternateSettingListRec,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   316
            RArray<DPlatChunkHw*> &aHwChunks );
089413cdde3c 201028_02
hgs
parents:
diff changeset
   317
    void UpdateEndpointSizes();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   318
    // Check and alloc memory for the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
   319
    TInt SetupInterfaceMemory(RArray<DPlatChunkHw*> &aHwChunks, 
089413cdde3c 201028_02
hgs
parents:
diff changeset
   320
            TUint32 aCacheAttribs );
089413cdde3c 201028_02
hgs
parents:
diff changeset
   321
    void PanicClientThread(TInt aReason);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   322
    TInt PinMemory(TDesC8 *aDes, TVirtualPinObject *iPinObj); //Descriptor pinning helper.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   323
    void CompleteBufferRequest(DThread* aThread, TInt aReqNo, TInt aReason);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   324
private:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   325
    DUsbClientController* iController;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   326
    DThread* iClient;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   327
    TBool iValidInterface;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   328
    TUsbcAlternateSettingList* iAlternateSettingList;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   329
    TUsbcEndpoint* iEndpoint[KMaxEndpointsPerClient + 1];    // include ep0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   330
    TRequestStatus* iRequestStatus[KUsbcMaxRequests];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   331
    TClientAsynchNotify* iClientAsynchNotify[KUsbcMaxRequests];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   332
    TUsbcClientCallback iCompleteAllCallbackInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   333
    TAny* iStatusChangePtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   334
    TUsbcStatusCallback iStatusCallbackInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   335
    TAny* iEndpointStatusChangePtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   336
    TUsbcEndpointStatusCallback iEndpointStatusCallbackInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   337
    TAny* iOtgFeatureChangePtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   338
    TUsbcOtgFeatureCallback iOtgFeatureCallbackInfo;
48
21625e5de155 201035_01
hgs
parents: 33
diff changeset
   339
    TAny* iChargerTypeChangePtr;
21625e5de155 201035_01
hgs
parents: 33
diff changeset
   340
    TUsbcChargerTypeCallback iChargerTypeCallbackInfo;
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
   341
    TInt iNumberOfEndpoints;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   342
    RArray<DPlatChunkHw*> iHwChunksEp0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   343
    RArray<DPlatChunkHw*> iHwChunks;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   344
089413cdde3c 201028_02
hgs
parents:
diff changeset
   345
    TUsbcDeviceState iDeviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   346
    TUsbcDeviceState iOldDeviceState;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   347
    TBool iOwnsDeviceControl;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   348
    TUint iAlternateSetting;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   349
    TBool iDeviceStatusNeeded;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   350
    TUsbcDeviceStatusQueue* iStatusFifo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   351
    TBool iChannelClosing;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   352
    TVirtualPinObject *iPinObj1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   353
    TVirtualPinObject *iPinObj2;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   354
    TVirtualPinObject *iPinObj3;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   355
    TClientDataRequest<TUint> *iStatusChangeReq;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   356
    TClientDataRequest<TUint> *iEndpointStatusChangeReq;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   357
    TClientDataRequest<TUint> *iOtgFeatureChangeReq;
48
21625e5de155 201035_01
hgs
parents: 33
diff changeset
   358
    TClientDataRequest<TUint> *iChargerTypeChangeReq;
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
   359
    TEndpointTransferInfo iTfrInfo;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   360
    };
089413cdde3c 201028_02
hgs
parents:
diff changeset
   361
089413cdde3c 201028_02
hgs
parents:
diff changeset
   362
089413cdde3c 201028_02
hgs
parents:
diff changeset
   363
#include <usb/usbc.inl>
089413cdde3c 201028_02
hgs
parents:
diff changeset
   364
089413cdde3c 201028_02
hgs
parents:
diff changeset
   365
#endif    // __USBC_H__