EthernetNetIf Compatibility.
Dependents: XBeeWiFi_SPI_example
Fork of NetServicesSource by
Diff: drv/umtsstick/UMTSStick.cpp
- Revision:
- 12:8dc6b255af6c
- Parent:
- 11:da4498f591ee
--- a/drv/umtsstick/UMTSStick.cpp Thu Aug 05 15:01:33 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,326 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include "netCfg.h" -#if NET_UMTS - -#include "UMTSStick.h" - -#define __DEBUG -#include "dbg/dbg.h" - -UMTSStick::UMTSStick() : m_host(), m_pDev(NULL) -{ - -} - -UMTSStick::~UMTSStick() -{ - -} - - -UMTSStickErr UMTSStick::getSerial(UsbSerial** ppUsbSerial) -{ - m_host.init(); - - UMTSStickErr rc; - - rc = waitForDevice(); - if(rc) - return rc; - - //Device is now enumerated, read table - - uint16_t vid = m_pDev->getVid(); - uint16_t pid = m_pDev->getPid(); - - DBG("Configuration set: vid:%04x pid:%04x\n", vid, pid); - - bool handled = false; - bool cdfs = false; - const UMTSSwitchingInfo* pInfo; - for(int i = 0; i < UMTS_SWITCHING_COUNT; i++) - { - pInfo = &UMTSwitchingTable[i]; - if( !checkDeviceState(pInfo, &cdfs) ) - { - handled = true; - break; - } - - } //for(int i = 0; i < UMTS_SWITCHING_COUNT; i++) - - if(!handled) - { - DBG("Don't know this device!\n"); - return UMTSERR_NOTIMPLEMENTED; - } - - //Check if the device is in CDFS mode, in this case switch - if(cdfs) - { - DBG("Switching the device by sending a magic packet\n"); - - rc = switchMode(pInfo); - if(rc) - return rc; - - DBG("Now wait for device to reconnect\n"); - - m_host.releaseDevice(m_pDev); - - //Wait for device to reconnect - wait(3); - rc = waitForDevice(); - if(rc) - return rc; - } - - rc = findSerial(ppUsbSerial); - if(rc) - return rc; - - return UMTSERR_OK; -} - -UMTSStickErr UMTSStick::waitForDevice() -{ - bool ready = false; - while(!ready) - { - while(!m_host.devicesCount()) - {} - wait(1); - if(m_host.devicesCount()) - ready = true; - } - - wait(2); //Wait for device to be initialized - - if(!m_host.devicesCount()) - return UMTSERR_DISCONNECTED; - - m_pDev = m_host.getDevice(0); - - while(!m_pDev->enumerated()) - { - m_host.poll(); - if(!m_host.devicesCount()) - return UMTSERR_DISCONNECTED; - } - - return UMTSERR_OK; -} - -UMTSStickErr UMTSStick::checkDeviceState(const UMTSSwitchingInfo* pInfo, bool* pCdfs) -{ - uint16_t vid = m_pDev->getVid(); - uint16_t pid = m_pDev->getPid(); - bool handled = false; - if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) ) - { - DBG("Match on dongles list\n"); - if( !pInfo->targetClass ) //No specific interface to check, vid/pid couple is specific to CDFS mode - { - DBG("Found device in CDFS mode\n"); - handled = true; - *pCdfs = true; - } - else //if( !pInfo->targetClass ) - { - //Has to check if there is an interface of class targetClass - byte* desc = NULL; - int c = 0; - - while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) ) - { - if( desc[5] == pInfo->targetClass ) - { - DBG("Found device in Serial mode\n"); - handled = true; - *pCdfs = false; - break; - } - } - - if(!handled) - { - //All interfaces were tried, so we are in CDFS mode - DBG("Found device in CDFS mode\n"); - handled = true; - *pCdfs = true; - } - } //if( !pInfo->targetClass ) - } //if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) ) - else - { - //Try every vid/pid couple of the serial list - for( int i = 0; i < 16 ; i++) - { - if(!pInfo->serialPidList[i]) - break; - if( (pInfo->serialVid == vid) && (pInfo->serialPidList[i] == pid) ) - { - DBG("Found device in Serial mode\n"); - handled = true; - *pCdfs = false; - break; - } - } - } //if( (vid == pInfo->cdfsVid) && (pid == pInfo->cdfsPid) ) - - if(!handled) - return UMTSERR_NOTFOUND; - - return UMTSERR_OK; -} - -UMTSStickErr UMTSStick::switchMode(const UMTSSwitchingInfo* pInfo) -{ - if(!pInfo->huaweiPacket) //Send SCSI packet on first bulk ep - { - //Find first bulk ep - byte* desc = NULL; - int c = 0; - - UsbEndpoint *pEpOut = NULL; - - while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) ) - { - byte* p = desc; - int epNum = 0; - p = p + p[0]; //Move to next descriptor (which should be an ep descriptor) - while (epNum < desc[4]) //Eps count in this if - { - if (p[1] != USB_DESCRIPTOR_TYPE_ENDPOINT) - break; - - if( (p[3] == 0x02) && !(p[2] & 0x80) ) //Bulk endpoint, out - { - DBG("Found bulk ep %02x\n", p[2]); - pEpOut = new UsbEndpoint( m_pDev, p[2], false, USB_BULK, *((uint16_t*)&p[4]) ); - break; - } - - p = p + p[0]; //Move to next ep desc - epNum++; - } - if(pEpOut) - break; - } - - if(!pEpOut) - return UMTSERR_NOTFOUND; - - //Send SCSI packet - - DBG("Sending SCSI Packet to switch\n"); - byte ramCdfsBuf[31]; - memcpy(ramCdfsBuf, pInfo->cdfsPacket, 31); - pEpOut->transfer((volatile byte*)ramCdfsBuf, 31); - while(pEpOut->status() == USBERR_PROCESSING); - int ret = pEpOut->status(); - if((ret < 0) && (ret !=USBERR_DISCONNECTED)) //Packet was not transfered - { - DBG("Usb error %d\n", ret); - delete pEpOut; - return UMTSERR_USBERR; - } - - delete pEpOut; - } - else - { - UsbErr usbErr; - //Send the Huawei-specific control packet - usbErr = m_pDev->controlSend(0, 0x03, 1, 0, NULL, 0); - if(usbErr && (usbErr != USBERR_DISCONNECTED)) - return UMTSERR_USBERR; - } - - DBG("The stick should be switching in serial mode now\n"); - - return UMTSERR_OK; -} - -UMTSStickErr UMTSStick::findSerial(UsbSerial** ppUsbSerial) -{ - byte* desc = NULL; - int c = 0; - - int epOut = 0; - int epIn = 0; - - while( !m_pDev->getInterfaceDescriptor(1, c++, &desc) ) - { - byte* p = desc; - int epNum = 0; - - DBG("Interface of type %02x\n", desc[5]); - - if(desc[5] != 0xFF) //Not a serial-like if - continue; - - p = p + p[0]; //Move to next descriptor (which should be an ep descriptor) - while (epNum < desc[4]) //Eps count in this if - { - if (p[1] == USB_DESCRIPTOR_TYPE_ENDPOINT) - { - if( (p[3] == 0x02) && !(p[2] & 0x80) && !epOut ) //Bulk endpoint, out - { - DBG("Found bulk out ep %02x of payload size %04x\n", p[2], *((uint16_t*)&p[4])); - epOut = p[2] & 0x7F; - } - - if( (p[3] == 0x02) && (p[2] & 0x80) && !epIn ) //Bulk endpoint, in - { - DBG("Found bulk in ep %02x of payload size %04x\n", p[2], *((uint16_t*)&p[4])); - epIn = p[2] & 0x7F; - } - - if(epOut && epIn) - break; - } - - p = p + p[0]; //Move to next ep desc - epNum++; - } - - if(epOut && epIn) - break; - } - - if(!epOut || !epIn) - return UMTSERR_NOTFOUND; - - DBG("Endpoints found, create serial object\n"); - - *ppUsbSerial = new UsbSerial(m_pDev, epIn, epOut); - - DBG("UsbSerial object created\n"); - - return UMTSERR_OK; -} - -#endif