usbdrv/peripheral/pdd/pil/src/descriptors.cpp
author hgs
Wed, 20 Oct 2010 12:04:53 +0800
changeset 59 bbdce6bffaad
parent 55 3b97f0de7605
permissions -rw-r--r--
201041_02
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
59
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     1
/*
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     2
* Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     3
* All rights reserved.
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     4
* This component and the accompanying materials are made available
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     5
* under the terms of "Eclipse Public License v1.0"
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     6
* which accompanies this distribution, and is available
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     7
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     8
*
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
     9
* Initial Contributors:
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    10
* Nokia Corporation - initial contribution.
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    11
*
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    12
* Contributors:
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    13
*
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    14
* Description:
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    15
* e32/drivers/usbcc/descriptors.cpp
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    16
* Platform independent layer (PIL) of the USB Device controller driver:
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    17
* USB descriptor handling and management.
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    18
*
bbdce6bffaad 201041_02
hgs
parents: 55
diff changeset
    19
*/
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
    20
089413cdde3c 201028_02
hgs
parents:
diff changeset
    21
/**
089413cdde3c 201028_02
hgs
parents:
diff changeset
    22
 @file descriptors.cpp
089413cdde3c 201028_02
hgs
parents:
diff changeset
    23
 @internalTechnology
089413cdde3c 201028_02
hgs
parents:
diff changeset
    24
*/
089413cdde3c 201028_02
hgs
parents:
diff changeset
    25
089413cdde3c 201028_02
hgs
parents:
diff changeset
    26
#include <kernel/kern_priv.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    27
// #include <drivers/usbc.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    28
#include <usb/usbc.h>
089413cdde3c 201028_02
hgs
parents:
diff changeset
    29
089413cdde3c 201028_02
hgs
parents:
diff changeset
    30
089413cdde3c 201028_02
hgs
parents:
diff changeset
    31
// Debug Support
089413cdde3c 201028_02
hgs
parents:
diff changeset
    32
static const char KUsbPanicCat[] = "USB PIL";
089413cdde3c 201028_02
hgs
parents:
diff changeset
    33
089413cdde3c 201028_02
hgs
parents:
diff changeset
    34
089413cdde3c 201028_02
hgs
parents:
diff changeset
    35
// --- TUsbcDescriptorBase
089413cdde3c 201028_02
hgs
parents:
diff changeset
    36
089413cdde3c 201028_02
hgs
parents:
diff changeset
    37
TUsbcDescriptorBase::TUsbcDescriptorBase()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    38
    :
089413cdde3c 201028_02
hgs
parents:
diff changeset
    39
#ifdef USB_SUPPORTS_SET_DESCRIPTOR_REQUEST
089413cdde3c 201028_02
hgs
parents:
diff changeset
    40
    iIndex(0),
