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