usbdrv/peripheral/pdd/pil/inc/controltransfersm.h
author hgs
Wed, 20 Oct 2010 12:04:53 +0800
changeset 59 bbdce6bffaad
permissions -rw-r--r--
201041_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     1
/*
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     3
* All rights reserved.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     4
* This component and the accompanying materials are made available
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     6
* which accompanies this distribution, and is available
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     8
*
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
     9
* Initial Contributors:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    10
* Nokia Corporation - initial contribution.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    11
*
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    12
* Contributors:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    13
*
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    14
* Description:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    15
*
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    16
*/
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    17
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    18
// Control transfer state machine.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    19
// Generally used for Endpoint zero.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    20
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    21
#ifndef CONTROLTRANSFER_SM_H
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    22
#define CONTROLTRANSFER_SM_H
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    23
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    24
#include <e32def.h>                     // General types definition
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    25
#include <usb/usb_peripheral_shai.h>    // Peripheral SHAI Header
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    26
#include <usb/usb.h>                    // Usb const
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    27
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    28
#include <usb/usbcontrolxferif.h>
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    29
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    30
// Forward class declaration
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    31
class TControlStageSm;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    32
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    33
// Refer usb setup packet definition
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    34
const TUint8 KUSB_SETUPKT_DATA_DIR_MASK = 0x80;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    35
const TUint8 KUSB_SETUPKT_REQ_TYPE_VENDOR_MASK = 0x40;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    36
const TUint8 KUSB_SETUPKT_REQ_TYPE_CLASS_MASK = 0x20;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    37
const TUint8 KUSB_SETUPKT_REQ_TYPE_STANDARD_MASK = 0x60;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    38
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    39
/** 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    40
 * TUsbPeripheralSetup
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    41
 * @brief  A USB Setup packet's structure.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    42
 * @see ProcessSetConfiguration(const TUsbPeripheralSetup&)
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    43
 *
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    44
 */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    45
struct TUsbcSetup
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    46
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    47
    /** bmRequestType */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    48
    TUint8 iRequestType;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    49
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    50
    /** bRequest */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    51
    TUint8 iRequest;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    52
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    53
    /** wValue */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    54
    TUint16 iValue;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    55
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    56
    /** wIndex */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    57
    TUint16 iIndex;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    58
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    59
    /** wLength */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    60
    TUint16 iLength;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    61
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    62
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    63
/** Valid request catogary that a client(PIL or App) can request
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    64
 *  via this state machine
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    65
 */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    66