089413cdde3c 201028_02
hgs
parents:
diff changeset
    41
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
    42
    iBufPtr(NULL, 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    43
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    44
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorBase::TUsbcDescriptorBase()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
    45
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    46
089413cdde3c 201028_02
hgs
parents:
diff changeset
    47
089413cdde3c 201028_02
hgs
parents:
diff changeset
    48
TUsbcDescriptorBase::~TUsbcDescriptorBase()
089413cdde3c 201028_02
hgs
parents:
diff changeset
    49
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    50
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorBase::~TUsbcDescriptorBase()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
    51
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    52
089413cdde3c 201028_02
hgs
parents:
diff changeset
    53
089413cdde3c 201028_02
hgs
parents:
diff changeset
    54
void TUsbcDescriptorBase::SetByte(TInt aPosition, TUint8 aValue)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    55
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    56
    iBufPtr[aPosition] = aValue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    57
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    58
089413cdde3c 201028_02
hgs
parents:
diff changeset
    59
089413cdde3c 201028_02
hgs
parents:
diff changeset
    60
void TUsbcDescriptorBase::SetWord(TInt aPosition, TUint16 aValue)
089413cdde3c 201028_02
hgs
parents:
diff changeset
    61
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    62
    *reinterpret_cast<TUint16*>(&iBufPtr[aPosition]) = SWAP_BYTES_16(aValue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    63
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    64
089413cdde3c 201028_02
hgs
parents:
diff changeset
    65
089413cdde3c 201028_02
hgs
parents:
diff changeset
    66
TUint8 TUsbcDescriptorBase::Byte(TInt aPosition) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
    67
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    68
    return iBufPtr[aPosition];
089413cdde3c 201028_02
hgs
parents:
diff changeset
    69
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    70
089413cdde3c 201028_02
hgs
parents:
diff changeset
    71
089413cdde3c 201028_02
hgs
parents:
diff changeset
    72
TUint16 TUsbcDescriptorBase::Word(TInt aPosition) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
    73
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    74
    return SWAP_BYTES_16(*reinterpret_cast<const TUint16*>(&iBufPtr[aPosition]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
    75
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    76
089413cdde3c 201028_02
hgs
parents:
diff changeset
    77
089413cdde3c 201028_02
hgs
parents:
diff changeset
    78
void TUsbcDescriptorBase::GetDescriptorData(TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
    79
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    80
    aBuffer = iBufPtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    81
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    82
089413cdde3c 201028_02
hgs
parents:
diff changeset
    83
089413cdde3c 201028_02
hgs
parents:
diff changeset
    84
TInt TUsbcDescriptorBase::GetDescriptorData(TUint8* aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
    85
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    86
    memcpy(aBuffer, iBufPtr.Ptr(), Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
    87
    return Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
    88
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    89
089413cdde3c 201028_02
hgs
parents:
diff changeset
    90
089413cdde3c 201028_02
hgs
parents:
diff changeset
    91
TInt TUsbcDescriptorBase::GetDescriptorData(TUint8* aBuffer, TUint aMaxSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
    92
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    93
    if (aMaxSize < Size())
089413cdde3c 201028_02
hgs
parents:
diff changeset
    94
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
    95
        // No use to copy only half a descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
    96
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
    97
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
    98
    return GetDescriptorData(aBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
    99
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   100
089413cdde3c 201028_02
hgs
parents:
diff changeset
   101
089413cdde3c 201028_02
hgs
parents:
diff changeset
   102
const TDes8& TUsbcDescriptorBase::DescriptorData() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   103
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   104
    return iBufPtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   105
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   106
089413cdde3c 201028_02
hgs
parents:
diff changeset
   107
089413cdde3c 201028_02
hgs
parents:
diff changeset
   108
TDes8& TUsbcDescriptorBase::DescriptorData()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   109
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   110
    return iBufPtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   111
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   112
089413cdde3c 201028_02
hgs
parents:
diff changeset
   113
089413cdde3c 201028_02
hgs
parents:
diff changeset
   114
TUint TUsbcDescriptorBase::Size() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   115
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   116
    return iBufPtr.Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   117
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   118
089413cdde3c 201028_02
hgs
parents:
diff changeset
   119
089413cdde3c 201028_02
hgs
parents:
diff changeset
   120
TUint8 TUsbcDescriptorBase::Type() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   121
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   122
    return iBufPtr[1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   123
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   124
089413cdde3c 201028_02
hgs
parents:
diff changeset
   125
089413cdde3c 201028_02
hgs
parents:
diff changeset
   126
void TUsbcDescriptorBase::UpdateFs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   127
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   128
    // virtual function can be overridden in derived classes.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   129
    return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   130
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   131
089413cdde3c 201028_02
hgs
parents:
diff changeset
   132
089413cdde3c 201028_02
hgs
parents:
diff changeset
   133
void TUsbcDescriptorBase::UpdateHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   134
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   135
    // virtual function can be overridden in derived classes.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   136
    return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   137
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   138
089413cdde3c 201028_02
hgs
parents:
diff changeset
   139
089413cdde3c 201028_02
hgs
parents:
diff changeset
   140
void TUsbcDescriptorBase::SetBufferPointer(const TDesC8& aDes)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   141
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   142
    iBufPtr.Set(const_cast<TUint8*>(aDes.Ptr()), aDes.Size(), aDes.Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   143
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   144
089413cdde3c 201028_02
hgs
parents:
diff changeset
   145
089413cdde3c 201028_02
hgs
parents:
diff changeset
   146
// --- TUsbcDeviceDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   147
089413cdde3c 201028_02
hgs
parents:
diff changeset
   148
TUsbcDeviceDescriptor::TUsbcDeviceDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   149
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   150
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   151
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::TUsbcDeviceDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   152
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   153
089413cdde3c 201028_02
hgs
parents:
diff changeset
   154
089413cdde3c 201028_02
hgs
parents:
diff changeset
   155
TUsbcDeviceDescriptor* TUsbcDeviceDescriptor::New(TUint8 aDeviceClass, TUint8 aDeviceSubClass,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   156
                                                  TUint8 aDeviceProtocol, TUint8 aMaxPacketSize0,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   157
                                                  TUint16 aVendorId, TUint16 aProductId,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   158
                                                  TUint16 aDeviceRelease, TUint8 aNumConfigurations)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   159
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   160
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   161
    TUsbcDeviceDescriptor* self = new TUsbcDeviceDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   162
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   163
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   164
        if (self->Construct(aDeviceClass, aDeviceSubClass, aDeviceProtocol, aMaxPacketSize0, aVendorId,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   165
                            aProductId, aDeviceRelease, aNumConfigurations) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   166
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   167
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   168
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   169
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   170
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   171
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   172
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   173
089413cdde3c 201028_02
hgs
parents:
diff changeset
   174
089413cdde3c 201028_02
hgs
parents:
diff changeset
   175
TInt TUsbcDeviceDescriptor::Construct(TUint8 aDeviceClass, TUint8 aDeviceSubClass, TUint8 aDeviceProtocol,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   176
                                      TUint8 aMaxPacketSize0, TUint16 aVendorId, TUint16 aProductId,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   177
                                      TUint16 aDeviceRelease, TUint8 aNumConfigurations)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   178
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   179
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   180
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   181
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   182
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   183
    iBuf[1] = KUsbDescType_Device;                            // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   184
    SetWord(2, KUsbcUsbVersion);                            // bcdUSB
089413cdde3c 201028_02
hgs
parents:
diff changeset
   185
    iBuf[4] = aDeviceClass;                                    // bDeviceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   186
    iBuf[5] = aDeviceSubClass;                                // bDeviceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   187
    iBuf[6] = aDeviceProtocol;                                // bDeviceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
   188
    iBuf[7] = aMaxPacketSize0;                                // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   189
    SetWord(8, aVendorId);                                    // idVendor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   190
    SetWord(10, aProductId);                                // idProduct
089413cdde3c 201028_02
hgs
parents:
diff changeset
   191
    SetWord(12, aDeviceRelease);                            // bcdDevice
089413cdde3c 201028_02
hgs
parents:
diff changeset
   192
    iBuf[14] = 0;                                            // iManufacturer
089413cdde3c 201028_02
hgs
parents:
diff changeset
   193
    iBuf[15] = 0;                                            // iProduct
089413cdde3c 201028_02
hgs
parents:
diff changeset
   194
    iBuf[16] = 0;                                            // iSerialNumber
089413cdde3c 201028_02
hgs
parents:
diff changeset
   195
    iBuf[17] = aNumConfigurations;                            // bNumConfigurations
089413cdde3c 201028_02
hgs
parents:
diff changeset
   196
    iEp0Size_Fs = aMaxPacketSize0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   197
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   198
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   199
089413cdde3c 201028_02
hgs
parents:
diff changeset
   200
089413cdde3c 201028_02
hgs
parents:
diff changeset
   201
void TUsbcDeviceDescriptor::UpdateFs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   202
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   203
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::UpdateFs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   204
    SetByte(7, iEp0Size_Fs);                                // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   205
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   206
089413cdde3c 201028_02
hgs
parents:
diff changeset
   207
089413cdde3c 201028_02
hgs
parents:
diff changeset
   208
void TUsbcDeviceDescriptor::UpdateHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   209
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   210
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::UpdateHs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   211
    SetByte(7, 64);                                            // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   212
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   213
089413cdde3c 201028_02
hgs
parents:
diff changeset
   214
089413cdde3c 201028_02
hgs
parents:
diff changeset
   215
// --- TUsbcDeviceQualifierDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   216
089413cdde3c 201028_02
hgs
parents:
diff changeset
   217
TUsbcDeviceQualifierDescriptor::TUsbcDeviceQualifierDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   218
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   219
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   220
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceDescriptor::TUsbcDeviceQualifierDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   221
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   222
089413cdde3c 201028_02
hgs
parents:
diff changeset
   223
089413cdde3c 201028_02
hgs
parents:
diff changeset
   224
TUsbcDeviceQualifierDescriptor* TUsbcDeviceQualifierDescriptor::New(TUint8 aDeviceClass,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   225
                                                                    TUint8 aDeviceSubClass,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   226
                                                                    TUint8 aDeviceProtocol,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   227
                                                                    TUint8 aMaxPacketSize0,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   228
                                                                    TUint8 aNumConfigurations,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   229
                                                                    TUint8 aReserved)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   230
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   231
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceQualifierDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   232
    TUsbcDeviceQualifierDescriptor* self = new TUsbcDeviceQualifierDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   233
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   234
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   235
        if (self->Construct(aDeviceClass, aDeviceSubClass, aDeviceProtocol, aMaxPacketSize0,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   236
                            aNumConfigurations, aReserved) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   237
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   238
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   239
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   240
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   241
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   242
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   243
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   244
089413cdde3c 201028_02
hgs
parents:
diff changeset
   245
089413cdde3c 201028_02
hgs
parents:
diff changeset
   246
TInt TUsbcDeviceQualifierDescriptor::Construct(TUint8 aDeviceClass, TUint8 aDeviceSubClass,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   247
                                               TUint8 aDeviceProtocol, TUint8 aMaxPacketSize0,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   248
                                               TUint8 aNumConfigurations, TUint8 aReserved)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   249
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   250
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceQualifierDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   251
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   252
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   253
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   254
    iBuf[1] = KUsbDescType_DeviceQualifier;                    // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   255
    SetWord(2, KUsbcUsbVersion);                            // bcdUSB
089413cdde3c 201028_02
hgs
parents:
diff changeset
   256
    iBuf[4] = aDeviceClass;                                    // bDeviceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   257
    iBuf[5] = aDeviceSubClass;                                // bDeviceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   258
    iBuf[6] = aDeviceProtocol;                                // bDeviceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
   259
    iBuf[7] = aMaxPacketSize0;                                // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   260
    iBuf[8] = aNumConfigurations;                            // bNumConfigurations
089413cdde3c 201028_02
hgs
parents:
diff changeset
   261
    if (aReserved) aReserved = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   262
    iBuf[9] = aReserved;                                    // Reserved for future use, must be zero
089413cdde3c 201028_02
hgs
parents:
diff changeset
   263
    iEp0Size_Fs = aMaxPacketSize0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   264
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   265
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   266
089413cdde3c 201028_02
hgs
parents:
diff changeset
   267
089413cdde3c 201028_02
hgs
parents:
diff changeset
   268
void TUsbcDeviceQualifierDescriptor::UpdateFs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   269
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   270
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceQualifierDescriptor::UpdateFs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   271
    // Here we do exactly the opposite of what's done in the Device descriptor (as this one's
089413cdde3c 201028_02
hgs
parents:
diff changeset
   272
    // documenting the 'other than the current speed').
089413cdde3c 201028_02
hgs
parents:
diff changeset
   273
    SetByte(7, 64);                                            // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   274
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   275
089413cdde3c 201028_02
hgs
parents:
diff changeset
   276
089413cdde3c 201028_02
hgs
parents:
diff changeset
   277
void TUsbcDeviceQualifierDescriptor::UpdateHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   278
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   279
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDeviceQualifierDescriptor::UpdateHs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   280
    // Here we do exactly the opposite of what's done in the Device descriptor (as this one's
089413cdde3c 201028_02
hgs
parents:
diff changeset
   281
    // documenting the 'other than the current speed').
089413cdde3c 201028_02
hgs
parents:
diff changeset
   282
    SetByte(7, iEp0Size_Fs);                                // bMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   283
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   284
089413cdde3c 201028_02
hgs
parents:
diff changeset
   285
089413cdde3c 201028_02
hgs
parents:
diff changeset
   286
// --- TUsbcConfigDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   287
089413cdde3c 201028_02
hgs
parents:
diff changeset
   288
TUsbcConfigDescriptor::TUsbcConfigDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   289
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   290
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   291
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcConfigDescriptor::TUsbcConfigDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   292
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   293
089413cdde3c 201028_02
hgs
parents:
diff changeset
   294
089413cdde3c 201028_02
hgs
parents:
diff changeset
   295
TUsbcConfigDescriptor* TUsbcConfigDescriptor::New(TUint8 aConfigurationValue, TBool aSelfPowered,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   296
                                                  TBool aRemoteWakeup, TUint16 aMaxPower)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   297
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   298
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcConfigDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   299
    TUsbcConfigDescriptor* self = new TUsbcConfigDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   300
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   301
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   302
        if (self->Construct(aConfigurationValue, aSelfPowered, aRemoteWakeup, aMaxPower) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   303
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   304
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   305
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   306
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   307
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   308
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   309
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   310
089413cdde3c 201028_02
hgs
parents:
diff changeset
   311
089413cdde3c 201028_02
hgs
parents:
diff changeset
   312
TInt TUsbcConfigDescriptor::Construct(TUint8 aConfigurationValue, TBool aSelfPowered,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   313
                                       TBool aRemoteWakeup, TUint16 aMaxPower)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   314
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   315
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcConfigDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   316
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   317
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   318
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   319
    iBuf[1] = KUsbDescType_Config;                            // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   320
    SetWord(2, KUsbDescSize_Config);                        // wTotalLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   321
    iBuf[4] = 0;                                            // bNumInterfaces
089413cdde3c 201028_02
hgs
parents:
diff changeset
   322
    iBuf[5] = aConfigurationValue;                            // bConfigurationValue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   323
    iBuf[6] = 0;                                            // iConfiguration
089413cdde3c 201028_02
hgs
parents:
diff changeset
   324
    iBuf[7] = 0x80 |
089413cdde3c 201028_02
hgs
parents:
diff changeset
   325
        (aSelfPowered ? KUsbDevAttr_SelfPowered : 0) |
089413cdde3c 201028_02
hgs
parents:
diff changeset
   326
        (aRemoteWakeup ? KUsbDevAttr_RemoteWakeup : 0);        // bmAttributes (bit 7 always 1)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   327
    if (aMaxPower > 510)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   328
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Invalid value for bMaxPower: %d", aMaxPower));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   329
    iBuf[8] = aMaxPower / 2;                                // bMaxPower (2mA units!)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   330
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   331
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   332
089413cdde3c 201028_02
hgs
parents:
diff changeset
   333
089413cdde3c 201028_02
hgs
parents:
diff changeset
   334
// --- TUsbcInterfaceDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   335
089413cdde3c 201028_02
hgs
parents:
diff changeset
   336
TUsbcInterfaceDescriptor::TUsbcInterfaceDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   337
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   338
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   339
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcInterfaceDescriptor::TUsbcInterfaceDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   340
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   341
089413cdde3c 201028_02
hgs
parents:
diff changeset
   342
089413cdde3c 201028_02
hgs
parents:
diff changeset
   343
TUsbcInterfaceDescriptor* TUsbcInterfaceDescriptor::New(TUint8 aInterfaceNumber, TUint8 aAlternateSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   344
                                                        TInt aNumEndpoints, const TUsbcClassInfo& aClassInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   345
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   346
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcInterfaceDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   347
    TUsbcInterfaceDescriptor* self = new TUsbcInterfaceDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   348
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   349
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   350
        if (self->Construct(aInterfaceNumber, aAlternateSetting, aNumEndpoints, aClassInfo) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   351
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   352
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   353
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   354
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   355
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   356
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   357
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   358
089413cdde3c 201028_02
hgs
parents:
diff changeset
   359
089413cdde3c 201028_02
hgs
parents:
diff changeset
   360
TInt TUsbcInterfaceDescriptor::Construct(TUint8 aInterfaceNumber, TUint8 aAlternateSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   361
                                         TInt aNumEndpoints, const TUsbcClassInfo& aClassInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   362
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   363
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcInterfaceDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   364
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   365
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   366
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   367
    iBuf[1] = KUsbDescType_Interface;                        // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   368
    iBuf[2] = aInterfaceNumber;                                // bInterfaceNumber
089413cdde3c 201028_02
hgs
parents:
diff changeset
   369
    iBuf[3] = aAlternateSetting;                            // bAlternateSetting
089413cdde3c 201028_02
hgs
parents:
diff changeset
   370
    iBuf[4] = aNumEndpoints;                                // bNumEndpoints
089413cdde3c 201028_02
hgs
parents:
diff changeset
   371
    iBuf[5] = aClassInfo.iClassNum;                            // bInterfaceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   372
    iBuf[6] = aClassInfo.iSubClassNum;                        // bInterfaceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   373
    iBuf[7] = aClassInfo.iProtocolNum;                        // bInterfaceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
   374
    iBuf[8] = 0;                                            // iInterface
089413cdde3c 201028_02
hgs
parents:
diff changeset
   375
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   376
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   377
089413cdde3c 201028_02
hgs
parents:
diff changeset
   378
089413cdde3c 201028_02
hgs
parents:
diff changeset
   379
// --- TUsbcEndpointDescriptorBase
089413cdde3c 201028_02
hgs
parents:
diff changeset
   380
089413cdde3c 201028_02
hgs
parents:
diff changeset
   381
TUsbcEndpointDescriptorBase::TUsbcEndpointDescriptorBase()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   382
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   383
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptorBase::TUsbcEndpointDescriptorBase()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   384
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   385
089413cdde3c 201028_02
hgs
parents:
diff changeset
   386
089413cdde3c 201028_02
hgs
parents:
diff changeset
   387
TInt TUsbcEndpointDescriptorBase::Construct(const TUsbcEndpointInfo& aEpInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   388
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   389
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptorBase::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   390
    //  Adjust FS/HS endpoint sizes
089413cdde3c 201028_02
hgs
parents:
diff changeset
   391
    if (aEpInfo.AdjustEpSizes(iEpSize_Fs, iEpSize_Hs) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   392
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   393
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Unknown endpoint type: %d", aEpInfo.iType));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   394
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   395
    __KTRACE_OPT(KUSB, Kern::Printf("  Now set: iEpSize_Fs=%d iEpSize_Hs=%d (aEpInfo.iSize=%d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   396
                                    iEpSize_Fs, iEpSize_Hs, aEpInfo.iSize));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   397
089413cdde3c 201028_02
hgs
parents:
diff changeset
   398
    //  Adjust HS endpoint size for additional transactions
089413cdde3c 201028_02
hgs
parents:
diff changeset
   399
    if ((aEpInfo.iType == UsbShai::KUsbEpTypeIsochronous) || (aEpInfo.iType == UsbShai::KUsbEpTypeInterrupt))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   400
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   401
        if ((aEpInfo.iTransactions > 0) && (aEpInfo.iTransactions < 3))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   402
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   403
            // Bits 12..11 specify the number of additional transactions per microframe
089413cdde3c 201028_02
hgs
parents:
diff changeset
   404
            iEpSize_Hs |= (aEpInfo.iTransactions << 12);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   405
            __KTRACE_OPT(KUSB, Kern::Printf("  Adjusted for add. transact.: iEpSize_Hs=0x%02x "
089413cdde3c 201028_02
hgs
parents:
diff changeset
   406
                                            "(aEpInfo.iTransactions=%d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   407
                                            iEpSize_Hs, aEpInfo.iTransactions));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   408
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   409
        else if (aEpInfo.iTransactions != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   410
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   411
            __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Invalid iTransactions value: %d (ignored)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   412
                                              aEpInfo.iTransactions));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   413
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   414
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   415
089413cdde3c 201028_02
hgs
parents:
diff changeset
   416
    //  Adjust HS polling interval
089413cdde3c 201028_02
hgs
parents:
diff changeset
   417
    TUsbcEndpointInfo info(aEpInfo);                        // create local writeable copy
089413cdde3c 201028_02
hgs
parents:
diff changeset
   418
    if (info.AdjustPollInterval() != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   419
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   420
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Unknown ep type (%d) or invalid interval value (%d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   421
                                          info.iType, info.iInterval));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   422
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   423
    iInterval_Fs = info.iInterval;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   424
    iInterval_Hs = info.iInterval_Hs;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   425
    __KTRACE_OPT(KUSB, Kern::Printf("  Now set: iInterval_Fs=%d iInterval_Hs=%d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   426
                                    iInterval_Fs, iInterval_Hs));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   427
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   428
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   429
089413cdde3c 201028_02
hgs
parents:
diff changeset
   430
089413cdde3c 201028_02
hgs
parents:
diff changeset
   431
void TUsbcEndpointDescriptorBase::UpdateFs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   432
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   433
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptorBase::UpdateFs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   434
    // (TUsbcEndpointDescriptorBase's FS/HS endpoint sizes and interval values got
089413cdde3c 201028_02
hgs
parents:
diff changeset
   435
    //  adjusted in its Construct() method.)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   436
    SetWord(4, iEpSize_Fs);                                    // wMaxPacketSize
089413cdde3c 201028_02
hgs
parents:
diff changeset
   437
    SetByte(6, iInterval_Fs);                                // bInterval
089413cdde3c 201028_02
hgs
parents:
diff changeset
   438
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   439
089413cdde3c 201028_02
hgs
parents:
diff changeset
   440
089413cdde3c 201028_02
hgs
parents:
diff changeset
   441
void TUsbcEndpointDescriptorBase::UpdateHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   442
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   443
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptorBase::UpdateHs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   444
    // (TUsbcEndpointDescriptorBase's FS/HS endpoint sizes and interval values get
089413cdde3c 201028_02
hgs
parents:
diff changeset
   445
    //  adjusted in its Construct() method.)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   446
    SetWord(4, iEpSize_Hs);                                    // wMaxPacketSize
089413cdde3c 201028_02
hgs
parents:
diff changeset
   447
    SetByte(6, iInterval_Hs);                                // bInterval
089413cdde3c 201028_02
hgs
parents:
diff changeset
   448
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   449
089413cdde3c 201028_02
hgs
parents:
diff changeset
   450
089413cdde3c 201028_02
hgs
parents:
diff changeset
   451
// --- TUsbcEndpointDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   452
089413cdde3c 201028_02
hgs
parents:
diff changeset
   453
TUsbcEndpointDescriptor::TUsbcEndpointDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   454
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   455
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   456
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptor::TUsbcEndpointDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   457
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   458
089413cdde3c 201028_02
hgs
parents:
diff changeset
   459
089413cdde3c 201028_02
hgs
parents:
diff changeset
   460
TUsbcEndpointDescriptor* TUsbcEndpointDescriptor::New(TUint8 aEndpointAddress,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   461
                                                      const TUsbcEndpointInfo& aEpInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   462
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   463
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   464
    TUsbcEndpointDescriptor* self = new TUsbcEndpointDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   465
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   466
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   467
        if (self->Construct(aEndpointAddress, aEpInfo) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   468
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   469
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   470
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   471
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   472
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   473
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   474
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   475
089413cdde3c 201028_02
hgs
parents:
diff changeset
   476
089413cdde3c 201028_02
hgs
parents:
diff changeset
   477
TInt TUsbcEndpointDescriptor::Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   478
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   479
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcEndpointDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   480
    (void) TUsbcEndpointDescriptorBase::Construct(aEpInfo);    // Init Base class
089413cdde3c 201028_02
hgs
parents:
diff changeset
   481
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   482
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   483
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   484
    iBuf[1] = KUsbDescType_Endpoint;                        // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   485
    iBuf[2] = aEndpointAddress;                                // bEndpointAddress
089413cdde3c 201028_02
hgs
parents:
diff changeset
   486
    iBuf[3] = EpTypeMask2Value(aEpInfo.iType);                // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
   487
    SetWord(4, iEpSize_Fs);                                    // wMaxPacketSize (default is FS)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   488
    iBuf[6] = iInterval_Fs;                                    // bInterval (default is FS)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   489
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   490
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   491
089413cdde3c 201028_02
hgs
parents:
diff changeset
   492
089413cdde3c 201028_02
hgs
parents:
diff changeset
   493
// --- TUsbcAudioEndpointDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   494
089413cdde3c 201028_02
hgs
parents:
diff changeset
   495
TUsbcAudioEndpointDescriptor::TUsbcAudioEndpointDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   496
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   497
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   498
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcAudioEndpointDescriptor::TUsbcAudioEndpointDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   499
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   500
089413cdde3c 201028_02
hgs
parents:
diff changeset
   501
089413cdde3c 201028_02
hgs
parents:
diff changeset
   502
TUsbcAudioEndpointDescriptor* TUsbcAudioEndpointDescriptor::New(TUint8 aEndpointAddress,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   503
                                                                const TUsbcEndpointInfo& aEpInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   504
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   505
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcAudioEndpointDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   506
    TUsbcAudioEndpointDescriptor* self = new TUsbcAudioEndpointDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   507
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   508
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   509
        if (self->Construct(aEndpointAddress, aEpInfo) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   510
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   511
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   512
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   513
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   514
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   515
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   516
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   517
089413cdde3c 201028_02
hgs
parents:
diff changeset
   518
089413cdde3c 201028_02
hgs
parents:
diff changeset
   519
TInt TUsbcAudioEndpointDescriptor::Construct(TUint8 aEndpointAddress, const TUsbcEndpointInfo& aEpInfo)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   520
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   521
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcAudioEndpointDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   522
    (void) TUsbcEndpointDescriptorBase::Construct(aEpInfo);    // Init Base class
089413cdde3c 201028_02
hgs
parents:
diff changeset
   523
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   524
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   525
    iBuf[0] = iBuf.Size();                                    // bLength
089413cdde3c 201028_02
hgs
parents:
diff changeset
   526
    iBuf[1] = KUsbDescType_Endpoint;                        // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   527
    iBuf[2] = aEndpointAddress;                                // bEndpointAddress
089413cdde3c 201028_02
hgs
parents:
diff changeset
   528
    iBuf[3] = EpTypeMask2Value(aEpInfo.iType);                // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
   529
    SetWord(4, iEpSize_Fs);                                    // wMaxPacketSize (default is FS)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   530
    iBuf[6] = iInterval_Fs;                                    // bInterval (default is FS)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   531
    iBuf[7] = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   532
    iBuf[8] = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   533
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   534
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   535
089413cdde3c 201028_02
hgs
parents:
diff changeset
   536
089413cdde3c 201028_02
hgs
parents:
diff changeset
   537
// --- TUsbcOtgDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   538
089413cdde3c 201028_02
hgs
parents:
diff changeset
   539
TUsbcOtgDescriptor* TUsbcOtgDescriptor::New(TBool aHnpSupport, TBool aSrpSupport)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   540
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   541
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcOtgDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   542
    TUsbcOtgDescriptor* self = new TUsbcOtgDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   543
    if (self && (self->Construct(aHnpSupport, aSrpSupport) != KErrNone))
089413cdde3c 201028_02
hgs
parents:
diff changeset
   544
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   545
        delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   546
        return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   547
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   548
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   549
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   550
089413cdde3c 201028_02
hgs
parents:
diff changeset
   551
089413cdde3c 201028_02
hgs
parents:
diff changeset
   552
TUsbcOtgDescriptor::TUsbcOtgDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   553
    : iBuf()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   554
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   555
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcOtgDescriptor::TUsbcOtgDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   556
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   557
089413cdde3c 201028_02
hgs
parents:
diff changeset
   558
089413cdde3c 201028_02
hgs
parents:
diff changeset
   559
TInt TUsbcOtgDescriptor::Construct(TBool aHnpSupport, TBool aSrpSupport)
55
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   560
	{
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   561
	__KTRACE_OPT(KUSB, Kern::Printf("TUsbcOtgDescriptor::Construct()"));
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   562
	iBuf.SetMax();
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   563
	SetBufferPointer(iBuf);
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   564
	iBuf[0] = iBuf.Size();									// bLength
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   565
	iBuf[1] = KUsbDescType_Otg;								// bDescriptorType
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   566
  // B HNP not supported which is temporarily hard coded here. 
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   567
	iBuf[2] = ( aHnpSupport ? 0 : 0 ) | ( aSrpSupport ? KUsbOtgAttr_SrpSupp : 0 );			// bmAttributes			
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   568
	iBuf[3] = KUsbOtgDesc_bcdOTG & 0x00ff;
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   569
  iBuf[4] = ( KUsbOtgDesc_bcdOTG >> 8 ) & 0x00ff;
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   570
		
3b97f0de7605 201038_01
hgs
parents: 33
diff changeset
   571
	return KErrNone;
33
089413cdde3c 201028_02
hgs
parents:
diff changeset
   572
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   573
089413cdde3c 201028_02
hgs
parents:
diff changeset
   574
089413cdde3c 201028_02
hgs
parents:
diff changeset
   575
// --- TUsbcClassSpecificDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   576
089413cdde3c 201028_02
hgs
parents:
diff changeset
   577
TUsbcClassSpecificDescriptor::TUsbcClassSpecificDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   578
    : iBuf(NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   579
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   580
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcClassSpecificDescriptor::TUsbcClassSpecificDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   581
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   582
089413cdde3c 201028_02
hgs
parents:
diff changeset
   583
089413cdde3c 201028_02
hgs
parents:
diff changeset
   584
TUsbcClassSpecificDescriptor::~TUsbcClassSpecificDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   585
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   586
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcClassSpecificDescriptor::~TUsbcClassSpecificDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   587
    delete iBuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   588
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   589
089413cdde3c 201028_02
hgs
parents:
diff changeset
   590
089413cdde3c 201028_02
hgs
parents:
diff changeset
   591
TUsbcClassSpecificDescriptor* TUsbcClassSpecificDescriptor::New(TUint8 aType, TInt aSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   592
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   593
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcClassSpecificDescriptor::New()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   594
    TUsbcClassSpecificDescriptor* self = new TUsbcClassSpecificDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   595
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   596
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   597
        if (self->Construct(aType, aSize) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   598
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   599
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   600
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   601
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   602
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   603
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   604
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   605
089413cdde3c 201028_02
hgs
parents:
diff changeset
   606
089413cdde3c 201028_02
hgs
parents:
diff changeset
   607
TInt TUsbcClassSpecificDescriptor::Construct(TUint8 aType, TInt aSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   608
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   609
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcClassSpecificDescriptor::Construct()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   610
    iBuf = HBuf8::New(aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   611
    if (!iBuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   612
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   613
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Allocation of CS desc buffer failed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   614
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   615
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   616
    iBuf->SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   617
    SetBufferPointer(*iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   618
    SetByte(1, aType);                                        // bDescriptorType
089413cdde3c 201028_02
hgs
parents:
diff changeset
   619
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   620
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   621
089413cdde3c 201028_02
hgs
parents:
diff changeset
   622
089413cdde3c 201028_02
hgs
parents:
diff changeset
   623
// --- TUsbcStringDescriptorBase
089413cdde3c 201028_02
hgs
parents:
diff changeset
   624
089413cdde3c 201028_02
hgs
parents:
diff changeset
   625
TUsbcStringDescriptorBase::TUsbcStringDescriptorBase()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   626
    : /*iIndex(0),*/ iSBuf(0), iBufPtr(NULL, 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   627
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   628
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptorBase::TUsbcStringDescriptorBase()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   629
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   630
089413cdde3c 201028_02
hgs
parents:
diff changeset
   631
089413cdde3c 201028_02
hgs
parents:
diff changeset
   632
TUsbcStringDescriptorBase::~TUsbcStringDescriptorBase()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   633
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   634
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptorBase::~TUsbcStringDescriptorBase()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   635
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   636
089413cdde3c 201028_02
hgs
parents:
diff changeset
   637
089413cdde3c 201028_02
hgs
parents:
diff changeset
   638
TUint16 TUsbcStringDescriptorBase::Word(TInt aPosition) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   639
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   640
    if (aPosition <= 1)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   641
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   642
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Word(%d) in string descriptor "
089413cdde3c 201028_02
hgs
parents:
diff changeset
   643
                                          "(TUsbcStringDescriptorBase::Word)", aPosition));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   644
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   645
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   646
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   647
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   648
        // since iBufPtr[0] is actually string descriptor byte index 2,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   649
        // we have to subtract 2 from the absolute position.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   650
        return SWAP_BYTES_16(*reinterpret_cast<const TUint16*>(&iBufPtr[aPosition - 2]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   651
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   652
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   653
089413cdde3c 201028_02
hgs
parents:
diff changeset
   654
089413cdde3c 201028_02
hgs
parents:
diff changeset
   655
void TUsbcStringDescriptorBase::SetWord(TInt aPosition, TUint16 aValue)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   656
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   657
    if (aPosition <= 1)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   658
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   659
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: SetWord(%d) in string descriptor "
089413cdde3c 201028_02
hgs
parents:
diff changeset
   660
                                          "(TUsbcStringDescriptorBase::SetWord)", aPosition));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   661
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   662
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   663
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   664
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   665
        // since iBufPtr[0] is actually string descriptor byte index 2,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   666
        // we have to subtract 2 from the absolute position.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   667
        *reinterpret_cast<TUint16*>(&iBufPtr[aPosition - 2]) = SWAP_BYTES_16(aValue);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   668
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   669
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   670
089413cdde3c 201028_02
hgs
parents:
diff changeset
   671
089413cdde3c 201028_02
hgs
parents:
diff changeset
   672
TInt TUsbcStringDescriptorBase::GetDescriptorData(TUint8* aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   673
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   674
    aBuffer[0] = iSBuf[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   675
    aBuffer[1] = iSBuf[1];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   676
    memcpy(&aBuffer[2], iBufPtr.Ptr(), iBufPtr.Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   677
    return Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   678
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   679
089413cdde3c 201028_02
hgs
parents:
diff changeset
   680
089413cdde3c 201028_02
hgs
parents:
diff changeset
   681
TInt TUsbcStringDescriptorBase::GetDescriptorData(TUint8* aBuffer, TUint aMaxSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   682
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   683
    if (aMaxSize < Size())
089413cdde3c 201028_02
hgs
parents:
diff changeset
   684
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   685
        // No use to copy only half a string
089413cdde3c 201028_02
hgs
parents:
diff changeset
   686
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   687
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   688
    return GetDescriptorData(aBuffer);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   689
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   690
089413cdde3c 201028_02
hgs
parents:
diff changeset
   691
089413cdde3c 201028_02
hgs
parents:
diff changeset
   692
const TDes8& TUsbcStringDescriptorBase::StringData() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   693
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   694
    return iBufPtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   695
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   696
089413cdde3c 201028_02
hgs
parents:
diff changeset
   697
089413cdde3c 201028_02
hgs
parents:
diff changeset
   698
TDes8& TUsbcStringDescriptorBase::StringData()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   699
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   700
    return iBufPtr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   701
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   702
089413cdde3c 201028_02
hgs
parents:
diff changeset
   703
089413cdde3c 201028_02
hgs
parents:
diff changeset
   704
TUint TUsbcStringDescriptorBase::Size() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   705
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   706
    return iSBuf[0];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   707
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   708
089413cdde3c 201028_02
hgs
parents:
diff changeset
   709
089413cdde3c 201028_02
hgs
parents:
diff changeset
   710
void TUsbcStringDescriptorBase::SetBufferPointer(const TDesC8& aDes)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   711
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   712
    iBufPtr.Set(const_cast<TUint8*>(aDes.Ptr()), aDes.Size(), aDes.Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
   713
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   714
089413cdde3c 201028_02
hgs
parents:
diff changeset
   715
089413cdde3c 201028_02
hgs
parents:
diff changeset
   716
// --- TUsbcStringDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   717
089413cdde3c 201028_02
hgs
parents:
diff changeset
   718
TUsbcStringDescriptor::TUsbcStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   719
    : iBuf(NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   720
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   721
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptor::TUsbcStringDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   722
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   723
089413cdde3c 201028_02
hgs
parents:
diff changeset
   724
089413cdde3c 201028_02
hgs
parents:
diff changeset
   725
TUsbcStringDescriptor::~TUsbcStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   726
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   727
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptor::~TUsbcStringDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   728
    delete iBuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   729
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   730
089413cdde3c 201028_02
hgs
parents:
diff changeset
   731
089413cdde3c 201028_02
hgs
parents:
diff changeset
   732
TUsbcStringDescriptor* TUsbcStringDescriptor::New(const TDesC8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   733
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   734
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptor::New"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   735
    TUsbcStringDescriptor* self = new TUsbcStringDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   736
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   737
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   738
        if (self->Construct(aString) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   739
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   740
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   741
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   742
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   743
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   744
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   745
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   746
089413cdde3c 201028_02
hgs
parents:
diff changeset
   747
089413cdde3c 201028_02
hgs
parents:
diff changeset
   748
TInt TUsbcStringDescriptor::Construct(const TDesC8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   749
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   750
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcStringDescriptor::Construct"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   751
    iBuf = HBuf8::New(aString.Size());                        // bytes, not UNICODE chars
089413cdde3c 201028_02
hgs
parents:
diff changeset
   752
    if (!iBuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   753
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   754
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Allocation of string buffer failed"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   755
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   756
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   757
    iBuf->SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   758
    SetBufferPointer(*iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   759
    iBufPtr.Copy(aString);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   760
    iSBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   761
    iSBuf[0] = iBuf->Size() + 2;                            // Bytes
089413cdde3c 201028_02
hgs
parents:
diff changeset
   762
    iSBuf[1] = KUsbDescType_String;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   763
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   764
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   765
089413cdde3c 201028_02
hgs
parents:
diff changeset
   766
089413cdde3c 201028_02
hgs
parents:
diff changeset
   767
// --- TUsbcLangIdDescriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   768
089413cdde3c 201028_02
hgs
parents:
diff changeset
   769
TUsbcLangIdDescriptor::TUsbcLangIdDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   770
    : iBuf(NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   771
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   772
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcLangIdDescriptor::TUsbcLangIdDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   773
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   774
089413cdde3c 201028_02
hgs
parents:
diff changeset
   775
089413cdde3c 201028_02
hgs
parents:
diff changeset
   776
TUsbcLangIdDescriptor::~TUsbcLangIdDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   777
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   778
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcLangIdDescriptor::~TUsbcLangIdDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   779
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   780
089413cdde3c 201028_02
hgs
parents:
diff changeset
   781
089413cdde3c 201028_02
hgs
parents:
diff changeset
   782
TUsbcLangIdDescriptor* TUsbcLangIdDescriptor::New(TUint16 aLangId)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   783
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   784
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcLangIdDescriptor::New"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   785
    TUsbcLangIdDescriptor* self = new TUsbcLangIdDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   786
    if (self)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   787
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   788
        if (self->Construct(aLangId) != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   789
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   790
            delete self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   791
            return NULL;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   792
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   793
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   794
    return self;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   795
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   796
089413cdde3c 201028_02
hgs
parents:
diff changeset
   797
089413cdde3c 201028_02
hgs
parents:
diff changeset
   798
TInt TUsbcLangIdDescriptor::Construct(TUint16 aLangId)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   799
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   800
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcLangIdDescriptor::Construct"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   801
    iBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   802
    SetBufferPointer(iBuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   803
    iBufPtr[0] = LowByte(SWAP_BYTES_16(aLangId));            // Language ID value
089413cdde3c 201028_02
hgs
parents:
diff changeset
   804
    iBufPtr[1] = HighByte(SWAP_BYTES_16(aLangId));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   805
    iSBuf.SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   806
    iSBuf[0] = iBuf.Size() + 2;                                // Bytes
089413cdde3c 201028_02
hgs
parents:
diff changeset
   807
    iSBuf[1] = KUsbDescType_String;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   808
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   809
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   810
089413cdde3c 201028_02
hgs
parents:
diff changeset
   811
089413cdde3c 201028_02
hgs
parents:
diff changeset
   812
// --- TUsbcDescriptorPool
089413cdde3c 201028_02
hgs
parents:
diff changeset
   813
089413cdde3c 201028_02
hgs
parents:
diff changeset
   814
TUsbcDescriptorPool::TUsbcDescriptorPool(TUint8* aEp0_TxBuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   815
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   816
//    The constructor for this class.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   817
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   818
    : iDescriptors(), iStrings(), iIfcIdx(0), iEp0_TxBuf(aEp0_TxBuf), iHighSpeed(EFalse)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   819
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   820
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::TUsbcDescriptorPool()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   821
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   822
089413cdde3c 201028_02
hgs
parents:
diff changeset
   823
089413cdde3c 201028_02
hgs
parents:
diff changeset
   824
TUsbcDescriptorPool::~TUsbcDescriptorPool()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   825
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   826
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::~TUsbcDescriptorPool()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   827
    // The destructor of each <class T> object is called before the objects themselves are destroyed.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   828
    __KTRACE_OPT(KUSB, Kern::Printf("  iDescriptors.Count(): %d", iDescriptors.Count()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   829
    iDescriptors.ResetAndDestroy();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   830
    __KTRACE_OPT(KUSB, Kern::Printf("  iStrings.Count(): %d", iStrings.Count()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   831
    iStrings.ResetAndDestroy();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   832
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   833
089413cdde3c 201028_02
hgs
parents:
diff changeset
   834
089413cdde3c 201028_02
hgs
parents:
diff changeset
   835
TInt TUsbcDescriptorPool::Init(TUsbcDeviceDescriptor* aDeviceDesc, TUsbcConfigDescriptor* aConfigDesc,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   836
                               TUsbcLangIdDescriptor* aLangId, TUsbcStringDescriptor* aManufacturer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   837
                               TUsbcStringDescriptor* aProduct, TUsbcStringDescriptor* aSerialNum,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   838
                               TUsbcStringDescriptor* aConfig, TUsbcOtgDescriptor* aOtgDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   839
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   840
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::Init()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   841
    if (!aDeviceDesc || !aConfigDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   842
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   843
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: No Device or Config descriptor specified"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   844
        return KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   845
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   846
    for (TInt n = 0; n < KDescPosition_FirstAvailable; n++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   847
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   848
        iDescriptors.Append(NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   849
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   850
    __ASSERT_DEBUG((iDescriptors.Count() == KDescPosition_FirstAvailable),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   851
                   Kern::Printf("  Error: iDescriptors.Count() (%d) != KDescPosition_FirstAvailable (%d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
   852
                                iDescriptors.Count(), KDescPosition_FirstAvailable));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   853
    iDescriptors[KDescPosition_Device] = aDeviceDesc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   854
    iDescriptors[KDescPosition_Config] = aConfigDesc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   855
    if (aOtgDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   856
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   857
        iDescriptors[KDescPosition_Otg] = aOtgDesc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   858
        // Update the config descriptor's wTotalLength field
089413cdde3c 201028_02
hgs
parents:
diff changeset
   859
        UpdateConfigDescriptorLength(KUsbDescSize_Otg);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   860
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   861
    if (!aLangId)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   862
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   863
        // USB spec 9.6.7 says: "String index zero for all languages returns a string descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
   864
        // that contains an array of two-byte LANGID codes supported by the device. ...
089413cdde3c 201028_02
hgs
parents:
diff changeset
   865
        // USB devices that omit all string descriptors must not return an array of LANGID codes."
089413cdde3c 201028_02
hgs
parents:
diff changeset
   866
        // So if we have at least one string descriptor, we must also have a LANGID descriptor.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   867
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: No LANGID string descriptor specified"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   868
        return KErrArgument;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   869
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   870
    iStrings.Insert(aLangId, KStringPosition_Langid);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   871
    iStrings.Insert(aManufacturer, KStringPosition_Manufact);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   872
    iStrings.Insert(aProduct, KStringPosition_Product);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   873
    iStrings.Insert(aSerialNum, KStringPosition_Serial);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   874
    iStrings.Insert(aConfig, KStringPosition_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   875
    __ASSERT_DEBUG((iStrings.Count() == 5),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   876
                   Kern::Printf("  Error: iStrings.Count() != 5 (%d)", iStrings.Count()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   877
#ifdef _DEBUG
089413cdde3c 201028_02
hgs
parents:
diff changeset
   878
    for (TInt i = KStringPosition_Langid; i <= KStringPosition_Config; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   879
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   880
        __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool.iStrings[%d] = 0x%x", i, iStrings[i]));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   881
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   882
#endif
089413cdde3c 201028_02
hgs
parents:
diff changeset
   883
    // Set string indices
089413cdde3c 201028_02
hgs
parents:
diff changeset
   884
    if (aManufacturer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   885
        iDescriptors[KDescPosition_Device]->SetByte(KUsbDescStringIndex_Manufact,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   886
                                                    KStringPosition_Manufact);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   887
    if (aProduct)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   888
        iDescriptors[KDescPosition_Device]->SetByte(KUsbDescStringIndex_Product,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   889
                                                    KStringPosition_Product);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   890
    if (aSerialNum)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   891
        iDescriptors[KDescPosition_Device]->SetByte(KUsbDescStringIndex_Serial,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   892
                                                    KStringPosition_Serial);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   893
    if (aConfig)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   894
        iDescriptors[KDescPosition_Config]->SetByte(KUsbDescStringIndex_Config,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   895
                                                    KStringPosition_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   896
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   897
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   898
089413cdde3c 201028_02
hgs
parents:
diff changeset
   899
089413cdde3c 201028_02
hgs
parents:
diff changeset
   900
TInt TUsbcDescriptorPool::InitHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   901
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   902
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::InitHs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   903
    __ASSERT_DEBUG((iDescriptors.Count() >= KDescPosition_FirstAvailable),
089413cdde3c 201028_02
hgs
parents:
diff changeset
   904
                   Kern::Printf("  Error: Call Init() first)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   905
089413cdde3c 201028_02
hgs
parents:
diff changeset
   906
    TUsbcDeviceQualifierDescriptor* const dq_desc = TUsbcDeviceQualifierDescriptor::New(
089413cdde3c 201028_02
hgs
parents:
diff changeset
   907
        iDescriptors[KDescPosition_Device]->Byte(4),        // aDeviceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   908
        iDescriptors[KDescPosition_Device]->Byte(5),        // aDeviceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
   909
        iDescriptors[KDescPosition_Device]->Byte(6),        // aDeviceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
   910
        iDescriptors[KDescPosition_Device]->Byte(7),        // aMaxPacketSize0
089413cdde3c 201028_02
hgs
parents:
diff changeset
   911
        iDescriptors[KDescPosition_Device]->Byte(17));        // aNumConfigurations
089413cdde3c 201028_02
hgs
parents:
diff changeset
   912
    if (!dq_desc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   913
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   914
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for dev qualif desc failed."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   915
        return KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   916
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   917
    iDescriptors[KDescPosition_DeviceQualifier] = dq_desc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   918
089413cdde3c 201028_02
hgs
parents:
diff changeset
   919
    TUsbcOtherSpeedConfigDescriptor* const osc_desc = TUsbcOtherSpeedConfigDescriptor::New(
089413cdde3c 201028_02
hgs
parents:
diff changeset
   920
        iDescriptors[KDescPosition_Config]->Byte(5),        // aConfigurationValue
089413cdde3c 201028_02
hgs
parents:
diff changeset
   921
        iDescriptors[KDescPosition_Config]->Byte(7) & KUsbDevAttr_SelfPowered, // aSelfPowered
089413cdde3c 201028_02
hgs
parents:
diff changeset
   922
        iDescriptors[KDescPosition_Config]->Byte(7) & KUsbDevAttr_RemoteWakeup,    // aRemoteWakeup
089413cdde3c 201028_02
hgs
parents:
diff changeset
   923
        iDescriptors[KDescPosition_Config]->Byte(8) * 2);    // aMaxPower (mA)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   924
    if (!osc_desc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   925
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   926
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for other speed conf desc failed."));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   927
        return KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   928
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   929
089413cdde3c 201028_02
hgs
parents:
diff changeset
   930
    // We need to set the bDescriptorType field manually, as that's the only one
089413cdde3c 201028_02
hgs
parents:
diff changeset
   931
    // that differs from a Configuration descriptor.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   932
    osc_desc->SetByte(1, KUsbDescType_OtherSpeedConfig);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   933
089413cdde3c 201028_02
hgs
parents:
diff changeset
   934
    // Also, initially we set the iConfiguration string index to the same value as
089413cdde3c 201028_02
hgs
parents:
diff changeset
   935
    // in the Configuration descriptor.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   936
    osc_desc->SetByte(KUsbDescStringIndex_Config,
089413cdde3c 201028_02
hgs
parents:
diff changeset
   937
                      iDescriptors[KDescPosition_Config]->Byte(KUsbDescStringIndex_Config));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   938
089413cdde3c 201028_02
hgs
parents:
diff changeset
   939
    iDescriptors[KDescPosition_OtherSpeedConfig] = osc_desc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   940
089413cdde3c 201028_02
hgs
parents:
diff changeset
   941
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   942
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   943
089413cdde3c 201028_02
hgs
parents:
diff changeset
   944
089413cdde3c 201028_02
hgs
parents:
diff changeset
   945
TInt TUsbcDescriptorPool::UpdateDescriptorsFs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   946
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   947
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::UpdateDescriptorsFs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   948
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   949
    for (TInt i = KDescPosition_FirstAvailable; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   950
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   951
        TUsbcDescriptorBase* const ptr = iDescriptors[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   952
        ptr->UpdateFs();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   953
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   954
    iHighSpeed = EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   955
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   956
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   957
089413cdde3c 201028_02
hgs
parents:
diff changeset
   958
089413cdde3c 201028_02
hgs
parents:
diff changeset
   959
TInt TUsbcDescriptorPool::UpdateDescriptorsHs()
089413cdde3c 201028_02
hgs
parents:
diff changeset
   960
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   961
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::UpdateDescriptorsHs()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   962
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   963
    for (TInt i = KDescPosition_FirstAvailable; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   964
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   965
        TUsbcDescriptorBase* const ptr = iDescriptors[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
   966
        ptr->UpdateHs();
089413cdde3c 201028_02
hgs
parents:
diff changeset
   967
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   968
    iHighSpeed = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   969
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   970
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   971
089413cdde3c 201028_02
hgs
parents:
diff changeset
   972
089413cdde3c 201028_02
hgs
parents:
diff changeset
   973
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   974
// An error can be indicated by either a return value != KErrNone or by a descriptor size == 0.
089413cdde3c 201028_02
hgs
parents:
diff changeset
   975
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
   976
TInt TUsbcDescriptorPool::FindDescriptor(TUint8 aType, TUint8 aIndex, TUint16 aLangid, TInt& aSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
   977
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   978
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::FindDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   979
    TInt result = KErrGeneral;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   980
    switch (aType)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   981
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   982
    case KUsbDescType_Device:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   983
        if (aLangid != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   984
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   985
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad langid: 0x%04x", aLangid));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   986
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   987
        else if (aIndex > 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   988
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   989
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad device index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
   990
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   991
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
   992
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
   993
            aSize = GetDeviceDescriptor(KDescPosition_Device);
089413cdde3c 201028_02
hgs
parents:
diff changeset
   994
            result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   995
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
   996
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
   997
    case KUsbDescType_Config:
089413cdde3c 201028_02
hgs
parents:
diff changeset
   998
        if (aLangid != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
   999
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1000
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad langid: 0x%04x", aLangid));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1001
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1002
        else if (aIndex > 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1003
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1004
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad config index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1005
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1006
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1007
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1008
            aSize = GetConfigurationDescriptor(KDescPosition_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1009
            result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1010
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1011
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1012
    case KUsbDescType_DeviceQualifier:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1013
        if (aLangid != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1014
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1015
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad langid: 0x%04x", aLangid));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1016
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1017
        else if (aIndex > 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1018
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1019
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad device index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1020
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1021
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1022
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1023
            aSize = GetDeviceDescriptor(KDescPosition_DeviceQualifier);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1024
            result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1025
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1026
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1027
    case KUsbDescType_OtherSpeedConfig:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1028
        if (aLangid != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1029
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1030
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad langid: 0x%04x", aLangid));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1031
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1032
        else if (aIndex > 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1033
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1034
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bad config index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1035
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1036
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1037
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1038
            aSize = GetConfigurationDescriptor(KDescPosition_OtherSpeedConfig);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1039
            result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1040
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1041
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1042
    case KUsbDescType_Otg:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1043
        aSize = GetOtgDescriptor();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1044
        result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1045
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1046
    case KUsbDescType_String:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1047
        if (aIndex == 0)                                    // 0 addresses the LangId array
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1048
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1049
            if (AnyStringDescriptors())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1050
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1051
                aSize = GetStringDescriptor(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1052
                result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1053
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1054
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1055
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1056
                __KTRACE_OPT(KUSB, Kern::Printf("  No string descriptors: not returning LANGID array"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1057
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1058
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1059
        else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1060
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1061
               if (!aLangid)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1062
                   {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1063
                   __KTRACE_OPT(KUSB,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1064
                              Kern::Printf("  Strange: LANGID=0 for a $ descriptor (ignoring LANGID)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1065
                // The USB spec doesn't really say what to do in this case, but as there are host apps
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1066
                // that fail if we return an error here, we choose to ignore the issue.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1067
                   }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1068
            else if (aLangid != iStrings[KStringPosition_Langid]->Word(2))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1069
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1070
                // We have only one (this) language
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1071
                __KTRACE_OPT(KUSB,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1072
                             Kern::Printf("  Bad LANGID: 0x%04X requested, 0x%04X supported (ignoring LANGID)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1073
                                          aLangid, iStrings[KStringPosition_Langid]->Word(2)));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1074
                // We could return an error here, but rather choose to ignore the discrepancy
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1075
                // (the USB spec is not very clear what to do in such a case anyway).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1076
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1077
            aSize = GetStringDescriptor(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1078
            result = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1079
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1080
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1081
    case KUsbDescType_CS_Interface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1082
        /* fall through */
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1083
    case KUsbDescType_CS_Endpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1084
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: finding of class specific descriptors not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1085
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1086
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1087
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: unknown descriptor type requested: %d", aType));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1088
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1089
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1090
    return result;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1091
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1092
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1093
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1094
void TUsbcDescriptorPool::InsertDescriptor(TUsbcDescriptorBase* aDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1095
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1096
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::InsertDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1097
    switch (aDesc->Type())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1098
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1099
    case KUsbDescType_Interface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1100
        InsertIfcDesc(aDesc);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1101
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1102
    case KUsbDescType_Endpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1103
        InsertEpDesc(aDesc);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1104
        break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1105
    default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1106
        __KTRACE_OPT(KUSB, Kern::Printf("  Error: unsupported descriptor type"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1107
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1108
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1109
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1110
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1111
void TUsbcDescriptorPool::SetIfcStringDescriptor(TUsbcStringDescriptor* aDesc, TInt aNumber, TInt aSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1112
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1113
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetIfcDescriptor(%d, %d)", aNumber, aSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1114
    const TInt i = FindIfcDescriptor(aNumber, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1115
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1116
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1117
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Ifc descriptor not found (%d, %d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1118
                                          aNumber, aSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1119
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1120
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1121
    // Try to find available NULL postition
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1122
    TInt str_idx = FindAvailableStringPos();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1123
    if (str_idx >= 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1124
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1125
        // Insert string descriptor for specified interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1126
        ExchangeStringDescriptor(str_idx, aDesc);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1127
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1128
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1129
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1130
        // No NULL found - expand array
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1131
        str_idx = iStrings.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1132
        if (str_idx > 0xff)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1133
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1134
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: $ descriptor array full (idx=%d)", str_idx));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1135
            return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1136
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1137
        while (str_idx < KStringPosition_FirstAvailable)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1138
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1139
            iStrings.Append(NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1140
            str_idx = iStrings.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1141
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1142
        // Append string descriptor for specified interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1143
        iStrings.Append(aDesc);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1144
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1145
    // Update this ifc descriptor's string index field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1146
    iDescriptors[i]->SetByte(8, str_idx);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1147
    __KTRACE_OPT(KUSB, Kern::Printf("  String for ifc %d/%d (@ pos %d): \"%S\"", aNumber, aSetting, str_idx,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1148
                                    &iStrings[str_idx]->StringData()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1149
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1150
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1151
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1152
void TUsbcDescriptorPool::DeleteIfcDescriptor(TInt aNumber, TInt aSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1153
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1154
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::DeleteIfcDescriptor(%d, %d)", aNumber, aSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1155
    const TInt i = FindIfcDescriptor(aNumber, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1156
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1157
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1158
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: DeleteIfcDescriptor - descriptor not found (%d, %d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1159
                                          aNumber, aSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1160
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1161
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1162
    // Delete (if necessary) specified interface's string descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1163
    const TInt si = iDescriptors[i]->Byte(8);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1164
    if (si != 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1165
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1166
        ExchangeStringDescriptor(si, NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1167
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1168
    // Delete specified ifc setting + all its cs descriptors + all its endpoints + all their cs descriptors:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1169
    // find position of the next interface descriptor: we need to delete everything in between
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1170
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1171
    TInt j = i, n = 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1172
    while (++j < count && iDescriptors[j]->Type() != KUsbDescType_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1173
        ++n;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1174
    DeleteDescriptors(i, n);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1175
    // Update all the following interfaces' bInterfaceNumber field if required
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1176
    // (because those descriptors might have moved down by one position)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1177
    UpdateIfcNumbers(aNumber);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1178
    iIfcIdx = 0;                                            // ifc index no longer valid
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1179
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1180
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1181
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1182
// The TC in many of the following functions stands for 'ThreadCopy',
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1183
// because that's what's happening there.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1184
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1185
TInt TUsbcDescriptorPool::GetDeviceDescriptorTC(DThread* aThread, TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1186
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1187
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetDeviceDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1188
    return Kern::ThreadDesWrite(aThread, &aBuffer, iDescriptors[KDescPosition_Device]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1189
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1190
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1191
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1192
TInt TUsbcDescriptorPool::SetDeviceDescriptorTC(DThread* aThread, const TDes8& aBuffer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1193
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1194
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetDeviceDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1195
    TBuf8<KUsbDescSize_Device> device;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1196
    const TInt r = Kern::ThreadDesRead(aThread, &aBuffer, device, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1197
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1198
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1199
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1200
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1201
    iDescriptors[KDescPosition_Device]->SetByte(2, device[2]); // bcdUSB
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1202
    iDescriptors[KDescPosition_Device]->SetByte(3, device[3]); // bcdUSB (part II)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1203
    iDescriptors[KDescPosition_Device]->SetByte(4, device[4]); // bDeviceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1204
    iDescriptors[KDescPosition_Device]->SetByte(5, device[5]); // bDeviceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1205
    iDescriptors[KDescPosition_Device]->SetByte(6, device[6]); // bDeviceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1206
    iDescriptors[KDescPosition_Device]->SetByte(8, device[8]); // idVendor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1207
    iDescriptors[KDescPosition_Device]->SetByte(9, device[9]); // idVendor (part II)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1208
    iDescriptors[KDescPosition_Device]->SetByte(10, device[10]); // idProduct
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1209
    iDescriptors[KDescPosition_Device]->SetByte(11, device[11]); // idProduct (part II)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1210
    iDescriptors[KDescPosition_Device]->SetByte(12, device[12]); // bcdDevice
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1211
    iDescriptors[KDescPosition_Device]->SetByte(13, device[13]); // bcdDevice (part II)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1212
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1213
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1214
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1215
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1216
TInt TUsbcDescriptorPool::GetConfigurationDescriptorTC(DThread* aThread, TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1217
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1218
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetConfigurationDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1219
    return Kern::ThreadDesWrite(aThread, &aBuffer, iDescriptors[KDescPosition_Config]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1220
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1221
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1222
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1223
TInt TUsbcDescriptorPool::SetConfigurationDescriptorTC(DThread* aThread, const TDes8& aBuffer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1224
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1225
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetConfigurationDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1226
    TBuf8<KUsbDescSize_Config> config;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1227
    const TInt r = Kern::ThreadDesRead(aThread, &aBuffer, config, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1228
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1229
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1230
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1231
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1232
    iDescriptors[KDescPosition_Config]->SetByte(7, config[7]); // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1233
    iDescriptors[KDescPosition_Config]->SetByte(8, config[8]); // bMaxPower
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1234
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1235
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1236
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1237
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1238
TInt TUsbcDescriptorPool::GetOtgDescriptorTC(DThread* aThread, TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1239
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1240
    return Kern::ThreadDesWrite(aThread, &aBuffer, iDescriptors[KDescPosition_Otg]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1241
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1242
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1243
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1244
TInt TUsbcDescriptorPool::SetOtgDescriptor(const TDesC8& aBuffer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1245
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1246
    iDescriptors[KDescPosition_Otg]->SetByte(2, aBuffer[2]); // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1247
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1248
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1249
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1250
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1251
TInt TUsbcDescriptorPool::GetInterfaceDescriptorTC(DThread* aThread, TDes8& aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1252
                                                   TInt aInterface, TInt aSetting) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1253
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1254
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetInterfaceDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1255
    const TInt i = FindIfcDescriptor(aInterface, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1256
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1257
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1258
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1259
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1260
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1261
    return Kern::ThreadDesWrite(aThread, &aBuffer, iDescriptors[i]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1262
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1263
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1264
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1265
TInt TUsbcDescriptorPool::SetInterfaceDescriptor(const TDes8& aBuffer, TInt aInterface, TInt aSetting)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1266
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1267
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetInterfaceDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1268
    const TInt i = FindIfcDescriptor(aInterface, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1269
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1270
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1271
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1272
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1273
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1274
    iDescriptors[i]->SetByte(2, aBuffer[2]);                // bInterfaceNumber
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1275
    iDescriptors[i]->SetByte(5, aBuffer[5]);                // bInterfaceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1276
    iDescriptors[i]->SetByte(6, aBuffer[6]);                // bInterfaceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1277
    iDescriptors[i]->SetByte(7, aBuffer[7]);                // bInterfaceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1278
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1279
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1280
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1281
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1282
TInt TUsbcDescriptorPool::GetEndpointDescriptorTC(DThread* aThread, TDes8& aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1283
                                                  TInt aInterface, TInt aSetting, TUint8 aEndpointAddress) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1284
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1285
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetEndpointDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1286
    const TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1287
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1288
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1289
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1290
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1291
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1292
    return Kern::ThreadDesWrite(aThread, &aBuffer, iDescriptors[i]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1293
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1294
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1295
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1296
TInt TUsbcDescriptorPool::SetEndpointDescriptorTC(DThread* aThread, const TDes8& aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1297
                                                  TInt aInterface, TInt aSetting, TUint8 aEndpointAddress)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1298
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1299
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetEndpointDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1300
    const TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1301
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1302
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1303
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1304
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1305
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1306
    TBuf8<KUsbDescSize_AudioEndpoint> ep;                    // it could be an audio endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1307
    const TInt r = Kern::ThreadDesRead(aThread, &aBuffer, ep, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1308
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1309
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1310
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1311
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1312
    iDescriptors[i]->SetByte(3, ep[3]);                        // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1313
    iDescriptors[i]->SetByte(6, ep[6]);                        // bInterval
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1314
    if (iDescriptors[i]->Size() == KUsbDescSize_AudioEndpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1315
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1316
        iDescriptors[i]->SetByte(7, ep[7]);                    // bRefresh
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1317
        iDescriptors[i]->SetByte(8, ep[8]);                    // bSynchAddress
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1318
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1319
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1320
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1321
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1322
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1323
TInt TUsbcDescriptorPool::GetEndpointDescriptorSize(TInt aInterface, TInt aSetting, TUint8 aEndpointAddress,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1324
                                                    TInt& aSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1325
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1326
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetEndpointDescriptorSize()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1327
    const TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1328
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1329
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1330
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1331
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1332
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1333
    aSize = iDescriptors[i]->Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1334
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1335
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1336
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1337
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1338
TInt TUsbcDescriptorPool::GetDeviceQualifierDescriptorTC(DThread* aThread, TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1339
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1340
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetDeviceQualifierDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1341
    if (iDescriptors[KDescPosition_DeviceQualifier] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1342
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1343
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Device_Qualifier descriptor not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1344
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1345
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1346
    return Kern::ThreadDesWrite(aThread, &aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1347
                                iDescriptors[KDescPosition_DeviceQualifier]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1348
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1349
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1350
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1351
TInt TUsbcDescriptorPool::SetDeviceQualifierDescriptorTC(DThread* aThread, const TDes8& aBuffer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1352
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1353
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetDeviceQualifierDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1354
    if (iDescriptors[KDescPosition_DeviceQualifier] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1355
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1356
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Device_Qualifier descriptor not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1357
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1358
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1359
    TBuf8<KUsbDescSize_DeviceQualifier> device;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1360
    const TInt r = Kern::ThreadDesRead(aThread, &aBuffer, device, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1361
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1362
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1363
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1364
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1365
    iDescriptors[KDescPosition_DeviceQualifier]->SetByte(2, device[2]); // bcdUSB
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1366
    iDescriptors[KDescPosition_DeviceQualifier]->SetByte(3, device[3]); // bcdUSB (part II)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1367
    iDescriptors[KDescPosition_DeviceQualifier]->SetByte(4, device[4]); // bDeviceClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1368
    iDescriptors[KDescPosition_DeviceQualifier]->SetByte(5, device[5]); // bDeviceSubClass
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1369
    iDescriptors[KDescPosition_DeviceQualifier]->SetByte(6, device[6]); // bDeviceProtocol
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1370
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1371
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1372
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1373
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1374
TInt TUsbcDescriptorPool::GetOtherSpeedConfigurationDescriptorTC(DThread* aThread, TDes8& aBuffer) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1375
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1376
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetOtherSpeedConfigurationDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1377
    if (iDescriptors[KDescPosition_OtherSpeedConfig] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1378
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1379
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Other_Speed_Configuration descriptor not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1380
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1381
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1382
    return Kern::ThreadDesWrite(aThread, &aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1383
                                iDescriptors[KDescPosition_OtherSpeedConfig]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1384
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1385
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1386
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1387
TInt TUsbcDescriptorPool::SetOtherSpeedConfigurationDescriptorTC(DThread* aThread, const TDes8& aBuffer)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1388
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1389
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetOtherSpeedConfigurationDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1390
    if (iDescriptors[KDescPosition_OtherSpeedConfig] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1391
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1392
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Other_Speed_Configuration descriptor not supported"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1393
        return KErrNotSupported;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1394
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1395
    TBuf8<KUsbDescSize_OtherSpeedConfig> config;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1396
    const TInt r = Kern::ThreadDesRead(aThread, &aBuffer, config, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1397
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1398
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1399
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1400
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1401
    iDescriptors[KDescPosition_OtherSpeedConfig]->SetByte(7, config[7]); // bmAttributes
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1402
    iDescriptors[KDescPosition_OtherSpeedConfig]->SetByte(8, config[8]); // bMaxPower
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1403
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1404
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1405
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1406
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1407
TInt TUsbcDescriptorPool::GetCSInterfaceDescriptorTC(DThread* aThread, TDes8& aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1408
                                                     TInt aInterface, TInt aSetting) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1409
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1410
    // first find the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1411
    TInt i = FindIfcDescriptor(aInterface, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1412
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1413
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1414
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1415
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1416
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1417
    TInt r = KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1418
    TInt offset = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1419
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1420
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1421
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1422
        r = Kern::ThreadDesWrite(aThread, &aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1423
                                 iDescriptors[i]->DescriptorData(), offset);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1424
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1425
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1426
        offset += iDescriptors[i]->Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1427
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1428
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1429
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1430
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1431
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1432
TInt TUsbcDescriptorPool::SetCSInterfaceDescriptorTC(DThread* aThread, const TDes8& aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1433
                                                     TInt aInterface, TInt aSetting, TInt aSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1434
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1435
    // First find the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1436
    TInt i = FindIfcDescriptor(aInterface, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1437
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1438
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1439
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1440
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1441
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1442
    // Find a position where to insert the new class specific interface descriptor(s)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1443
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1444
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1445
        ;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1446
    // Create a new cs descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1447
    TUsbcClassSpecificDescriptor* desc = TUsbcClassSpecificDescriptor::New(KUsbDescType_CS_Interface, aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1448
    if (!desc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1449
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1450
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1451
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1452
    __KTRACE_OPT(KUSB, Kern::Printf("  inserting descriptor at position %d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1453
    iDescriptors.Insert(desc, i);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1454
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1455
    // Update the config descriptor's wTotalLength field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1456
    UpdateConfigDescriptorLength(aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1457
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1458
    // Copy contents from the user side
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1459
    return Kern::ThreadDesRead(aThread, &aBuffer, iDescriptors[i]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1460
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1461
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1462
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1463
TInt TUsbcDescriptorPool::GetCSInterfaceDescriptorSize(TInt aInterface, TInt aSetting, TInt& aSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1464
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1465
    // first find the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1466
    TInt i = FindIfcDescriptor(aInterface, aSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1467
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1468
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1469
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1470
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1471
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1472
    TInt r = KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1473
    TInt size = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1474
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1475
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1476
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1477
        size += iDescriptors[i]->Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1478
        r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1479
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1480
    if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1481
        aSize = size;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1482
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1483
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1484
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1485
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1486
TInt TUsbcDescriptorPool::GetCSEndpointDescriptorTC(DThread* aThread, TDes8& aBuffer, TInt aInterface,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1487
                                                    TInt aSetting, TUint8 aEndpointAddress) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1488
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1489
    // first find the endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1490
    TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1491
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1492
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1493
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1494
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1495
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1496
    TInt r = KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1497
    TInt offset = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1498
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1499
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Endpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1500
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1501
        r = Kern::ThreadDesWrite(aThread, &aBuffer,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1502
                                 iDescriptors[i]->DescriptorData(), offset);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1503
        if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1504
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1505
        offset += iDescriptors[i]->Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1506
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1507
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1508
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1509
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1510
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1511
TInt TUsbcDescriptorPool::SetCSEndpointDescriptorTC(DThread* aThread, const TDes8& aBuffer, TInt aInterface,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1512
                                                    TInt aSetting, TUint8 aEndpointAddress, TInt aSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1513
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1514
    // first find the endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1515
    TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1516
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1517
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1518
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1519
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1520
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1521
    // find a position where to insert the new class specific endpoint descriptor(s)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1522
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1523
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Endpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1524
        ;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1525
    // create a new cs descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1526
    TUsbcClassSpecificDescriptor* desc = TUsbcClassSpecificDescriptor::New(KUsbDescType_CS_Endpoint, aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1527
    if (!desc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1528
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1529
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1530
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1531
    iDescriptors.Insert(desc, i);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1532
    // update the config descriptor's wTotalLength field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1533
    UpdateConfigDescriptorLength(aSize);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1534
    // copy contents from user side
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1535
    return Kern::ThreadDesRead(aThread, &aBuffer, iDescriptors[i]->DescriptorData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1536
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1537
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1538
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1539
TInt TUsbcDescriptorPool::GetCSEndpointDescriptorSize(TInt aInterface, TInt aSetting,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1540
                                                      TUint8 aEndpointAddress, TInt& aSize) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1541
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1542
    // first find the endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1543
    TInt i = FindEpDescriptor(aInterface, aSetting, aEndpointAddress);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1544
    if (i < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1545
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1546
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1547
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1548
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1549
    TInt r = KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1550
    TInt size = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1551
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1552
    while (++i < count && iDescriptors[i]->Type() == KUsbDescType_CS_Endpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1553
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1554
        size += iDescriptors[i]->Size();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1555
        r = KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1556
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1557
    if (r == KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1558
        aSize = size;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1559
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1560
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1561
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1562
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1563
TInt TUsbcDescriptorPool::GetStringDescriptorLangIdTC(DThread* aThread, TDes8& aLangId) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1564
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1565
    const TUint16 id = iStrings[KStringPosition_Langid]->Word(2);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1566
    const TPtrC8 id_des(reinterpret_cast<const TUint8*>(&id), sizeof(id));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1567
    return Kern::ThreadDesWrite(aThread, &aLangId, id_des, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1568
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1569
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1570
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1571
TInt TUsbcDescriptorPool::SetStringDescriptorLangId(TUint16 aLangId)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1572
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1573
    iStrings[KStringPosition_Langid]->SetWord(2, aLangId);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1574
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1575
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1576
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1577
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1578
TInt TUsbcDescriptorPool::GetManufacturerStringDescriptorTC(DThread* aThread, TDes8& aString) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1579
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1580
    return GetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Manufact,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1581
                                       KStringPosition_Manufact);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1582
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1583
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1584
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1585
TInt TUsbcDescriptorPool::SetManufacturerStringDescriptorTC(DThread* aThread, const TDes8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1586
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1587
    return SetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Manufact,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1588
                                       KStringPosition_Manufact);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1589
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1590
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1591
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1592
TInt TUsbcDescriptorPool::RemoveManufacturerStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1593
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1594
    return RemoveDeviceStringDescriptor(KUsbDescStringIndex_Manufact, KStringPosition_Manufact);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1595
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1596
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1597
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1598
TInt TUsbcDescriptorPool::GetProductStringDescriptorTC(DThread* aThread, TDes8& aString) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1599
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1600
    return GetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Product,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1601
                                       KStringPosition_Product);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1602
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1603
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1604
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1605
TInt TUsbcDescriptorPool::SetProductStringDescriptorTC(DThread* aThread, const TDes8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1606
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1607
    return SetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Product,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1608
                                       KStringPosition_Product);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1609
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1610
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1611
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1612
TInt TUsbcDescriptorPool::RemoveProductStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1613
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1614
    return RemoveDeviceStringDescriptor(KUsbDescStringIndex_Product, KStringPosition_Product);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1615
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1616
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1617
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1618
TInt TUsbcDescriptorPool::GetSerialNumberStringDescriptorTC(DThread* aThread, TDes8& aString) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1619
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1620
    return GetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Serial,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1621
                                       KStringPosition_Serial);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1622
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1623
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1624
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1625
TInt TUsbcDescriptorPool::SetSerialNumberStringDescriptorTC(DThread* aThread, const TDes8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1626
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1627
    return SetDeviceStringDescriptorTC(aThread, aString, KUsbDescStringIndex_Serial,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1628
                                       KStringPosition_Serial);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1629
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1630
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1631
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1632
TInt TUsbcDescriptorPool::RemoveSerialNumberStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1633
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1634
    return RemoveDeviceStringDescriptor(KUsbDescStringIndex_Serial, KStringPosition_Serial);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1635
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1636
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1637
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1638
TInt TUsbcDescriptorPool::GetConfigurationStringDescriptorTC(DThread* aThread, TDes8& aString) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1639
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1640
    const TInt str_idx = iDescriptors[KDescPosition_Config]->Byte(KUsbDescStringIndex_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1641
    if (str_idx)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1642
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1643
        __ASSERT_ALWAYS((str_idx == KStringPosition_Config), Kern::Fault(KUsbPanicCat, __LINE__));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1644
        __KTRACE_OPT(KUSB, Kern::Printf("  String @ pos %d (conf $): \"%S\"",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1645
                                        str_idx, &iStrings[str_idx]->StringData()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1646
        return Kern::ThreadDesWrite(aThread, &aString,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1647
                                    iStrings[str_idx]->StringData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1648
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1649
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1650
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1651
        __KTRACE_OPT(KUSB, Kern::Printf("  No config string descriptor @ pos %d", str_idx));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1652
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1653
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1654
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1655
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1656
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1657
TInt TUsbcDescriptorPool::SetConfigurationStringDescriptorTC(DThread* aThread, const TDes8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1658
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1659
    // we don't know the length of the string, so we have to allocate memory dynamically
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1660
    TUint strlen = Kern::ThreadGetDesLength(aThread, &aString);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1661
    if (strlen > KUsbStringDescStringMaxSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1662
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1663
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: config $ descriptor too long - will be truncated"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1664
        strlen = KUsbStringDescStringMaxSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1665
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1666
    HBuf8* const strbuf = HBuf8::New(strlen);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1667
    if (!strbuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1668
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1669
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for config $ desc string failed (1)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1670
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1671
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1672
    strbuf->SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1673
    // the aString points to data that lives in user memory, so we have to copy it:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1674
    const TInt r = Kern::ThreadDesRead(aThread, &aString, *strbuf, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1675
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1676
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1677
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Thread read error"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1678
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1679
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1680
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1681
    TUsbcStringDescriptor* sd = TUsbcStringDescriptor::New(*strbuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1682
    if (!sd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1683
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1684
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for config $ desc failed (2)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1685
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1686
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1687
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1688
    // Delete old string, put in new one
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1689
    ExchangeStringDescriptor(KStringPosition_Config, sd);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1690
    // Update Config descriptor string index field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1691
    iDescriptors[KDescPosition_Config]->SetByte(KUsbDescStringIndex_Config, KStringPosition_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1692
    // Update Other_Speed_Config descriptor string index field as well, if applicable
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1693
    if (iDescriptors[KDescPosition_OtherSpeedConfig])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1694
        iDescriptors[KDescPosition_OtherSpeedConfig]->SetByte(KUsbDescStringIndex_Config,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1695
                                                              KStringPosition_Config);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1696
    delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1697
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1698
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1699
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1700
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1701
TInt TUsbcDescriptorPool::RemoveConfigurationStringDescriptor()
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1702
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1703
    if (iDescriptors[KDescPosition_Config]->Byte(KUsbDescStringIndex_Config) == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1704
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1705
        __KTRACE_OPT(KUSB, Kern::Printf("  RemoveConfigurationStringDescriptor: no $ desc @ index %d",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1706
                                        KUsbDescStringIndex_Config));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1707
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1708
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1709
    // Delete old string, put in NULL pointer
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1710
    ExchangeStringDescriptor(KStringPosition_Config, NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1711
    // Update Config descriptor string index field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1712
    iDescriptors[KDescPosition_Config]->SetByte(KUsbDescStringIndex_Config, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1713
    // Update Other_Speed_Config descriptor string index field as well, if applicable
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1714
    if (iDescriptors[KDescPosition_OtherSpeedConfig])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1715
        iDescriptors[KDescPosition_OtherSpeedConfig]->SetByte(KUsbDescStringIndex_Config, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1716
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1717
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1718
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1719
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1720
TInt TUsbcDescriptorPool::GetStringDescriptorTC(DThread* aThread, TInt aIndex, TDes8& aString) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1721
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1722
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetStringDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1723
    if (!StringDescriptorExists(aIndex))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1724
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1725
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1726
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1727
    __KTRACE_OPT(KUSB, Kern::Printf("  String @ pos %d: \"%S\"",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1728
                                    aIndex, &iStrings[aIndex]->StringData()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1729
    return Kern::ThreadDesWrite(aThread, &aString, iStrings[aIndex]->StringData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1730
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1731
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1732
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1733
TInt TUsbcDescriptorPool::SetStringDescriptorTC(DThread* aThread, TInt aIndex, const TDes8& aString)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1734
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1735
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetStringDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1736
    // we don't know the length of the string, so we have to allocate memory dynamically
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1737
    TUint strlen = Kern::ThreadGetDesLength(aThread, &aString);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1738
    if (strlen > KUsbStringDescStringMaxSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1739
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1740
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: $ descriptor too long - will be truncated"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1741
        strlen = KUsbStringDescStringMaxSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1742
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1743
    HBuf8* strbuf = HBuf8::New(strlen);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1744
    if (!strbuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1745
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1746
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Mem alloc for $ desc string failed (1)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1747
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1748
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1749
    strbuf->SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1750
    // the aString points to data that lives in user memory, so we have to copy it over:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1751
    const TInt r = Kern::ThreadDesRead(aThread, &aString, *strbuf, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1752
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1753
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1754
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Thread read error"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1755
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1756
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1757
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1758
    TUsbcStringDescriptor* const sd = TUsbcStringDescriptor::New(*strbuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1759
    if (!sd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1760
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1761
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Mem alloc for $ desc failed (2)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1762
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1763
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1764
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1765
    if (aIndex < iStrings.Count())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1766
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1767
        ExchangeStringDescriptor(aIndex, sd);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1768
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1769
    else // if (aIndex >= iStrings.Count())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1770
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1771
        while (aIndex > iStrings.Count())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1772
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1773
            iStrings.Append(NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1774
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1775
        iStrings.Append(sd);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1776
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1777
    delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1778
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1779
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1780
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1781
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1782
TInt TUsbcDescriptorPool::RemoveStringDescriptor(TInt aIndex)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1783
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1784
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::RemoveStringDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1785
    if (!StringDescriptorExists(aIndex))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1786
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1787
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1788
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1789
    __KTRACE_OPT(KUSB, Kern::Printf("  Removing string @ pos %d: \"%S\"",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1790
                                    aIndex, &iStrings[aIndex]->StringData()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1791
    ExchangeStringDescriptor(aIndex, NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1792
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1793
    // Make sure there's no $ after aIndex.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1794
    const TInt n = iStrings.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1795
    for (TInt i = aIndex; i < n; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1796
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1797
        if (iStrings[i] != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1798
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1799
            __KTRACE_OPT(KUSB, Kern::Printf("  Found $ @ idx %d - not compressing", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1800
            return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1801
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1802
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1803
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1804
    __KTRACE_OPT(KUSB, Kern::Printf("  No $ found after idx %d - compressing array", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1805
    // Move aIndex back just before the first !NULL element.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1806
    while (iStrings[--aIndex] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1807
        ;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1808
    // Let aIndex point to first NULL.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1809
    aIndex++;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1810
    __KTRACE_OPT(KUSB, Kern::Printf("  Starting at index %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1811
    // Now remove NULL pointers until (Count() == aIndex).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1812
    __KTRACE_OPT(KUSB, Kern::Printf("  iStrings.Count() before: %d", iStrings.Count()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1813
    do
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1814
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1815
        iStrings.Remove(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1816
        __KTRACE_OPT(KUSB, Kern::Printf("  Removing $"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1817
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1818
    while (iStrings.Count() > aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1819
    __KTRACE_OPT(KUSB, Kern::Printf("  iStrings.Count() after: %d", iStrings.Count()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1820
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1821
    // Regain some memory.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1822
    iStrings.Compress();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1823
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1824
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1825
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1826
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1827
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1828
// ===================================================================
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1829
// --- private ---
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1830
// ===================================================================
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1831
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1832
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1833
// Insert an Interface descriptor into the descriptor array at the appropriate index.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1834
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1835
void TUsbcDescriptorPool::InsertIfcDesc(TUsbcDescriptorBase* aDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1836
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1837
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::InsertIfcDesc()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1838
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1839
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1840
    TBool ifc_exists = EFalse;                                // set to 'true' if we're adding an alternate
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1841
                                                            // setting to an already existing interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1842
    TInt i = KDescPosition_FirstAvailable;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1843
    while (i < count)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1844
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1845
        __KTRACE_OPT(KUSB, Kern::Printf("  already descriptors there (%d)...", count));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1846
        if (iDescriptors[i]->Type() == KUsbDescType_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1847
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1848
            if (iDescriptors[i]->Byte(2) > aDesc->Byte(2))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1849
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1850
                // our interface number is less than the one's just found => insert before it (= here)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1851
                break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1852
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1853
            else if (iDescriptors[i]->Byte(2) == aDesc->Byte(2))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1854
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1855
                ifc_exists = ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1856
                // same interface number => look at settings number
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1857
                if (iDescriptors[i]->Byte(3) > aDesc->Byte(3))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1858
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1859
                    // our setting number is less than the one's found => insert before (= here)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1860
                    break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1861
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1862
                else if (iDescriptors[i]->Byte(3) == aDesc->Byte(3))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1863
                    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1864
                    __KTRACE_OPT(KPANIC, Kern::Printf("  Error: first delete old desc "
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1865
                                                      "(TUsbcDescriptorPool::InsertIfcDesc)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1866
                    return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1867
                    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1868
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1869
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1870
        ++i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1871
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1872
    // In any case: put the new descriptor at position i.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1873
    __KTRACE_OPT(KUSB, Kern::Printf("  inserting descriptor at position %d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1874
    iDescriptors.Insert(aDesc, i);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1875
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1876
    // Update the config descriptor's wTotalLength field.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1877
    UpdateConfigDescriptorLength(KUsbDescSize_Interface);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1878
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1879
    if (!ifc_exists)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1880
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1881
        // If this is the first setting for the interface, increment bNumInterfaces.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1882
        UpdateConfigDescriptorNumIfcs(1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1883
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1884
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1885
    iIfcIdx = i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1886
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1887
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1888
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1889
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1890
// Insert an Endpoint descriptor into the descriptor array at the appropriate index.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1891
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1892
void TUsbcDescriptorPool::InsertEpDesc(TUsbcDescriptorBase* aDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1893
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1894
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::InsertEpDesc()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1895
    if (iIfcIdx == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1896
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1897
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: only after interface "
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1898
                                          "(TUsbcDescriptorPool::InsertEpDesc)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1899
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1900
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1901
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1902
    TInt i = iIfcIdx + 1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1903
    while (i < count)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1904
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1905
        if (iDescriptors[i]->Type() != KUsbDescType_Endpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1906
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1907
        ++i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1908
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1909
    // put the new descriptor at position i
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1910
    iDescriptors.Insert(aDesc, i);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1911
    // update the config descriptor's wTotalLength field
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1912
    UpdateConfigDescriptorLength(aDesc->Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1913
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1914
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1915
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1916
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1917
// Find the index of the Interface descriptor for a given interface setting.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1918
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1919
TInt TUsbcDescriptorPool::FindIfcDescriptor(TInt aIfcNumber, TInt aIfcSetting) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1920
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1921
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::FindIfcDescriptor(%d, %d)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1922
                                    aIfcNumber, aIfcSetting));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1923
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1924
    for (TInt i = KDescPosition_FirstAvailable; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1925
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1926
        if ((iDescriptors[i]->Type() == KUsbDescType_Interface) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1927
            (iDescriptors[i]->Byte(2) == aIfcNumber) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1928
            (iDescriptors[i]->Byte(3) == aIfcSetting))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1929
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1930
            return i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1931
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1932
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1933
    __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1934
    return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1935
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1936
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1937
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1938
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1939
// Find the index of the Endpoint descriptor for a given endpoint on a given interface setting.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1940
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1941
TInt TUsbcDescriptorPool::FindEpDescriptor(TInt aIfcNumber, TInt aIfcSetting, TUint8 aEpAddress) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1942
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1943
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::FindEpDescriptor(%d, %d, 0x%02x)",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1944
                                    aIfcNumber, aIfcSetting, aEpAddress));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1945
    // first find the interface
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1946
    const TInt ifc = FindIfcDescriptor(aIfcNumber, aIfcSetting);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1947
    if (ifc < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1948
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1949
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1950
        return ifc;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1951
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1952
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1953
    // then, before the next interface, try to locate the endpoint
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1954
    for (TInt i = ifc + 1; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1955
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1956
        if (iDescriptors[i]->Type() == KUsbDescType_Interface)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1957
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1958
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint before next interface"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1959
            return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1960
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1961
        else if ((iDescriptors[i]->Type() == KUsbDescType_Endpoint) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1962
                 (iDescriptors[i]->Byte(2) == aEpAddress))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1963
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1964
            // found
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1965
            return i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1966
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1967
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1968
    __KTRACE_OPT(KPANIC, Kern::Printf("  Error: no such endpoint"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1969
    return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1970
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1971
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1972
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1973
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1974
// Delete n descriptors starting from aIndex and remove their pointers from the array.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1975
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1976
void TUsbcDescriptorPool::DeleteDescriptors(TInt aIndex, TInt aCount)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1977
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1978
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::DeleteDescriptors()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1979
    if (aIndex < KDescPosition_FirstAvailable)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1980
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1981
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: aIndex < KDescPosition_FirstAvailable"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1982
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1983
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1984
    if (aCount <= 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1985
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1986
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: aCount <= 0"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1987
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1988
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1989
    __KTRACE_OPT(KUSB, Kern::Printf("  Removing descriptors at index %d:", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1990
    // Try to update wTotalLength field in Config descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1991
    while (aCount--)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1992
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1993
        // In this loop we don't decrement aIndex, because after deleting an element
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1994
        // aIndex is already indexing the next one.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1995
        TUsbcDescriptorBase* const ptr = iDescriptors[aIndex];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1996
        switch (ptr->Type())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1997
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1998
        case KUsbDescType_Interface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  1999
            __KTRACE_OPT(KUSB, Kern::Printf("  - an interface descriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2000
            UpdateConfigDescriptorLength(-KUsbDescSize_Interface);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2001
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2002
        case KUsbDescType_Endpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2003
            __KTRACE_OPT(KUSB, Kern::Printf("  - an endpoint descriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2004
            UpdateConfigDescriptorLength(-ptr->Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2005
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2006
        case KUsbDescType_CS_Interface:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2007
            /* fall through */
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2008
        case KUsbDescType_CS_Endpoint:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2009
            __KTRACE_OPT(KUSB, Kern::Printf("  - a class specific descriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2010
            UpdateConfigDescriptorLength(-ptr->Size());
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2011
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2012
        default:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2013
            __KTRACE_OPT(KUSB, Kern::Printf("  - an unknown descriptor"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2014
            __KTRACE_OPT(KPANIC, Kern::Printf("  Error: unknown descriptor type"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2015
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2016
        iDescriptors.Remove(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2017
        delete ptr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2018
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2019
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2020
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2021
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2022
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2023
// Update the wTotalLength field in the Configuration descriptor (aLength can be negative).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2024
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2025
void TUsbcDescriptorPool::UpdateConfigDescriptorLength(TInt aLength)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2026
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2027
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::UpdateConfigDescriptorLength(%d)", aLength));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2028
    TUsbcDescriptorBase* const cnf = iDescriptors[KDescPosition_Config];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2029
    __KTRACE_OPT(KUSB, Kern::Printf("  wTotalLength old: %d", cnf->Word(2)));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2030
    // Update Config descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2031
    cnf->SetWord(2, cnf->Word(2) + aLength);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2032
    __KTRACE_OPT(KUSB, Kern::Printf("  wTotalLength new: %d", cnf->Word(2)));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2033
    // Update Other_Speed_Config descriptor as well, if applicable
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2034
    if (iDescriptors[KDescPosition_OtherSpeedConfig])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2035
        iDescriptors[KDescPosition_OtherSpeedConfig]->SetWord(2, cnf->Word(2));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2036
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2037
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2038
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2039
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2040
// Update the bNumInterfaces field in the Configuration descriptor (aNumber can be negative).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2041
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2042
void TUsbcDescriptorPool::UpdateConfigDescriptorNumIfcs(TInt aNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2043
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2044
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::UpdateConfigDescriptorNumIfcs(%d)", aNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2045
    TUsbcDescriptorBase* const cnf = iDescriptors[KDescPosition_Config];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2046
    __KTRACE_OPT(KUSB, Kern::Printf("  bNumInterfaces old: %d", cnf->Byte(4)));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2047
    const TInt n = cnf->Byte(4) + aNumber;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2048
    if (n < 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2049
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2050
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: bNumInterfaces + aNumber < 0"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2051
        return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2052
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2053
    // Update Config descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2054
    cnf->SetByte(4, n);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2055
    __KTRACE_OPT(KUSB, Kern::Printf("  bNumInterfaces new: %d", cnf->Byte(4)));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2056
    // Update Other_Speed_Config descriptor as well, if applicable
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2057
    if (iDescriptors[KDescPosition_OtherSpeedConfig])
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2058
        iDescriptors[KDescPosition_OtherSpeedConfig]->SetByte(4, n);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2059
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2060
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2061
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2062
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2063
// Update the bNumInterfaces field in the Configuration descriptor if necessary.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2064
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2065
void TUsbcDescriptorPool::UpdateIfcNumbers(TInt aNumber)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2066
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2067
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::UpdateIfcNumbers(%d)", aNumber));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2068
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2069
    for (TInt i = KDescPosition_FirstAvailable; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2070
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2071
        if ((iDescriptors[i]->Type() == KUsbDescType_Interface) &&
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2072
            (iDescriptors[i]->Byte(2) == aNumber))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2073
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2074
            // there's still an interface with 'number' so we don't need to update anything
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2075
            return;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2076
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2077
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2078
    // if we haven't returned yet, we decrement bNumInterfaces
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2079
    UpdateConfigDescriptorNumIfcs(-1);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2080
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2081
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2082
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2083
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2084
// Put the current Device or Device_Qualifier descriptor in the Ep0 Tx buffer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2085
// Only used for Ep0 standard requests, so target buffer can be hard-wired.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2086
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2087
TInt TUsbcDescriptorPool::GetDeviceDescriptor(TInt aIndex) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2088
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2089
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetDeviceDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2090
    __ASSERT_DEBUG((aIndex == KDescPosition_Device) || (aIndex == KDescPosition_DeviceQualifier),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2091
                   Kern::Printf("  Error: invalid descriptor index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2092
    if (iDescriptors[aIndex] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2093
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2094
        // This doesn't have to be an error - we might get asked here for the Device_Qualifier descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2095
        // on a FS-only device.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2096
        __KTRACE_OPT(KUSB, Kern::Printf("  Descriptor #%d requested but not available", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2097
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2098
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2099
    return iDescriptors[aIndex]->GetDescriptorData(iEp0_TxBuf, KUsbcBufSz_Ep0Tx);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2100
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2101
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2102
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2103
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2104
// Put the current Configuration or Other_Speed_Configuration descriptor + all the following
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2105
// descriptors in the Ep0 Tx buffer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2106
// Only used for Ep0 standard requests, so target buffer can be hard-wired.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2107
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2108
TInt TUsbcDescriptorPool::GetConfigurationDescriptor(TInt aIndex) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2109
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2110
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetConfigDescriptor(%d)", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2111
    __ASSERT_DEBUG((aIndex == KDescPosition_Config) || (aIndex == KDescPosition_OtherSpeedConfig),
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2112
                   Kern::Printf("  Error: invalid descriptor index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2113
    if (iDescriptors[aIndex] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2114
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2115
        // This is always an error: We should always have a Configuration descriptor and we should never
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2116
        // get asked for the Other_Speed_Configuration descriptor if we don't have one (9.6.2).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2117
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: Descriptor %d requested but not available", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2118
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2119
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2120
    const TInt count = iDescriptors.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2121
    TInt copied = 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2122
    TUint8* buf = iEp0_TxBuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2123
    for (TInt i = aIndex; i < count; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2124
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2125
        TUsbcDescriptorBase* const ptr = iDescriptors[i];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2126
        if ((aIndex == KDescPosition_OtherSpeedConfig) && (i == KDescPosition_Config))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2127
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2128
            // Skip Config descriptor when returning Other_Speed_Config
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2129
            continue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2130
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2131
        if ((i == KDescPosition_Otg) && (iDescriptors[i] == NULL))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2132
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2133
            __KTRACE_OPT(KUSB, Kern::Printf("  no OTG descriptor -> next"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2134
            continue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2135
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2136
        // We need to edit endpoint descriptors on the fly because we have only one copy
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2137
        // of each and that copy has to contain different information, depending on the
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2138
        // current speed and the type of descriptor requested.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2139
        if (ptr->Type() == KUsbDescType_Endpoint)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2140
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2141
            if ((iHighSpeed && (aIndex == KDescPosition_Config)) ||
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2142
                (!iHighSpeed && (aIndex == KDescPosition_OtherSpeedConfig)))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2143
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2144
                ptr->UpdateHs();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2145
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2146
            else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2147
                {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2148
                ptr->UpdateFs();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2149
                }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2150
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2151
        __KTRACE_OPT(KUSB, Kern::Printf("  desc[%02d]: type = 0x%02x size = %d ",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2152
                                        i, ptr->Type(), ptr->Size()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2153
        const TInt size = ptr->GetDescriptorData(buf, KUsbcBufSz_Ep0Tx - copied);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2154
        if (size == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2155
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2156
            __KTRACE_OPT(KPANIC,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2157
                         Kern::Printf("  Error: No Tx buffer space to copy this descriptor -> exiting"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2158
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2159
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2160
        copied += size;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2161
        if (copied >= KUsbcBufSz_Ep0Tx)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2162
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2163
            __KTRACE_OPT(KPANIC,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2164
                         Kern::Printf("  Error: No Tx buffer space left -> stopping here"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2165
            break;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2166
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2167
        buf += size;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2168
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2169
    __KTRACE_OPT(KUSB, Kern::Printf("  copied %d bytes", copied));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2170
    return copied;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2171
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2172
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2173
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2174
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2175
// Put the current OTG descriptor in the Ep0 Tx buffer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2176
// Only used for Ep0 standard requests, so target buffer can be hard-wired.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2177
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2178
TInt TUsbcDescriptorPool::GetOtgDescriptor() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2179
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2180
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetOtgDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2181
    if (iDescriptors[KDescPosition_Otg] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2182
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2183
        __KTRACE_OPT(KUSB, Kern::Printf("  OTG Descriptor not set"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2184
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2185
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2186
    return iDescriptors[KDescPosition_Otg]->GetDescriptorData(iEp0_TxBuf, KUsbcBufSz_Ep0Tx);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2187
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2188
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2189
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2190
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2191
// Put a specific String descriptor in the Ep0 Tx buffer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2192
// Only used for Ep0 standard requests, so target buffer can be hard-wired.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2193
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2194
TInt TUsbcDescriptorPool::GetStringDescriptor(TInt aIndex) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2195
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2196
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetStringDescriptor(%d)", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2197
    // I really would have liked to display the descriptor contents here, but without trailing zero
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2198
    // we got a problem: how can we tell printf where the string ends? We would have to
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2199
    // dynamically allocate memory (since we don't know the size in advance), copy the descriptor
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2200
    // contents there, append a zero, and give this to printf. That's a bit too much effort...
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2201
    if (!StringDescriptorExists(aIndex))
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2202
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2203
        return 0;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2204
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2205
    return iStrings[aIndex]->GetDescriptorData(iEp0_TxBuf, KUsbcBufSz_Ep0Tx);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2206
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2207
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2208
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2209
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2210
// Write a String descriptor pointed to by the Device descriptor to the user side
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2211
// (one of Manufacturer, Product, SerialNumber).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2212
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2213
TInt TUsbcDescriptorPool::GetDeviceStringDescriptorTC(DThread* aThread, TDes8& aString,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2214
                                                      TInt aIndex, TInt aPosition) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2215
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2216
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::GetDeviceStringDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2217
    const TInt str_idx = iDescriptors[KDescPosition_Device]->Byte(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2218
    if (str_idx)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2219
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2220
        __ASSERT_ALWAYS((str_idx == aPosition), Kern::Fault(KUsbPanicCat, __LINE__));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2221
        __KTRACE_OPT(KUSB, Kern::Printf("  String @ pos %d (device $): \"%S\"",
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2222
                                        str_idx, &iStrings[str_idx]->StringData()));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2223
        return Kern::ThreadDesWrite(aThread, &aString,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2224
                                    iStrings[str_idx]->StringData(), 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2225
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2226
    else
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2227
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2228
        __KTRACE_OPT(KUSB, Kern::Printf("  No string descriptor @ pos %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2229
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2230
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2231
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2232
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2233
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2234
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2235
// Read a Device String descriptor from the user side and put in the descriptor arrays
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2236
// (one of Manufacturer, Product, SerialNumber).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2237
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2238
TInt TUsbcDescriptorPool::SetDeviceStringDescriptorTC(DThread* aThread, const TDes8& aString,
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2239
                                                      TInt aIndex, TInt aPosition)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2240
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2241
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::SetDeviceStringDescriptorTC()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2242
    // we don't know the length of the string, so we have to allocate memory dynamically
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2243
    TUint strlen = Kern::ThreadGetDesLength(aThread, &aString);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2244
    if (strlen > KUsbStringDescStringMaxSize)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2245
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2246
        __KTRACE_OPT(KPANIC, Kern::Printf("  Warning: $ descriptor too long - will be truncated"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2247
        strlen = KUsbStringDescStringMaxSize;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2248
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2249
    HBuf8* const strbuf = HBuf8::New(strlen);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2250
    if (!strbuf)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2251
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2252
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for dev $ desc string failed (1)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2253
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2254
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2255
    strbuf->SetMax();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2256
    // the aString points to data that lives in user memory, so we have to copy it:
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2257
    const TInt r = Kern::ThreadDesRead(aThread, &aString, *strbuf, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2258
    if (r != KErrNone)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2259
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2260
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Thread read error"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2261
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2262
        return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2263
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2264
    TUsbcStringDescriptor* const sd = TUsbcStringDescriptor::New(*strbuf);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2265
    if (!sd)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2266
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2267
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Memory allocation for dev $ desc failed (2)"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2268
        delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2269
        return KErrNoMemory;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2270
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2271
    ExchangeStringDescriptor(aPosition, sd);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2272
    iDescriptors[KDescPosition_Device]->SetByte(aIndex, aPosition);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2273
    delete strbuf;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2274
    return r;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2275
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2276
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2277
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2278
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2279
// Remove a Device String descriptor from the descriptor arrays
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2280
// (one of Manufacturer, Product, SerialNumber).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2281
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2282
TInt TUsbcDescriptorPool::RemoveDeviceStringDescriptor(TInt aIndex, TInt aPosition)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2283
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2284
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::RemoveDeviceStringDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2285
    if (iDescriptors[KDescPosition_Device]->Byte(aIndex) == 0)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2286
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2287
        __KTRACE_OPT(KUSB, Kern::Printf("  RemoveDeviceStringDescriptor: no $ desc @ index %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2288
        return KErrNotFound;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2289
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2290
    ExchangeStringDescriptor(aPosition, NULL);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2291
    iDescriptors[KDescPosition_Device]->SetByte(aIndex, 0);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2292
    return KErrNone;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2293
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2294
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2295
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2296
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2297
// Puts aDesc at postion aIndex in the string descriptor array, after deleting what was (possibly) there.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2298
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2299
void TUsbcDescriptorPool::ExchangeStringDescriptor(TInt aIndex, const TUsbcStringDescriptor* aDesc)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2300
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2301
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::ExchangeStringDescriptor()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2302
    TUsbcStringDescriptorBase* const ptr = iStrings[aIndex];
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2303
    __KTRACE_OPT(KUSB, Kern::Printf("  Deleting string descriptor at index %d: 0x%x", aIndex, ptr));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2304
    iStrings.Remove(aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2305
    delete ptr;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2306
    __KTRACE_OPT(KUSB, Kern::Printf("  Inserting string descriptor at index %d: 0x%x", aIndex, aDesc));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2307
    iStrings.Insert(aDesc, aIndex);
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2308
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2309
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2310
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2311
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2312
// Checks whether there are any string descriptors in the array (apart from LangID).
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2313
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2314
TBool TUsbcDescriptorPool::AnyStringDescriptors() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2315
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2316
    const TInt n = iStrings.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2317
    for (TInt i = 1; i < n; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2318
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2319
        if (iStrings[i] != NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2320
            return ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2321
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2322
    return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2323
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2324
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2325
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2326
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2327
// Returns true if aIndex exists and what is at that positition is not a NULL pointer.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2328
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2329
TBool TUsbcDescriptorPool::StringDescriptorExists(TInt aIndex) const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2330
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2331
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::StringDescriptorExists()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2332
    if (aIndex >= iStrings.Count())
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2333
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2334
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: Bad string index: %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2335
        return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2336
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2337
    else if (iStrings[aIndex] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2338
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2339
        __KTRACE_OPT(KPANIC, Kern::Printf("  Error: No $ descriptor @ pos %d", aIndex));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2340
        return EFalse;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2341
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2342
    return ETrue;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2343
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2344
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2345
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2346
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2347
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2348
//
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2349
TInt TUsbcDescriptorPool::FindAvailableStringPos() const
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2350
    {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2351
    __KTRACE_OPT(KUSB, Kern::Printf("TUsbcDescriptorPool::FindAvailableStringPos()"));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2352
    const TInt n = iStrings.Count();
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2353
    // We don't start from 0 because the first few locations are 'reserved'.
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2354
    for (TInt i = KStringPosition_FirstAvailable; i < n; i++)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2355
        {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2356
        if (iStrings[i] == NULL)
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2357
            {
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2358
            __KTRACE_OPT(KUSB, Kern::Printf(" Found available NULL position: %d", i));
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2359
            return i;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2360
            }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2361
        }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2362
    return -1;
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2363
    }
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2364
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2365
089413cdde3c 201028_02
hgs
parents:
diff changeset
  2366
// -eof-