Rik Van Dyck / Mbed 2 deprecated Project_Embedded_C

Dependencies:   mbed DS1307 Servo TextLCD

Committer:
rikvandyck
Date:
Thu Dec 04 10:44:07 2014 +0000
Revision:
0:e1edd52b1ee2
test

Who changed what in which revision?

UserRevisionLine numberNew contents of line
rikvandyck 0:e1edd52b1ee2 1
rikvandyck 0:e1edd52b1ee2 2 /*
rikvandyck 0:e1edd52b1ee2 3 Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com)
rikvandyck 0:e1edd52b1ee2 4
rikvandyck 0:e1edd52b1ee2 5 Permission is hereby granted, free of charge, to any person obtaining a copy
rikvandyck 0:e1edd52b1ee2 6 of this software and associated documentation files (the "Software"), to deal
rikvandyck 0:e1edd52b1ee2 7 in the Software without restriction, including without limitation the rights
rikvandyck 0:e1edd52b1ee2 8 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
rikvandyck 0:e1edd52b1ee2 9 copies of the Software, and to permit persons to whom the Software is
rikvandyck 0:e1edd52b1ee2 10 furnished to do so, subject to the following conditions:
rikvandyck 0:e1edd52b1ee2 11
rikvandyck 0:e1edd52b1ee2 12 The above copyright notice and this permission notice shall be included in
rikvandyck 0:e1edd52b1ee2 13 all copies or substantial portions of the Software.
rikvandyck 0:e1edd52b1ee2 14
rikvandyck 0:e1edd52b1ee2 15 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
rikvandyck 0:e1edd52b1ee2 16 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
rikvandyck 0:e1edd52b1ee2 17 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
rikvandyck 0:e1edd52b1ee2 18 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
rikvandyck 0:e1edd52b1ee2 19 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
rikvandyck 0:e1edd52b1ee2 20 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
rikvandyck 0:e1edd52b1ee2 21 THE SOFTWARE.
rikvandyck 0:e1edd52b1ee2 22 */
rikvandyck 0:e1edd52b1ee2 23
rikvandyck 0:e1edd52b1ee2 24 #include "netCfg.h"
rikvandyck 0:e1edd52b1ee2 25 #if NET_UMTS
rikvandyck 0:e1edd52b1ee2 26
rikvandyck 0:e1edd52b1ee2 27 #include "UMTSStick.h"
rikvandyck 0:e1edd52b1ee2 28
rikvandyck 0:e1edd52b1ee2 29 #define __DEBUG
rikvandyck 0:e1edd52b1ee2 30 #include "dbg/dbg.h"
rikvandyck 0:e1edd52b1ee2 31
rikvandyck 0:e1edd52b1ee2 32 UMTSStick::UMTSStick() : m_host(), m_pDev(NULL)
rikvandyck 0:e1edd52b1ee2 33 {
rikvandyck 0:e1edd52b1ee2 34
rikvandyck 0:e1edd52b1ee2 35 }
rikvandyck 0:e1edd52b1ee2 36
rikvandyck 0:e1edd52b1ee2 37 UMTSStick::~UMTSStick()
rikvandyck 0:e1edd52b1ee2 38 {
rikvandyck 0:e1edd52b1ee2 39
rikvandyck 0:e1edd52b1ee2 40 }
rikvandyck 0:e1edd52b1ee2 41
rikvandyck 0:e1edd52b1ee2 42
rikvandyck 0:e1edd52b1ee2 43 UMTSStickErr UMTSStick::getSerial(UsbSerial** ppUsbSerial)
rikvandyck 0:e1edd52b1ee2 44 {
rikvandyck 0:e1edd52b1ee2 45 m_host.init();
rikvandyck 0:e1edd52b1ee2 46
rikvandyck 0:e1edd52b1ee2 47 UMTSStickErr rc;
rikvandyck 0:e1edd52b1ee2 48
rikvandyck 0:e1edd52b1ee2 49 rc = waitForDevice();
rikvandyck 0:e1edd52b1ee2 50 if(rc)
rikvandyck 0:e1edd52b1ee2 51 return rc;
rikvandyck 0:e1edd52b1ee2 52
rikvandyck 0:e1edd52b1ee2 53 //Device is now enumerated, read table
rikvandyck 0:e1edd52b1ee2 54
rikvandyck 0:e1edd52b1ee2 55 uint16_t vid = m_pDev->getVid();
rikvandyck 0:e1edd52b1ee2 56 uint16_t pid = m_pDev->getPid();
rikvandyck 0:e1edd52b1ee2 57
rikvandyck 0:e1edd52b1ee2 58 DBG("Configuration set: vid:%04x pid:%04x\n", vid, pid);
rikvandyck 0:e1edd52b1ee2 59
rikvandyck 0:e1edd52b1ee2 60 bool handled = false;
rikvandyck 0:e1edd52b1ee2 61 bool cdfs = false;
rikvandyck 0:e1edd52b1ee2 62 const UMTSSwitchingInfo* pInfo;
rikvandyck 0:e1edd52b1ee2 63 for(int i = 0; i < UMTS_SWITCHING_COUNT; i++)
rikvandyck 0:e1edd52b1ee2 64 {
rikvandyck 0:e1edd52b1ee2 65 pInfo = &UMTSwitchingTable[i];
rikvandyck 0:e1edd52b1ee2 66 if( !checkDeviceState(pInfo, &cdfs) )
rikvandyck 0:e1edd52b1ee2 67 {
rikvandyck 0:e1edd52b1ee2 68 handled = true;
rikvandyck 0:e1edd52b1ee2 69 break;
rikvandyck 0:e1edd52b1ee2 70 }
rikvandyck 0:e1edd52b1ee2 71
rikvandyck 0:e1edd52b1ee2 72 } //for(int i = 0; i < UMTS_SWITCHING_COUNT; i++)
rikvandyck 0:e1edd52b1ee2 73
rikvandyck 0:e1edd52b1ee2 74 if(!handled)
rikvandyck 0:e1edd52b1ee2 75 {
rikvandyck 0:e1edd52b1ee2 76 DBG("Don't know this device!\n");
rikvandyck 0:e1edd52b1ee2 77 return UMTSERR_NOTIMPLEMENTED;
rikvandyck 0:e1edd52b1ee2 78 }
rikvandyck 0:e1edd52b1ee2 79
rikvandyck 0:e1edd52b1ee2 80 //Check if the device is in CDFS mode, in this case switch
rikvandyck 0:e1edd52b1ee2 81 if(cdfs)
rikvandyck 0:e1edd52b1ee2 82 {
rikvandyck 0:e1edd52b1ee2 83 DBG("Switching the device by sending a magic packet\n");
rikvandyck 0:e1edd52b1ee2 84
rikvandyck 0:e1edd52b1ee2 85 rc = switchMode(pInfo);
rikvandyck 0:e1edd52b1ee2 86 if(rc)
rikvandyck 0:e1edd52b1ee2 87 return rc;
rikvandyck 0:e1edd52b1ee2 88
rikvandyck 0:e1edd52b1ee2 89 DBG("Now wait for device to reconnect\n");
rikvandyck 0:e1edd52b1ee2 90
rikvandyck 0:e1edd52b1ee2 91 m_host.releaseDevice(m_pDev);
rikvandyck 0:e1edd52b1ee2 92
rikvandyck 0:e1edd52b1ee2 93 //Wait for device to reconnect
rikvandyck 0:e1edd52b1ee2 94 wait(3);
rikvandyck 0:e1edd52b1ee2 95 rc = waitForDevice();
rikvandyck 0:e1edd52b1ee2 96 if(rc)
rikvandyck 0:e1edd52b1ee2 97 return rc;
rikvandyck 0:e1edd52b1ee2 98 }
rikvandyck 0:e1edd52b1ee2 99
rikvandyck 0:e1edd52b1ee2 100 rc = findSerial(ppUsbSerial);
rikvandyck 0:e1edd52b1ee2 101 if(rc)
rikvandyck 0:e1edd52b1ee2 102 return rc;
rikvandyck 0:e1edd52b1ee2 103
rikvandyck 0:e1edd52b1ee2 104 return UMTSERR_OK;
rikvandyck 0:e1edd52b1ee2 105 }
rikvandyck 0:e1edd52b1ee2 106
rikvandyck 0:e1edd52b1ee2 107 UMTSStickErr UMTSStick::waitForDevice()
rikvandyck 0:e1edd52b1ee2 108 {
rikvandyck 0:e1edd52b1ee2 109 bool ready = false;
rikvandyck 0:e1edd52b1ee2 110 while(!ready)
rikvandyck 0:e1edd52b1ee2 111 {
rikvandyck 0:e1edd52b1ee2 112 while(!m_host.devicesCount())
rikvandyck 0:e1edd52b1ee2 113 {}
rikvandyck 0:e1edd52b1ee2 114 wait(1);
rikvandyck 0:e1edd52b1ee2 115 if(m_host.devicesCount())
rikvandyck 0:e1edd52b1ee2 116 ready = true;
rikvandyck 0:e1edd52b1ee2 117 }
rikvandyck 0:e1edd52b1ee2 118
rikvandyck 0:e1edd52b1ee2 119 wait(2); //Wait for device to be initialized
rikvandyck 0:e1edd52b1ee2 120
rikvandyck 0:e1edd52b1ee2 121 if(!m_host.devicesCount())
rikvandyck 0:e1edd52b1ee2 122 return UMTSERR_DISCONNECTED;
rikvandyck 0:e1edd52b1ee2 123
rikvandyck 0:e1edd52b1ee2 124 m_pDev = m_host.getDevice(0);
rikvandyck 0:e1edd52b1ee2 125
rikvandyck 0:e1edd52b1ee2 126 while(!m_pDev->enumerated())
rikvandyck 0:e1edd52b1ee2 127 {
rikvandyck 0:e1edd52b1ee2 128 m_host.poll();
rikvandyck 0:e1edd52b1ee2 129 if(!m_host.devicesCount())
rikvandyck 0:e1edd52b1ee2 130 return UMTSERR_DISCONNECTED;
rikvandyck 0:e1edd52b1ee2 131 }
rikvandyck 0:e1edd52b1ee2 132
rikvandyck 0:e1edd52b1ee2 133 return UMTSERR_OK;
rikvandyck 0:e1edd52b1ee2 134 }
rikvandyck 0:e1edd52b1ee2 135
rikvandyck 0:e1edd52b1ee2 136 UMTSStickErr UMTSStick::checkDeviceState(const UMTSSwitchingInfo* pInfo, bool* pCdfs)
rikvandyck 0:e1edd52b1ee2 137 {
rikvandyck 0:e1edd52b1ee2 138 uint16_t vid = m_pDev->getVid();
rikvandyck 0:e1edd52b1ee2 139 uint16_t pid = m_pDev->getPid();
rikvandyck 0:e1edd52b1ee2 140 bool handled = false;
rikvandyck 0:e1edd52b1ee2 141 if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) )
rikvandyck 0:e1edd52b1ee2 142 {
rikvandyck 0:e1edd52b1ee2 143 DBG("Match on dongles list\n");
rikvandyck 0:e1edd52b1ee2 144 if( !pInfo->targetClass ) //No specific interface to check, vid/pid couple is specific to CDFS mode
rikvandyck 0:e1edd52b1ee2 145 {
rikvandyck 0:e1edd52b1ee2 146 DBG("Found device in CDFS mode\n");
rikvandyck 0:e1edd52b1ee2 147 handled = true;
rikvandyck 0:e1edd52b1ee2 148 *pCdfs = true;
rikvandyck 0:e1edd52b1ee2 149 }
rikvandyck 0:e1edd52b1ee2 150 else //if( !pInfo->targetClass )
rikvandyck 0:e1edd52b1ee2 151 {
rikvandyck 0:e1edd52b1ee2 152 //Has to check if there is an interface of class targetClass
rikvandyck 0:e1edd52b1ee2 153 byte* desc = NULL;
rikvandyck 0:e1edd52b1ee2 154 int c = 0;
rikvandyck 0:e1edd52b1ee2 155
rikvandyck 0:e1edd52b1ee2 156 while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) )
rikvandyck 0:e1edd52b1ee2 157 {
rikvandyck 0:e1edd52b1ee2 158 if( desc[5] == pInfo->targetClass )
rikvandyck 0:e1edd52b1ee2 159 {
rikvandyck 0:e1edd52b1ee2 160 DBG("Found device in Serial mode\n");
rikvandyck 0:e1edd52b1ee2 161 handled = true;
rikvandyck 0:e1edd52b1ee2 162 *pCdfs = false;
rikvandyck 0:e1edd52b1ee2 163 break;
rikvandyck 0:e1edd52b1ee2 164 }
rikvandyck 0:e1edd52b1ee2 165 }
rikvandyck 0:e1edd52b1ee2 166
rikvandyck 0:e1edd52b1ee2 167 if(!handled)
rikvandyck 0:e1edd52b1ee2 168 {
rikvandyck 0:e1edd52b1ee2 169 //All interfaces were tried, so we are in CDFS mode
rikvandyck 0:e1edd52b1ee2 170 DBG("Found device in CDFS mode\n");
rikvandyck 0:e1edd52b1ee2 171 handled = true;
rikvandyck 0:e1edd52b1ee2 172 *pCdfs = true;
rikvandyck 0:e1edd52b1ee2 173 }
rikvandyck 0:e1edd52b1ee2 174 } //if( !pInfo->targetClass )
rikvandyck 0:e1edd52b1ee2 175 } //if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) )
rikvandyck 0:e1edd52b1ee2 176 else
rikvandyck 0:e1edd52b1ee2 177 {
rikvandyck 0:e1edd52b1ee2 178 //Try every vid/pid couple of the serial list
rikvandyck 0:e1edd52b1ee2 179 for( int i = 0; i < 16 ; i++)
rikvandyck 0:e1edd52b1ee2 180 {
rikvandyck 0:e1edd52b1ee2 181 if(!pInfo->serialPidList[i])
rikvandyck 0:e1edd52b1ee2 182 break;
rikvandyck 0:e1edd52b1ee2 183 if( (pInfo->serialVid == vid) && (pInfo->serialPidList[i] == pid) )
rikvandyck 0:e1edd52b1ee2 184 {
rikvandyck 0:e1edd52b1ee2 185 DBG("Found device in Serial mode\n");
rikvandyck 0:e1edd52b1ee2 186 handled = true;
rikvandyck 0:e1edd52b1ee2 187 *pCdfs = false;
rikvandyck 0:e1edd52b1ee2 188 break;
rikvandyck 0:e1edd52b1ee2 189 }
rikvandyck 0:e1edd52b1ee2 190 }
rikvandyck 0:e1edd52b1ee2 191 } //if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) )
rikvandyck 0:e1edd52b1ee2 192
rikvandyck 0:e1edd52b1ee2 193 if(!handled)
rikvandyck 0:e1edd52b1ee2 194 return UMTSERR_NOTFOUND;
rikvandyck 0:e1edd52b1ee2 195
rikvandyck 0:e1edd52b1ee2 196 return UMTSERR_OK;
rikvandyck 0:e1edd52b1ee2 197 }
rikvandyck 0:e1edd52b1ee2 198
rikvandyck 0:e1edd52b1ee2 199 UMTSStickErr UMTSStick::switchMode(const UMTSSwitchingInfo* pInfo)
rikvandyck 0:e1edd52b1ee2 200 {
rikvandyck 0:e1edd52b1ee2 201 if(!pInfo->huaweiPacket) //Send SCSI packet on first bulk ep
rikvandyck 0:e1edd52b1ee2 202 {
rikvandyck 0:e1edd52b1ee2 203 //Find first bulk ep
rikvandyck 0:e1edd52b1ee2 204 byte* desc = NULL;
rikvandyck 0:e1edd52b1ee2 205 int c = 0;
rikvandyck 0:e1edd52b1ee2 206
rikvandyck 0:e1edd52b1ee2 207 UsbEndpoint *pEpOut = NULL;
rikvandyck 0:e1edd52b1ee2 208
rikvandyck 0:e1edd52b1ee2 209 while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) )
rikvandyck 0:e1edd52b1ee2 210 {
rikvandyck 0:e1edd52b1ee2 211 byte* p = desc;
rikvandyck 0:e1edd52b1ee2 212 int epNum = 0;
rikvandyck 0:e1edd52b1ee2 213 p = p + p[0]; //Move to next descriptor (which should be an ep descriptor)
rikvandyck 0:e1edd52b1ee2 214 while (epNum < desc[4]) //Eps count in this if
rikvandyck 0:e1edd52b1ee2 215 {
rikvandyck 0:e1edd52b1ee2 216 if (p[1] != USB_DESCRIPTOR_TYPE_ENDPOINT)
rikvandyck 0:e1edd52b1ee2 217 break;
rikvandyck 0:e1edd52b1ee2 218
rikvandyck 0:e1edd52b1ee2 219 if( (p[3] == 0x02) && !(p[2] & 0x80) ) //Bulk endpoint, out
rikvandyck 0:e1edd52b1ee2 220 {
rikvandyck 0:e1edd52b1ee2 221 DBG("Found bulk ep %02x\n", p[2]);
rikvandyck 0:e1edd52b1ee2 222 pEpOut = new UsbEndpoint( m_pDev, p[2], false, USB_BULK, *((uint16_t*)&p[4]) );
rikvandyck 0:e1edd52b1ee2 223 break;
rikvandyck 0:e1edd52b1ee2 224 }
rikvandyck 0:e1edd52b1ee2 225
rikvandyck 0:e1edd52b1ee2 226 p = p + p[0]; //Move to next ep desc
rikvandyck 0:e1edd52b1ee2 227 epNum++;
rikvandyck 0:e1edd52b1ee2 228 }
rikvandyck 0:e1edd52b1ee2 229 if(pEpOut)
rikvandyck 0:e1edd52b1ee2 230 break;
rikvandyck 0:e1edd52b1ee2 231 }
rikvandyck 0:e1edd52b1ee2 232
rikvandyck 0:e1edd52b1ee2 233 if(!pEpOut)
rikvandyck 0:e1edd52b1ee2 234 return UMTSERR_NOTFOUND;
rikvandyck 0:e1edd52b1ee2 235
rikvandyck 0:e1edd52b1ee2 236 //Send SCSI packet
rikvandyck 0:e1edd52b1ee2 237
rikvandyck 0:e1edd52b1ee2 238 DBG("Sending SCSI Packet to switch\n");
rikvandyck 0:e1edd52b1ee2 239 byte ramCdfsBuf[31];
rikvandyck 0:e1edd52b1ee2 240 memcpy(ramCdfsBuf, pInfo->cdfsPacket, 31);
rikvandyck 0:e1edd52b1ee2 241 pEpOut->transfer((volatile byte*)ramCdfsBuf, 31);
rikvandyck 0:e1edd52b1ee2 242 while(pEpOut->status() == USBERR_PROCESSING);
rikvandyck 0:e1edd52b1ee2 243 int ret = pEpOut->status();
rikvandyck 0:e1edd52b1ee2 244 if((ret < 0) && (ret !=USBERR_DISCONNECTED)) //Packet was not transfered
rikvandyck 0:e1edd52b1ee2 245 {
rikvandyck 0:e1edd52b1ee2 246 DBG("Usb error %d\n", ret);
rikvandyck 0:e1edd52b1ee2 247 delete pEpOut;
rikvandyck 0:e1edd52b1ee2 248 return UMTSERR_USBERR;
rikvandyck 0:e1edd52b1ee2 249 }
rikvandyck 0:e1edd52b1ee2 250
rikvandyck 0:e1edd52b1ee2 251 delete pEpOut;
rikvandyck 0:e1edd52b1ee2 252 }
rikvandyck 0:e1edd52b1ee2 253 else
rikvandyck 0:e1edd52b1ee2 254 {
rikvandyck 0:e1edd52b1ee2 255 UsbErr usbErr;
rikvandyck 0:e1edd52b1ee2 256 //Send the Huawei-specific control packet
rikvandyck 0:e1edd52b1ee2 257 usbErr = m_pDev->controlSend(0, 0x03, 1, 0, NULL, 0);
rikvandyck 0:e1edd52b1ee2 258 if(usbErr && (usbErr != USBERR_DISCONNECTED))
rikvandyck 0:e1edd52b1ee2 259 return UMTSERR_USBERR;
rikvandyck 0:e1edd52b1ee2 260 }
rikvandyck 0:e1edd52b1ee2 261
rikvandyck 0:e1edd52b1ee2 262 DBG("The stick should be switching in serial mode now\n");
rikvandyck 0:e1edd52b1ee2 263
rikvandyck 0:e1edd52b1ee2 264 return UMTSERR_OK;
rikvandyck 0:e1edd52b1ee2 265 }
rikvandyck 0:e1edd52b1ee2 266
rikvandyck 0:e1edd52b1ee2 267 UMTSStickErr UMTSStick::findSerial(UsbSerial** ppUsbSerial)
rikvandyck 0:e1edd52b1ee2 268 {
rikvandyck 0:e1edd52b1ee2 269 byte* desc = NULL;
rikvandyck 0:e1edd52b1ee2 270 int c = 0;
rikvandyck 0:e1edd52b1ee2 271
rikvandyck 0:e1edd52b1ee2 272 int epOut = 0;
rikvandyck 0:e1edd52b1ee2 273 int epIn = 0;
rikvandyck 0:e1edd52b1ee2 274
rikvandyck 0:e1edd52b1ee2 275 while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) )
rikvandyck 0:e1edd52b1ee2 276 {
rikvandyck 0:e1edd52b1ee2 277 byte* p = desc;
rikvandyck 0:e1edd52b1ee2 278 int epNum = 0;
rikvandyck 0:e1edd52b1ee2 279
rikvandyck 0:e1edd52b1ee2 280 DBG("Interface of type %02x\n", desc[5]);
rikvandyck 0:e1edd52b1ee2 281
rikvandyck 0:e1edd52b1ee2 282 if(desc[5] != 0xFF) //Not a serial-like if
rikvandyck 0:e1edd52b1ee2 283 continue;
rikvandyck 0:e1edd52b1ee2 284
rikvandyck 0:e1edd52b1ee2 285 p = p + p[0]; //Move to next descriptor (which should be an ep descriptor)
rikvandyck 0:e1edd52b1ee2 286 while (epNum < desc[4]) //Eps count in this if
rikvandyck 0:e1edd52b1ee2 287 {
rikvandyck 0:e1edd52b1ee2 288 if (p[1] == USB_DESCRIPTOR_TYPE_ENDPOINT)
rikvandyck 0:e1edd52b1ee2 289 {
rikvandyck 0:e1edd52b1ee2 290 if( (p[3] == 0x02) && !(p[2] & 0x80) && !epOut ) //Bulk endpoint, out
rikvandyck 0:e1edd52b1ee2 291 {
rikvandyck 0:e1edd52b1ee2 292 DBG("Found bulk out ep %02x of payload size %04x\n", p[2], *((uint16_t*)&p[4]));
rikvandyck 0:e1edd52b1ee2 293 epOut = p[2] & 0x7F;
rikvandyck 0:e1edd52b1ee2 294 }
rikvandyck 0:e1edd52b1ee2 295
rikvandyck 0:e1edd52b1ee2 296 if( (p[3] == 0x02) && (p[2] & 0x80) && !epIn ) //Bulk endpoint, in
rikvandyck 0:e1edd52b1ee2 297 {
rikvandyck 0:e1edd52b1ee2 298 DBG("Found bulk in ep %02x of payload size %04x\n", p[2], *((uint16_t*)&p[4]));
rikvandyck 0:e1edd52b1ee2 299 epIn = p[2] & 0x7F;
rikvandyck 0:e1edd52b1ee2 300 }
rikvandyck 0:e1edd52b1ee2 301
rikvandyck 0:e1edd52b1ee2 302 if(epOut && epIn)
rikvandyck 0:e1edd52b1ee2 303 break;
rikvandyck 0:e1edd52b1ee2 304 }
rikvandyck 0:e1edd52b1ee2 305
rikvandyck 0:e1edd52b1ee2 306 p = p + p[0]; //Move to next ep desc
rikvandyck 0:e1edd52b1ee2 307 epNum++;
rikvandyck 0:e1edd52b1ee2 308 }
rikvandyck 0:e1edd52b1ee2 309
rikvandyck 0:e1edd52b1ee2 310 if(epOut && epIn)
rikvandyck 0:e1edd52b1ee2 311 break;
rikvandyck 0:e1edd52b1ee2 312 }
rikvandyck 0:e1edd52b1ee2 313
rikvandyck 0:e1edd52b1ee2 314 if(!epOut || !epIn)
rikvandyck 0:e1edd52b1ee2 315 return UMTSERR_NOTFOUND;
rikvandyck 0:e1edd52b1ee2 316
rikvandyck 0:e1edd52b1ee2 317 DBG("Endpoints found, create serial object\n");
rikvandyck 0:e1edd52b1ee2 318
rikvandyck 0:e1edd52b1ee2 319 *ppUsbSerial = new UsbSerial(m_pDev, epIn, epOut);
rikvandyck 0:e1edd52b1ee2 320
rikvandyck 0:e1edd52b1ee2 321 DBG("UsbSerial object created\n");
rikvandyck 0:e1edd52b1ee2 322
rikvandyck 0:e1edd52b1ee2 323 return UMTSERR_OK;
rikvandyck 0:e1edd52b1ee2 324 }
rikvandyck 0:e1edd52b1ee2 325
rikvandyck 0:e1edd52b1ee2 326 #endif