enum TControlTransferRequest
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    67
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    68
    // Write . Data IN . From Device to Host
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    69
    TControlTransferRequestWrite,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    70
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    71
    // Read . Data OUT . From Host to Device
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    72
    TControlTransferRequestRead,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    73
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    74
    // Zero bytes status, Write . Status IN
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    75
    // Status from Device to Host
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    76
    TControlTransferRequestSendStatus
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    77
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    78
    // Status from Host to device will be ignored
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    79
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    80
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    81
// Data dir as spec defined
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    82
enum TUsbDataDir
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    83
    {        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    84
    EUsbDataDir_ToDevice,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    85
    EUsbDataDir_ToHost
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    86
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    87
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    88
// Request catogary from Host to device as spec defined
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    89
enum TUsbRequestType
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    90
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    91
    EUsbStandardRequest,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    92
    EUsbClassRequest,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    93
    EUsbVendorRequest
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    94
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    95
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    96
// Target of the request(from host to device)
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    97
enum TUsbRequestTarget
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    98
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
    99
    EUsbRequestTargetToDevice,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   100
    EUsbRequestTargetToInterface,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   101
    EUsbRequestTargetToEndpoint,
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   102
    EUsbRequestTargetToElement
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   103
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   104
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   105
typedef TUint8  TUsbRequest;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   106
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   107
/** Helper function which can parse a setup packet 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   108
 *  and explain it as what's spec required
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   109
 */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   110
NONSHARABLE_CLASS(TSetupPkgParser)
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   111
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   112
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   113
        TSetupPkgParser();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   114
        // Set the setup buffer
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   115
        // this class does't hold this buffer, it do a bitwise copy
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   116
        // assumed length is 8 bytes
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   117
        static void Set(const TUint8* aSetupBuf);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   118
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   119
        // Get what the next stage following the received setup
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   120
        // packet
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   121
        static UsbShai::TControlStage NextStage();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   122
                
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   123
        static TUsbDataDir DataDirection();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   124
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   125
        static TBool IsVendorRequest();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   126
        static TBool IsClassRequest(); 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   127
        static TBool IsStandardRequest();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   128
         
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   129
        static TUsbRequest Request();        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   130
        static TUint16 Value();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   131
        static TUint16 Index();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   132
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   133
        // data length if there is a data packet(in/out) follows
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   134
        // data length will be modified during a transfer
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   135
        static TUint16 DataLength();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   136
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   137
        static TUsbcSetup& SetupPacket();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   138
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   139
    private:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   140
        static TUsbcSetup iSetupPkt;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   141
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   142
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   143
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   144
// State machine manager
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   145
// 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   146
NONSHARABLE_CLASS(DControlTransferManager)
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   147
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   148
    friend class TControlStageSm;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   149
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   150
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   151
        DControlTransferManager(MControlTransferIf& aPktProcessor);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   152
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   153
        // PSL will complete to PIL directly, in our cases, PIL will delegate to us via this interface
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   154
        void Ep0RequestComplete(TUint8* aBuf, TInt aSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   155
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   156
        // Add a new state processor
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   157
        void AddState(UsbShai::TControlStage aStage, TControlStageSm& aStageSm);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   158
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   159
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   160
        // Helper inline function
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   161
        MControlTransferIf& CtrTransferIf();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   162
        TSetupPkgParser& PktParser();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   163
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   164
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   165
        // EP0 Access interface
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   166
        // They are the same as it shows in SHAI header
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   167
        // so, PIL code can delegate those task to us, we will perform a series of checking
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   168
        // depending on which state we are in, if each condition meet, we will callback via
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   169
        // interface MControlTransferIf to perform the real work.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   170
        TInt SetupEndpointZeroRead();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   171
        TInt SetupEndpointZeroWrite(const TUint8* aBuffer, TInt aLength, TBool aZlpReqd=EFalse);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   172
        TInt SendEp0ZeroByteStatusPacket();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   173
        TInt StallEndpoint(TInt aRealEndpoint);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   174
        void Ep0SetupPacketProceed();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   175
        void Ep0DataPacketProceed();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   176
    
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   177
        // Reset state machine.
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   178
        void Reset();      
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   179
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   180
        // Data received for data out stage
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   181
        void DataReceived(TUint16 aCount);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   182
        TBool IsMoreBytesNeeded();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   183
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   184
    private:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   185
        // State machines for each stage
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   186
        TControlStageSm* iState[UsbShai::EControlTransferStageMax];
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   187
        // Current stage 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   188
        UsbShai::TControlStage iCurrentStage;        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   189
        TSetupPkgParser iPacketParser;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   190
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   191
        MControlTransferIf& iCtrTransferIf;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   192
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   193
        TBool iReadPending; 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   194
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   195
        TUint16 iDataTransfered;        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   196
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   197
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   198
// Base class of state machine
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   199
NONSHARABLE_CLASS(TControlStageSm)
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   200
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   201
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   202
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   203
        /** PSL --Ep0RequestComplete()--> PIL --Ep0RequestComplete()---------> 
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   204
         *                                                                    |
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   205
         *  (ProcessXXX)PIL <-- RequestComplete()<--DControlTransferManager <-
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   206
         *                                                                     
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   207
         *  @param  aPktSize the size of the packet recieved
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   208
         *          aError error code if something wrong
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   209
         *          aPktType one of the packet type specified in UsbShai::TControlPacketType
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   210
         *  
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   211
         *  @return ETrue if the packet need to be further processed
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   212
         *          EFalse if the packet was consumed
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   213
         */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   214
        virtual TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType) = 0;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   215
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   216
        /** Query whether a kind of operation is allowed in specified state
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   217
         *   
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   218
         *  @param  aRequest the request to be queried
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   219
         *  
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   220
         *  @return ETrue is the operation is allowed
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   221
         *          EFalse if not
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   222
         */
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   223
        virtual TBool IsRequstAllowed(TControlTransferRequest aRequest) = 0;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   224
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   225
        TControlStageSm(DControlTransferManager& aTransferMgr);           
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   226
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   227
    protected:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   228
        // change state of SM in iTransferMgr
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   229
        void ChangeToStage(UsbShai::TControlStage aToStage);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   230
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   231
        // Clear ReadPending in ControlTransferMgr so that it won't
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   232
        // block any further read operation
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   233
        void ClearPendingRead();
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   234
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   235
    protected:        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   236
        DControlTransferManager& iTransferMgr;
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   237
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   238
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   239
// Concreate state class
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   240
// State of "Setup", used to wait for a setup packet
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   241
// it will ignore all non-setup-packet
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   242
NONSHARABLE_CLASS(DSetupStageSm) : public TControlStageSm
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   243
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   244
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   245
        DSetupStageSm(DControlTransferManager& aTransferMgr);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   246
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   247
        TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   248
        TBool IsRequstAllowed(TControlTransferRequest aRequest);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   249
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   250
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   251
// State used to wait for user to write something to host
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   252
// The write is supposed to be done in one shot
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   253
NONSHARABLE_CLASS(DDataInStageSm) : public TControlStageSm
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   254
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   255
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   256
        DDataInStageSm(DControlTransferManager& aTransferMgr);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   257
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   258
        TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   259
        TBool IsRequstAllowed(TControlTransferRequest aRequest);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   260
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   261
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   262
// State used to wait some data from Host
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   263
NONSHARABLE_CLASS(DDataOutStageSm) : public TControlStageSm
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   264
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   265
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   266
        DDataOutStageSm(DControlTransferManager& aTransferMgr);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   267
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   268
        TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   269
        TBool IsRequstAllowed(TControlTransferRequest aRequest);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   270
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   271
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   272
NONSHARABLE_CLASS(DStatusInStageSm) : public TControlStageSm
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   273
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   274
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   275
        DStatusInStageSm(DControlTransferManager& aTransferMgr);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   276
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   277
        TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   278
        TBool IsRequstAllowed(TControlTransferRequest aRequest);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   279
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   280
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   281
NONSHARABLE_CLASS(DStatusOutStageSm) : public TControlStageSm
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   282
    {
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   283
    public:
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   284
        DStatusOutStageSm(DControlTransferManager& aTransferMgr);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   285
        
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   286
        TBool RequestComplete(TInt aPktSize, TInt aError, UsbShai::TControlPacketType aPktType);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   287
        TBool IsRequstAllowed(TControlTransferRequest aRequest);
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   288
    };
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   289
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   290
#include "controltransfersm.inl"
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   291
bbdce6bffaad 201041_02
hgs
parents:
diff changeset
   292
#endif //CONTROLTRANSFER_SM_H