USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Fri Jul 27 16:14:07 2012 +0000
Revision:
6:075e36a3463e
Parent:
5:3189db174f6b
Child:
8:0d1ec493842c
New enumeration model to only instantiate needed endpoints

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 3:4394986752db 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
donatien 3:4394986752db 2 *
donatien 3:4394986752db 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 3:4394986752db 4 * and associated documentation files (the "Software"), to deal in the Software without
donatien 3:4394986752db 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
donatien 3:4394986752db 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
donatien 3:4394986752db 7 * Software is furnished to do so, subject to the following conditions:
donatien 3:4394986752db 8 *
donatien 3:4394986752db 9 * The above copyright notice and this permission notice shall be included in all copies or
donatien 3:4394986752db 10 * substantial portions of the Software.
donatien 3:4394986752db 11 *
donatien 3:4394986752db 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 3:4394986752db 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 3:4394986752db 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 3:4394986752db 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 3:4394986752db 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 3:4394986752db 17 */
donatien 3:4394986752db 18
donatien 3:4394986752db 19 #define __DEBUG__ 4 //Maximum verbosity
donatien 3:4394986752db 20 #ifndef __MODULE__
donatien 3:4394986752db 21 #define __MODULE__ "WANDongleInitializer.cpp"
donatien 3:4394986752db 22 #endif
donatien 3:4394986752db 23
donatien 3:4394986752db 24 #include "dbg.h"
donatien 3:4394986752db 25
donatien 3:4394986752db 26 #include <cstdint>
donatien 3:4394986752db 27 using std::uint16_t;
donatien 3:4394986752db 28
donatien 3:4394986752db 29 #include "WANDongleInitializer.h"
donatien 3:4394986752db 30
donatien 3:4394986752db 31 WANDongleInitializer::WANDongleInitializer(USBHost* pHost) : m_pHost(pHost)
donatien 3:4394986752db 32 {
donatien 3:4394986752db 33
donatien 3:4394986752db 34 }
donatien 3:4394986752db 35
donatien 3:4394986752db 36 WANDongleInitializer** WANDongleInitializer::getInitializers(USBHost* pHost)
donatien 3:4394986752db 37 {
donatien 3:4394986752db 38 static VodafoneK3770Initializer vodafoneK3770(pHost);
donatien 3:4394986752db 39 const static WANDongleInitializer* list[] = { &vodafoneK3770, NULL };
donatien 3:4394986752db 40 return (WANDongleInitializer**)list;
donatien 3:4394986752db 41 }
donatien 3:4394986752db 42
donatien 3:4394986752db 43 //Huawei K3770 (Vodafone)
nherriot 5:3189db174f6b 44 // Switching from mass storage device string is: "55 53 42 43 12 34 56 78 00 00 00 00 00 00 00 11 06 20 00 00 01 00 00 00 00 00 00 00 00 00 00"
donatien 3:4394986752db 45 static uint8_t vodafone_k3770_switch_packet[] = {
donatien 3:4394986752db 46 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0, 0, 0, 0, 0, 0, 0x11, 0x06, 0x20, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
donatien 3:4394986752db 47 };
donatien 3:4394986752db 48
nherriot 5:3189db174f6b 49 // NVIDIA (ICERA) /ZTE K3772-Z (Vodafone)
nherriot 5:3189db174f6b 50 // Switching from mass storage device string is: "55 53 42 43 12 34 56 78 00 00 00 00 00 00 06 1b 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00"
nherriot 5:3189db174f6b 51 static uint8_t vodafone_k3772_z_switch_packet[] = {
nherriot 5:3189db174f6b 52 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0, 0, 0, 0, 0, 0x06, 0x1b, 0, 0, 0, 0x20, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
nherriot 5:3189db174f6b 53 };
nherriot 5:3189db174f6b 54
nherriot 5:3189db174f6b 55
nherriot 5:3189db174f6b 56
donatien 3:4394986752db 57 VodafoneK3770Initializer::VodafoneK3770Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 3:4394986752db 58 {
donatien 3:4394986752db 59
donatien 3:4394986752db 60 }
donatien 3:4394986752db 61
donatien 3:4394986752db 62 uint16_t VodafoneK3770Initializer::getMSDVid() { return 0x12D1; }
donatien 3:4394986752db 63 uint16_t VodafoneK3770Initializer::getMSDPid() { return 0x14D1; }
donatien 3:4394986752db 64
donatien 3:4394986752db 65 uint16_t VodafoneK3770Initializer::getSerialVid() { return 0x12D1; }
donatien 3:4394986752db 66 uint16_t VodafoneK3770Initializer::getSerialPid() { return 0x14C9; }
donatien 3:4394986752db 67
donatien 3:4394986752db 68 bool VodafoneK3770Initializer::switchMode(USBDeviceConnected* pDev)
donatien 3:4394986752db 69 {
donatien 3:4394986752db 70 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 3:4394986752db 71 {
donatien 3:4394986752db 72 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 3:4394986752db 73 {
donatien 3:4394986752db 74 Endpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 3:4394986752db 75 if ( pEp != NULL )
donatien 3:4394986752db 76 {
donatien 3:4394986752db 77 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 3:4394986752db 78 m_pHost->bulkWrite(pDev, pEp, vodafone_k3770_switch_packet, 31);
donatien 3:4394986752db 79 return true;
donatien 3:4394986752db 80 }
donatien 3:4394986752db 81 }
donatien 3:4394986752db 82 }
donatien 3:4394986752db 83 return false;
donatien 3:4394986752db 84 }
donatien 3:4394986752db 85
donatien 3:4394986752db 86 Endpoint* VodafoneK3770Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 3:4394986752db 87 {
donatien 6:075e36a3463e 88 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 3:4394986752db 89 }
donatien 3:4394986752db 90
donatien 3:4394986752db 91 int VodafoneK3770Initializer::getSerialPortCount()
donatien 3:4394986752db 92 {
donatien 6:075e36a3463e 93 return 2;
donatien 6:075e36a3463e 94 }
donatien 6:075e36a3463e 95
donatien 6:075e36a3463e 96 /*virtual*/ void VodafoneK3770Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 6:075e36a3463e 97 {
donatien 6:075e36a3463e 98 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 6:075e36a3463e 99 {
donatien 6:075e36a3463e 100 m_hasSwitched = true;
donatien 6:075e36a3463e 101 m_currentSerialIntf = 0;
donatien 6:075e36a3463e 102 m_endpointsToFetch = 4;
donatien 6:075e36a3463e 103 }
donatien 6:075e36a3463e 104 else
donatien 6:075e36a3463e 105 {
donatien 6:075e36a3463e 106 m_hasSwitched = false;
donatien 6:075e36a3463e 107 m_endpointsToFetch = 1;
donatien 6:075e36a3463e 108 }
donatien 3:4394986752db 109 }
donatien 3:4394986752db 110
donatien 6:075e36a3463e 111 /*virtual*/ bool VodafoneK3770Initializer::parseInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) //Must return true if the interface should be parsed
donatien 6:075e36a3463e 112 {
donatien 6:075e36a3463e 113 if( m_hasSwitched )
donatien 6:075e36a3463e 114 {
donatien 6:075e36a3463e 115 if( intf_class == 0xFF )
donatien 6:075e36a3463e 116 {
donatien 6:075e36a3463e 117 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 6:075e36a3463e 118 {
donatien 6:075e36a3463e 119 m_currentSerialIntf++;
donatien 6:075e36a3463e 120 return true;
donatien 6:075e36a3463e 121 }
donatien 6:075e36a3463e 122 m_currentSerialIntf++;
donatien 6:075e36a3463e 123 }
donatien 6:075e36a3463e 124 }
donatien 6:075e36a3463e 125 else
donatien 6:075e36a3463e 126 {
donatien 6:075e36a3463e 127 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 6:075e36a3463e 128 {
donatien 6:075e36a3463e 129 return true;
donatien 6:075e36a3463e 130 }
donatien 6:075e36a3463e 131 }
donatien 6:075e36a3463e 132 return false;
donatien 6:075e36a3463e 133 }
donatien 6:075e36a3463e 134
donatien 6:075e36a3463e 135 /*virtual*/ bool VodafoneK3770Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
donatien 6:075e36a3463e 136 {
donatien 6:075e36a3463e 137 if( m_hasSwitched )
donatien 6:075e36a3463e 138 {
donatien 6:075e36a3463e 139 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 6:075e36a3463e 140 {
donatien 6:075e36a3463e 141 m_endpointsToFetch--;
donatien 6:075e36a3463e 142 return true;
donatien 6:075e36a3463e 143 }
donatien 6:075e36a3463e 144 }
donatien 6:075e36a3463e 145 else
donatien 6:075e36a3463e 146 {
donatien 6:075e36a3463e 147 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 6:075e36a3463e 148 {
donatien 6:075e36a3463e 149 m_endpointsToFetch--;
donatien 6:075e36a3463e 150 return true;
donatien 6:075e36a3463e 151 }
donatien 6:075e36a3463e 152 }
donatien 6:075e36a3463e 153 return false;
donatien 6:075e36a3463e 154 }