USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Thu Aug 30 09:15:55 2012 +0000
Revision:
10:08bce4cd973a
Parent:
9:c9e9817c398c
Child:
13:c154e7f2e42f
Fixed reinitialization issues

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 10:08bce4cd973a 1 /* Copyright (c) 2010-2012 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 10:08bce4cd973a 19 #define __DEBUG__ 0
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 8:0d1ec493842c 39 static VodafoneK3772ZInitializer vodafoneK3772Z(pHost);
donatien 8:0d1ec493842c 40 const static WANDongleInitializer* list[] = { &vodafoneK3770, &vodafoneK3772Z, NULL };
donatien 3:4394986752db 41 return (WANDongleInitializer**)list;
donatien 3:4394986752db 42 }
donatien 3:4394986752db 43
donatien 3:4394986752db 44 //Huawei K3770 (Vodafone)
nherriot 5:3189db174f6b 45 // 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 46 static uint8_t vodafone_k3770_switch_packet[] = {
donatien 3:4394986752db 47 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 48 };
donatien 3:4394986752db 49
donatien 3:4394986752db 50 VodafoneK3770Initializer::VodafoneK3770Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 3:4394986752db 51 {
donatien 3:4394986752db 52
donatien 3:4394986752db 53 }
donatien 3:4394986752db 54
donatien 3:4394986752db 55 uint16_t VodafoneK3770Initializer::getMSDVid() { return 0x12D1; }
donatien 3:4394986752db 56 uint16_t VodafoneK3770Initializer::getMSDPid() { return 0x14D1; }
donatien 3:4394986752db 57
donatien 3:4394986752db 58 uint16_t VodafoneK3770Initializer::getSerialVid() { return 0x12D1; }
donatien 3:4394986752db 59 uint16_t VodafoneK3770Initializer::getSerialPid() { return 0x14C9; }
donatien 3:4394986752db 60
donatien 3:4394986752db 61 bool VodafoneK3770Initializer::switchMode(USBDeviceConnected* pDev)
donatien 3:4394986752db 62 {
donatien 3:4394986752db 63 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 3:4394986752db 64 {
donatien 3:4394986752db 65 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 3:4394986752db 66 {
donatien 9:c9e9817c398c 67 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 3:4394986752db 68 if ( pEp != NULL )
donatien 3:4394986752db 69 {
donatien 3:4394986752db 70 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 3:4394986752db 71 m_pHost->bulkWrite(pDev, pEp, vodafone_k3770_switch_packet, 31);
donatien 3:4394986752db 72 return true;
donatien 3:4394986752db 73 }
donatien 3:4394986752db 74 }
donatien 3:4394986752db 75 }
donatien 3:4394986752db 76 return false;
donatien 3:4394986752db 77 }
donatien 3:4394986752db 78
donatien 9:c9e9817c398c 79 USBEndpoint* VodafoneK3770Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 3:4394986752db 80 {
donatien 6:075e36a3463e 81 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 3:4394986752db 82 }
donatien 3:4394986752db 83
donatien 3:4394986752db 84 int VodafoneK3770Initializer::getSerialPortCount()
donatien 3:4394986752db 85 {
donatien 6:075e36a3463e 86 return 2;
donatien 6:075e36a3463e 87 }
donatien 6:075e36a3463e 88
donatien 6:075e36a3463e 89 /*virtual*/ void VodafoneK3770Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 6:075e36a3463e 90 {
donatien 6:075e36a3463e 91 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 6:075e36a3463e 92 {
donatien 6:075e36a3463e 93 m_hasSwitched = true;
donatien 6:075e36a3463e 94 m_currentSerialIntf = 0;
donatien 6:075e36a3463e 95 m_endpointsToFetch = 4;
donatien 6:075e36a3463e 96 }
donatien 6:075e36a3463e 97 else
donatien 6:075e36a3463e 98 {
donatien 6:075e36a3463e 99 m_hasSwitched = false;
donatien 6:075e36a3463e 100 m_endpointsToFetch = 1;
donatien 6:075e36a3463e 101 }
donatien 3:4394986752db 102 }
donatien 3:4394986752db 103
donatien 6:075e36a3463e 104 /*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 105 {
donatien 6:075e36a3463e 106 if( m_hasSwitched )
donatien 6:075e36a3463e 107 {
donatien 6:075e36a3463e 108 if( intf_class == 0xFF )
donatien 6:075e36a3463e 109 {
donatien 6:075e36a3463e 110 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 6:075e36a3463e 111 {
donatien 6:075e36a3463e 112 m_currentSerialIntf++;
donatien 6:075e36a3463e 113 return true;
donatien 6:075e36a3463e 114 }
donatien 6:075e36a3463e 115 m_currentSerialIntf++;
donatien 6:075e36a3463e 116 }
donatien 6:075e36a3463e 117 }
donatien 6:075e36a3463e 118 else
donatien 6:075e36a3463e 119 {
donatien 6:075e36a3463e 120 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 6:075e36a3463e 121 {
donatien 6:075e36a3463e 122 return true;
donatien 6:075e36a3463e 123 }
donatien 6:075e36a3463e 124 }
donatien 6:075e36a3463e 125 return false;
donatien 6:075e36a3463e 126 }
donatien 6:075e36a3463e 127
donatien 6:075e36a3463e 128 /*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 129 {
donatien 6:075e36a3463e 130 if( m_hasSwitched )
donatien 6:075e36a3463e 131 {
donatien 6:075e36a3463e 132 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 6:075e36a3463e 133 {
donatien 6:075e36a3463e 134 m_endpointsToFetch--;
donatien 6:075e36a3463e 135 return true;
donatien 6:075e36a3463e 136 }
donatien 6:075e36a3463e 137 }
donatien 6:075e36a3463e 138 else
donatien 6:075e36a3463e 139 {
donatien 6:075e36a3463e 140 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 6:075e36a3463e 141 {
donatien 6:075e36a3463e 142 m_endpointsToFetch--;
donatien 6:075e36a3463e 143 return true;
donatien 6:075e36a3463e 144 }
donatien 6:075e36a3463e 145 }
donatien 6:075e36a3463e 146 return false;
donatien 6:075e36a3463e 147 }
donatien 8:0d1ec493842c 148
donatien 8:0d1ec493842c 149 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3770Initializer::getType()
donatien 8:0d1ec493842c 150 {
donatien 8:0d1ec493842c 151 return WAN_DONGLE_TYPE_VODAFONEK3770;
donatien 8:0d1ec493842c 152 }
donatien 8:0d1ec493842c 153
donatien 8:0d1ec493842c 154 // NVIDIA (ICERA) /ZTE K3772-Z (Vodafone)
donatien 8:0d1ec493842c 155 // 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"
donatien 8:0d1ec493842c 156 static uint8_t vodafone_k3772_z_switch_packet[] = {
donatien 8:0d1ec493842c 157 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0, 0, 0, 0, 0, 0x06, 0x1b, 0, 0, 0, 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
donatien 8:0d1ec493842c 158 };
donatien 8:0d1ec493842c 159
donatien 8:0d1ec493842c 160 VodafoneK3772ZInitializer::VodafoneK3772ZInitializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 8:0d1ec493842c 161 {
donatien 8:0d1ec493842c 162
donatien 8:0d1ec493842c 163 }
donatien 8:0d1ec493842c 164
donatien 8:0d1ec493842c 165 uint16_t VodafoneK3772ZInitializer::getMSDVid() { return 0x19D2; }
donatien 8:0d1ec493842c 166 uint16_t VodafoneK3772ZInitializer::getMSDPid() { return 0x1179; }
donatien 8:0d1ec493842c 167
donatien 8:0d1ec493842c 168 uint16_t VodafoneK3772ZInitializer::getSerialVid() { return 0x19D2; }
donatien 8:0d1ec493842c 169 uint16_t VodafoneK3772ZInitializer::getSerialPid() { return 0x1181; }
donatien 8:0d1ec493842c 170
donatien 8:0d1ec493842c 171 bool VodafoneK3772ZInitializer::switchMode(USBDeviceConnected* pDev)
donatien 8:0d1ec493842c 172 {
donatien 8:0d1ec493842c 173 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 8:0d1ec493842c 174 {
donatien 8:0d1ec493842c 175 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 8:0d1ec493842c 176 {
donatien 9:c9e9817c398c 177 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 8:0d1ec493842c 178 if ( pEp != NULL )
donatien 8:0d1ec493842c 179 {
donatien 8:0d1ec493842c 180 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 8:0d1ec493842c 181 m_pHost->bulkWrite(pDev, pEp, vodafone_k3772_z_switch_packet, 31);
donatien 8:0d1ec493842c 182 return true;
donatien 8:0d1ec493842c 183 }
donatien 8:0d1ec493842c 184 }
donatien 8:0d1ec493842c 185 }
donatien 8:0d1ec493842c 186 return false;
donatien 8:0d1ec493842c 187 }
donatien 8:0d1ec493842c 188
donatien 9:c9e9817c398c 189 USBEndpoint* VodafoneK3772ZInitializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 8:0d1ec493842c 190 {
donatien 8:0d1ec493842c 191 return pDev->getEndpoint((serialPortNumber==1)?0:1, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 8:0d1ec493842c 192 }
donatien 8:0d1ec493842c 193
donatien 8:0d1ec493842c 194 int VodafoneK3772ZInitializer::getSerialPortCount()
donatien 8:0d1ec493842c 195 {
donatien 8:0d1ec493842c 196 return 2;
donatien 8:0d1ec493842c 197 }
donatien 8:0d1ec493842c 198
donatien 8:0d1ec493842c 199 /*virtual*/ void VodafoneK3772ZInitializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 8:0d1ec493842c 200 {
donatien 8:0d1ec493842c 201 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 8:0d1ec493842c 202 {
donatien 8:0d1ec493842c 203 m_hasSwitched = true;
donatien 8:0d1ec493842c 204 m_currentSerialIntf = 0;
donatien 8:0d1ec493842c 205 m_endpointsToFetch = 4;
donatien 8:0d1ec493842c 206 }
donatien 8:0d1ec493842c 207 else
donatien 8:0d1ec493842c 208 {
donatien 8:0d1ec493842c 209 m_hasSwitched = false;
donatien 8:0d1ec493842c 210 m_endpointsToFetch = 1;
donatien 8:0d1ec493842c 211 }
donatien 8:0d1ec493842c 212 }
donatien 8:0d1ec493842c 213
donatien 8:0d1ec493842c 214 /*virtual*/ bool VodafoneK3772ZInitializer::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 8:0d1ec493842c 215 {
donatien 8:0d1ec493842c 216 if( m_hasSwitched )
donatien 8:0d1ec493842c 217 {
donatien 8:0d1ec493842c 218 DBG("Interface #%d; Class:%02x; SubClass:%02x; Protocol:%02x", intf_nb, intf_class, intf_subclass, intf_protocol);
donatien 8:0d1ec493842c 219 if( intf_class == 0x0A )
donatien 8:0d1ec493842c 220 {
donatien 8:0d1ec493842c 221 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 1) )
donatien 8:0d1ec493842c 222 {
donatien 8:0d1ec493842c 223 m_currentSerialIntf++;
donatien 8:0d1ec493842c 224 return true;
donatien 8:0d1ec493842c 225 }
donatien 8:0d1ec493842c 226 m_currentSerialIntf++;
donatien 8:0d1ec493842c 227 }
donatien 8:0d1ec493842c 228 }
donatien 8:0d1ec493842c 229 else
donatien 8:0d1ec493842c 230 {
donatien 8:0d1ec493842c 231 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 8:0d1ec493842c 232 {
donatien 8:0d1ec493842c 233 return true;
donatien 8:0d1ec493842c 234 }
donatien 8:0d1ec493842c 235 }
donatien 8:0d1ec493842c 236 return false;
donatien 8:0d1ec493842c 237 }
donatien 8:0d1ec493842c 238
donatien 8:0d1ec493842c 239 /*virtual*/ bool VodafoneK3772ZInitializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
donatien 8:0d1ec493842c 240 {
donatien 8:0d1ec493842c 241 if( m_hasSwitched )
donatien 8:0d1ec493842c 242 {
donatien 9:c9e9817c398c 243 DBG("USBEndpoint on Inteface #%d; Type:%d; Direction:%d", intf_nb, type, dir);
donatien 8:0d1ec493842c 244 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 245 {
donatien 8:0d1ec493842c 246 m_endpointsToFetch--;
donatien 8:0d1ec493842c 247 return true;
donatien 8:0d1ec493842c 248 }
donatien 8:0d1ec493842c 249 }
donatien 8:0d1ec493842c 250 else
donatien 8:0d1ec493842c 251 {
donatien 8:0d1ec493842c 252 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 253 {
donatien 8:0d1ec493842c 254 m_endpointsToFetch--;
donatien 8:0d1ec493842c 255 return true;
donatien 8:0d1ec493842c 256 }
donatien 8:0d1ec493842c 257 }
donatien 8:0d1ec493842c 258 return false;
donatien 8:0d1ec493842c 259 }
donatien 8:0d1ec493842c 260
donatien 8:0d1ec493842c 261
donatien 8:0d1ec493842c 262 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3772ZInitializer::getType()
donatien 8:0d1ec493842c 263 {
donatien 8:0d1ec493842c 264 return WAN_DONGLE_TYPE_VODAFONEK3772Z;
donatien 8:0d1ec493842c 265 }