local fork (temporary)

Dependents:   VodafoneUSBModem_bleedingedge2

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
ashleymills
Date:
Fri Apr 26 16:52:02 2013 +0000
Revision:
27:4de37cd81412
Parent:
26:b241a57c465b
Some dead code removed.

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 12:a712bad7a979 24 #include "core/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);
ashleymills 26:b241a57c465b 40 static VodafoneK3772Initializer vodafoneK3772(pHost);
ashleymills 20:3abcf818be31 41 static VodafoneK3773Initializer vodafoneK3773(pHost);
ashleymills 21:dcc8c866ccbb 42 static VodafoneMU509Initializer vodafoneMU509(pHost);
ashleymills 21:dcc8c866ccbb 43 const static WANDongleInitializer* list[] = {
ashleymills 21:dcc8c866ccbb 44 &vodafoneK3770,
ashleymills 21:dcc8c866ccbb 45 &vodafoneK3772Z,
ashleymills 25:3184f71557bf 46 &vodafoneK3772,
ashleymills 21:dcc8c866ccbb 47 &vodafoneK3773,
ashleymills 21:dcc8c866ccbb 48 &vodafoneMU509,
ashleymills 21:dcc8c866ccbb 49 NULL
ashleymills 21:dcc8c866ccbb 50 };
donatien 3:4394986752db 51 return (WANDongleInitializer**)list;
donatien 3:4394986752db 52 }
donatien 3:4394986752db 53
donatien 3:4394986752db 54 //Huawei K3770 (Vodafone)
nherriot 5:3189db174f6b 55 // 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 56 static uint8_t vodafone_k3770_switch_packet[] = {
donatien 3:4394986752db 57 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 58 };
donatien 3:4394986752db 59
donatien 3:4394986752db 60 VodafoneK3770Initializer::VodafoneK3770Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 3:4394986752db 61 {
donatien 3:4394986752db 62
donatien 3:4394986752db 63 }
donatien 3:4394986752db 64
donatien 3:4394986752db 65 uint16_t VodafoneK3770Initializer::getMSDVid() { return 0x12D1; }
donatien 3:4394986752db 66 uint16_t VodafoneK3770Initializer::getMSDPid() { return 0x14D1; }
donatien 3:4394986752db 67
donatien 3:4394986752db 68 uint16_t VodafoneK3770Initializer::getSerialVid() { return 0x12D1; }
donatien 3:4394986752db 69 uint16_t VodafoneK3770Initializer::getSerialPid() { return 0x14C9; }
donatien 3:4394986752db 70
donatien 3:4394986752db 71 bool VodafoneK3770Initializer::switchMode(USBDeviceConnected* pDev)
donatien 3:4394986752db 72 {
donatien 3:4394986752db 73 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 3:4394986752db 74 {
donatien 3:4394986752db 75 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 3:4394986752db 76 {
donatien 9:c9e9817c398c 77 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 3:4394986752db 78 if ( pEp != NULL )
donatien 3:4394986752db 79 {
donatien 3:4394986752db 80 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 3:4394986752db 81 m_pHost->bulkWrite(pDev, pEp, vodafone_k3770_switch_packet, 31);
donatien 3:4394986752db 82 return true;
donatien 3:4394986752db 83 }
donatien 3:4394986752db 84 }
donatien 3:4394986752db 85 }
donatien 3:4394986752db 86 return false;
donatien 3:4394986752db 87 }
donatien 3:4394986752db 88
donatien 9:c9e9817c398c 89 USBEndpoint* VodafoneK3770Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 3:4394986752db 90 {
donatien 6:075e36a3463e 91 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 3:4394986752db 92 }
donatien 3:4394986752db 93
donatien 3:4394986752db 94 int VodafoneK3770Initializer::getSerialPortCount()
donatien 3:4394986752db 95 {
donatien 6:075e36a3463e 96 return 2;
donatien 6:075e36a3463e 97 }
donatien 6:075e36a3463e 98
donatien 6:075e36a3463e 99 /*virtual*/ void VodafoneK3770Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 6:075e36a3463e 100 {
donatien 6:075e36a3463e 101 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 6:075e36a3463e 102 {
donatien 6:075e36a3463e 103 m_hasSwitched = true;
donatien 6:075e36a3463e 104 m_currentSerialIntf = 0;
donatien 6:075e36a3463e 105 m_endpointsToFetch = 4;
donatien 6:075e36a3463e 106 }
donatien 6:075e36a3463e 107 else
donatien 6:075e36a3463e 108 {
donatien 6:075e36a3463e 109 m_hasSwitched = false;
donatien 6:075e36a3463e 110 m_endpointsToFetch = 1;
donatien 6:075e36a3463e 111 }
donatien 3:4394986752db 112 }
donatien 3:4394986752db 113
donatien 6:075e36a3463e 114 /*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 115 {
donatien 6:075e36a3463e 116 if( m_hasSwitched )
donatien 6:075e36a3463e 117 {
donatien 6:075e36a3463e 118 if( intf_class == 0xFF )
donatien 6:075e36a3463e 119 {
donatien 6:075e36a3463e 120 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 6:075e36a3463e 121 {
donatien 6:075e36a3463e 122 m_currentSerialIntf++;
donatien 6:075e36a3463e 123 return true;
donatien 6:075e36a3463e 124 }
donatien 6:075e36a3463e 125 m_currentSerialIntf++;
donatien 6:075e36a3463e 126 }
donatien 6:075e36a3463e 127 }
donatien 6:075e36a3463e 128 else
donatien 6:075e36a3463e 129 {
donatien 6:075e36a3463e 130 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 6:075e36a3463e 131 {
donatien 6:075e36a3463e 132 return true;
donatien 6:075e36a3463e 133 }
donatien 6:075e36a3463e 134 }
donatien 6:075e36a3463e 135 return false;
donatien 6:075e36a3463e 136 }
donatien 6:075e36a3463e 137
donatien 6:075e36a3463e 138 /*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 139 {
donatien 6:075e36a3463e 140 if( m_hasSwitched )
donatien 6:075e36a3463e 141 {
donatien 6:075e36a3463e 142 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 6:075e36a3463e 143 {
donatien 6:075e36a3463e 144 m_endpointsToFetch--;
donatien 6:075e36a3463e 145 return true;
donatien 6:075e36a3463e 146 }
donatien 6:075e36a3463e 147 }
donatien 6:075e36a3463e 148 else
donatien 6:075e36a3463e 149 {
donatien 6:075e36a3463e 150 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 6:075e36a3463e 151 {
donatien 6:075e36a3463e 152 m_endpointsToFetch--;
donatien 6:075e36a3463e 153 return true;
donatien 6:075e36a3463e 154 }
donatien 6:075e36a3463e 155 }
donatien 6:075e36a3463e 156 return false;
donatien 6:075e36a3463e 157 }
donatien 8:0d1ec493842c 158
donatien 8:0d1ec493842c 159 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3770Initializer::getType()
donatien 8:0d1ec493842c 160 {
donatien 8:0d1ec493842c 161 return WAN_DONGLE_TYPE_VODAFONEK3770;
donatien 8:0d1ec493842c 162 }
donatien 8:0d1ec493842c 163
ashleymills 21:dcc8c866ccbb 164 //Huawei MU509 (Module)
donatien 18:7d5242aa7b95 165
ashleymills 21:dcc8c866ccbb 166 VodafoneMU509Initializer::VodafoneMU509Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 18:7d5242aa7b95 167 {
donatien 18:7d5242aa7b95 168
donatien 18:7d5242aa7b95 169 }
donatien 18:7d5242aa7b95 170
ashleymills 21:dcc8c866ccbb 171 uint16_t VodafoneMU509Initializer::getMSDVid() { return 0x12D1; }
donatien 22:bec61bcc9c25 172 uint16_t VodafoneMU509Initializer::getMSDPid() { return 0x0000; } //No MSD mode (presumably)
ashleymills 21:dcc8c866ccbb 173
ashleymills 21:dcc8c866ccbb 174 uint16_t VodafoneMU509Initializer::getSerialVid() { return 0x12D1; }
ashleymills 21:dcc8c866ccbb 175 uint16_t VodafoneMU509Initializer::getSerialPid() { return 0x1001; }
ashleymills 21:dcc8c866ccbb 176
ashleymills 21:dcc8c866ccbb 177 bool VodafoneMU509Initializer::switchMode(USBDeviceConnected* pDev)
ashleymills 21:dcc8c866ccbb 178 {
donatien 22:bec61bcc9c25 179 return true; //No MSD mode
ashleymills 21:dcc8c866ccbb 180 }
ashleymills 21:dcc8c866ccbb 181
ashleymills 21:dcc8c866ccbb 182 USBEndpoint* VodafoneMU509Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
ashleymills 21:dcc8c866ccbb 183 {
ashleymills 24:f4b676f61906 184 /*
ashleymills 24:f4b676f61906 185 int sPort = serialPortNumber;
ashleymills 24:f4b676f61906 186 if(sPort==1)
ashleymills 24:f4b676f61906 187 sPort = 0;
ashleymills 24:f4b676f61906 188 if(sPort==2)
ashleymills 24:f4b676f61906 189 sPort = 1;
ashleymills 24:f4b676f61906 190 if(sPort==0)
ashleymills 24:f4b676f61906 191 sPort = 2;
ashleymills 24:f4b676f61906 192 return pDev->getEndpoint(sPort, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 24:f4b676f61906 193 */
ashleymills 24:f4b676f61906 194 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 24:f4b676f61906 195 //return pDev->getEndpoint((serialPortNumber==1)?0:1, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 21:dcc8c866ccbb 196 }
ashleymills 21:dcc8c866ccbb 197
ashleymills 21:dcc8c866ccbb 198 int VodafoneMU509Initializer::getSerialPortCount()
ashleymills 21:dcc8c866ccbb 199 {
donatien 22:bec61bcc9c25 200 return 2;
ashleymills 21:dcc8c866ccbb 201 }
ashleymills 21:dcc8c866ccbb 202
ashleymills 21:dcc8c866ccbb 203 /*virtual*/ void VodafoneMU509Initializer::setVidPid(uint16_t vid, uint16_t pid)
ashleymills 21:dcc8c866ccbb 204 {
donatien 22:bec61bcc9c25 205 m_currentSerialIntf = 0;
donatien 22:bec61bcc9c25 206 m_endpointsToFetch = 4;
ashleymills 21:dcc8c866ccbb 207 }
donatien 18:7d5242aa7b95 208
ashleymills 21:dcc8c866ccbb 209 /*virtual*/ bool VodafoneMU509Initializer::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
ashleymills 21:dcc8c866ccbb 210 {
donatien 22:bec61bcc9c25 211 if( intf_class == 0xFF )
ashleymills 21:dcc8c866ccbb 212 {
ashleymills 24:f4b676f61906 213 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 2) )
ashleymills 21:dcc8c866ccbb 214 {
ashleymills 21:dcc8c866ccbb 215 m_currentSerialIntf++;
ashleymills 21:dcc8c866ccbb 216 return true;
ashleymills 21:dcc8c866ccbb 217 }
donatien 22:bec61bcc9c25 218 m_currentSerialIntf++;
ashleymills 21:dcc8c866ccbb 219 }
ashleymills 21:dcc8c866ccbb 220 return false;
ashleymills 21:dcc8c866ccbb 221 }
donatien 18:7d5242aa7b95 222
ashleymills 21:dcc8c866ccbb 223 /*virtual*/ bool VodafoneMU509Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
ashleymills 21:dcc8c866ccbb 224 {
donatien 22:bec61bcc9c25 225 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
ashleymills 21:dcc8c866ccbb 226 {
ashleymills 24:f4b676f61906 227 DBG("new endpoint");
donatien 22:bec61bcc9c25 228 m_endpointsToFetch--;
donatien 22:bec61bcc9c25 229 return true;
ashleymills 21:dcc8c866ccbb 230 }
ashleymills 21:dcc8c866ccbb 231 return false;
ashleymills 21:dcc8c866ccbb 232 }
ashleymills 21:dcc8c866ccbb 233
ashleymills 21:dcc8c866ccbb 234 /*virtual*/ WAN_DONGLE_TYPE VodafoneMU509Initializer::getType()
ashleymills 21:dcc8c866ccbb 235 {
ashleymills 21:dcc8c866ccbb 236 return WAN_DONGLE_TYPE_VODAFONEMU509;
ashleymills 21:dcc8c866ccbb 237 }
ashleymills 21:dcc8c866ccbb 238
ashleymills 20:3abcf818be31 239 //Huawei K3773 (Vodafone)
ashleymills 20:3abcf818be31 240 // 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"
ashleymills 20:3abcf818be31 241 static uint8_t vodafone_k3773_switch_packet[] = {
ashleymills 20:3abcf818be31 242 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
ashleymills 20:3abcf818be31 243 };
ashleymills 20:3abcf818be31 244
ashleymills 20:3abcf818be31 245 VodafoneK3773Initializer::VodafoneK3773Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
ashleymills 20:3abcf818be31 246 {
ashleymills 20:3abcf818be31 247
ashleymills 20:3abcf818be31 248 }
ashleymills 20:3abcf818be31 249
ashleymills 20:3abcf818be31 250 uint16_t VodafoneK3773Initializer::getMSDVid() { return 0x12D1; }
ashleymills 20:3abcf818be31 251 uint16_t VodafoneK3773Initializer::getMSDPid() { return 0x1506; }
ashleymills 20:3abcf818be31 252
ashleymills 20:3abcf818be31 253 uint16_t VodafoneK3773Initializer::getSerialVid() { return 0x12D1; }
ashleymills 20:3abcf818be31 254 uint16_t VodafoneK3773Initializer::getSerialPid() { return 0x1506; }
ashleymills 20:3abcf818be31 255
ashleymills 20:3abcf818be31 256 bool VodafoneK3773Initializer::switchMode(USBDeviceConnected* pDev)
donatien 18:7d5242aa7b95 257 {
donatien 18:7d5242aa7b95 258 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 18:7d5242aa7b95 259 {
donatien 18:7d5242aa7b95 260 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 18:7d5242aa7b95 261 {
donatien 18:7d5242aa7b95 262 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 18:7d5242aa7b95 263 if ( pEp != NULL )
donatien 18:7d5242aa7b95 264 {
donatien 18:7d5242aa7b95 265 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
ashleymills 20:3abcf818be31 266 m_pHost->bulkWrite(pDev, pEp, vodafone_k3773_switch_packet, 31);
donatien 18:7d5242aa7b95 267 return true;
donatien 18:7d5242aa7b95 268 }
donatien 18:7d5242aa7b95 269 }
donatien 18:7d5242aa7b95 270 }
donatien 18:7d5242aa7b95 271 return false;
donatien 18:7d5242aa7b95 272 }
donatien 18:7d5242aa7b95 273
ashleymills 20:3abcf818be31 274 USBEndpoint* VodafoneK3773Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 18:7d5242aa7b95 275 {
donatien 18:7d5242aa7b95 276 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 18:7d5242aa7b95 277 }
donatien 18:7d5242aa7b95 278
ashleymills 20:3abcf818be31 279 int VodafoneK3773Initializer::getSerialPortCount()
donatien 18:7d5242aa7b95 280 {
donatien 18:7d5242aa7b95 281 return 2;
donatien 18:7d5242aa7b95 282 }
donatien 18:7d5242aa7b95 283
ashleymills 20:3abcf818be31 284 /*virtual*/ void VodafoneK3773Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 18:7d5242aa7b95 285 {
donatien 18:7d5242aa7b95 286 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 18:7d5242aa7b95 287 {
donatien 18:7d5242aa7b95 288 m_hasSwitched = true;
donatien 18:7d5242aa7b95 289 m_currentSerialIntf = 0;
donatien 18:7d5242aa7b95 290 m_endpointsToFetch = 4;
donatien 18:7d5242aa7b95 291 }
donatien 18:7d5242aa7b95 292 else
donatien 18:7d5242aa7b95 293 {
donatien 18:7d5242aa7b95 294 m_hasSwitched = false;
donatien 18:7d5242aa7b95 295 m_endpointsToFetch = 1;
donatien 18:7d5242aa7b95 296 }
donatien 18:7d5242aa7b95 297 }
donatien 18:7d5242aa7b95 298
ashleymills 20:3abcf818be31 299 /*virtual*/ bool VodafoneK3773Initializer::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 18:7d5242aa7b95 300 {
donatien 18:7d5242aa7b95 301 if( m_hasSwitched )
donatien 18:7d5242aa7b95 302 {
donatien 18:7d5242aa7b95 303 if( intf_class == 0xFF )
donatien 18:7d5242aa7b95 304 {
ashleymills 20:3abcf818be31 305 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 18:7d5242aa7b95 306 {
donatien 18:7d5242aa7b95 307 m_currentSerialIntf++;
donatien 18:7d5242aa7b95 308 return true;
donatien 18:7d5242aa7b95 309 }
donatien 18:7d5242aa7b95 310 m_currentSerialIntf++;
donatien 18:7d5242aa7b95 311 }
donatien 18:7d5242aa7b95 312 }
donatien 18:7d5242aa7b95 313 else
donatien 18:7d5242aa7b95 314 {
donatien 18:7d5242aa7b95 315 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 18:7d5242aa7b95 316 {
donatien 18:7d5242aa7b95 317 return true;
donatien 18:7d5242aa7b95 318 }
donatien 18:7d5242aa7b95 319 }
donatien 18:7d5242aa7b95 320 return false;
donatien 18:7d5242aa7b95 321 }
donatien 18:7d5242aa7b95 322
ashleymills 20:3abcf818be31 323 /*virtual*/ bool VodafoneK3773Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
donatien 18:7d5242aa7b95 324 {
donatien 18:7d5242aa7b95 325 if( m_hasSwitched )
donatien 18:7d5242aa7b95 326 {
donatien 18:7d5242aa7b95 327 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 18:7d5242aa7b95 328 {
donatien 18:7d5242aa7b95 329 m_endpointsToFetch--;
donatien 18:7d5242aa7b95 330 return true;
donatien 18:7d5242aa7b95 331 }
donatien 18:7d5242aa7b95 332 }
donatien 18:7d5242aa7b95 333 else
donatien 18:7d5242aa7b95 334 {
donatien 18:7d5242aa7b95 335 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 18:7d5242aa7b95 336 {
donatien 18:7d5242aa7b95 337 m_endpointsToFetch--;
donatien 18:7d5242aa7b95 338 return true;
donatien 18:7d5242aa7b95 339 }
donatien 18:7d5242aa7b95 340 }
donatien 18:7d5242aa7b95 341 return false;
donatien 18:7d5242aa7b95 342 }
donatien 18:7d5242aa7b95 343
ashleymills 20:3abcf818be31 344 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3773Initializer::getType()
donatien 18:7d5242aa7b95 345 {
ashleymills 20:3abcf818be31 346 return WAN_DONGLE_TYPE_VODAFONEK3773;
donatien 18:7d5242aa7b95 347 }
donatien 18:7d5242aa7b95 348
donatien 8:0d1ec493842c 349 // NVIDIA (ICERA) /ZTE K3772-Z (Vodafone)
donatien 8:0d1ec493842c 350 // 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 351 static uint8_t vodafone_k3772_z_switch_packet[] = {
donatien 8:0d1ec493842c 352 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 353 };
donatien 8:0d1ec493842c 354
donatien 8:0d1ec493842c 355 VodafoneK3772ZInitializer::VodafoneK3772ZInitializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 8:0d1ec493842c 356 {
donatien 8:0d1ec493842c 357
donatien 8:0d1ec493842c 358 }
donatien 8:0d1ec493842c 359
donatien 8:0d1ec493842c 360 uint16_t VodafoneK3772ZInitializer::getMSDVid() { return 0x19D2; }
donatien 8:0d1ec493842c 361 uint16_t VodafoneK3772ZInitializer::getMSDPid() { return 0x1179; }
donatien 8:0d1ec493842c 362
donatien 8:0d1ec493842c 363 uint16_t VodafoneK3772ZInitializer::getSerialVid() { return 0x19D2; }
donatien 8:0d1ec493842c 364 uint16_t VodafoneK3772ZInitializer::getSerialPid() { return 0x1181; }
donatien 8:0d1ec493842c 365
donatien 8:0d1ec493842c 366 bool VodafoneK3772ZInitializer::switchMode(USBDeviceConnected* pDev)
donatien 8:0d1ec493842c 367 {
donatien 8:0d1ec493842c 368 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 8:0d1ec493842c 369 {
donatien 8:0d1ec493842c 370 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 8:0d1ec493842c 371 {
donatien 9:c9e9817c398c 372 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 8:0d1ec493842c 373 if ( pEp != NULL )
donatien 8:0d1ec493842c 374 {
donatien 8:0d1ec493842c 375 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 8:0d1ec493842c 376 m_pHost->bulkWrite(pDev, pEp, vodafone_k3772_z_switch_packet, 31);
donatien 8:0d1ec493842c 377 return true;
donatien 8:0d1ec493842c 378 }
donatien 8:0d1ec493842c 379 }
donatien 8:0d1ec493842c 380 }
donatien 8:0d1ec493842c 381 return false;
donatien 8:0d1ec493842c 382 }
donatien 8:0d1ec493842c 383
donatien 9:c9e9817c398c 384 USBEndpoint* VodafoneK3772ZInitializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 8:0d1ec493842c 385 {
donatien 8:0d1ec493842c 386 return pDev->getEndpoint((serialPortNumber==1)?0:1, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 8:0d1ec493842c 387 }
donatien 8:0d1ec493842c 388
donatien 8:0d1ec493842c 389 int VodafoneK3772ZInitializer::getSerialPortCount()
donatien 8:0d1ec493842c 390 {
donatien 8:0d1ec493842c 391 return 2;
donatien 8:0d1ec493842c 392 }
donatien 8:0d1ec493842c 393
donatien 8:0d1ec493842c 394 /*virtual*/ void VodafoneK3772ZInitializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 8:0d1ec493842c 395 {
donatien 8:0d1ec493842c 396 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 8:0d1ec493842c 397 {
donatien 8:0d1ec493842c 398 m_hasSwitched = true;
donatien 8:0d1ec493842c 399 m_currentSerialIntf = 0;
donatien 8:0d1ec493842c 400 m_endpointsToFetch = 4;
donatien 8:0d1ec493842c 401 }
donatien 8:0d1ec493842c 402 else
donatien 8:0d1ec493842c 403 {
donatien 8:0d1ec493842c 404 m_hasSwitched = false;
donatien 8:0d1ec493842c 405 m_endpointsToFetch = 1;
donatien 8:0d1ec493842c 406 }
donatien 8:0d1ec493842c 407 }
donatien 8:0d1ec493842c 408
donatien 8:0d1ec493842c 409 /*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 410 {
donatien 8:0d1ec493842c 411 if( m_hasSwitched )
donatien 8:0d1ec493842c 412 {
donatien 8:0d1ec493842c 413 DBG("Interface #%d; Class:%02x; SubClass:%02x; Protocol:%02x", intf_nb, intf_class, intf_subclass, intf_protocol);
donatien 8:0d1ec493842c 414 if( intf_class == 0x0A )
donatien 8:0d1ec493842c 415 {
donatien 8:0d1ec493842c 416 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 1) )
donatien 8:0d1ec493842c 417 {
donatien 8:0d1ec493842c 418 m_currentSerialIntf++;
donatien 8:0d1ec493842c 419 return true;
donatien 8:0d1ec493842c 420 }
donatien 8:0d1ec493842c 421 m_currentSerialIntf++;
donatien 8:0d1ec493842c 422 }
donatien 8:0d1ec493842c 423 }
donatien 8:0d1ec493842c 424 else
donatien 8:0d1ec493842c 425 {
donatien 8:0d1ec493842c 426 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 8:0d1ec493842c 427 {
donatien 8:0d1ec493842c 428 return true;
donatien 8:0d1ec493842c 429 }
donatien 8:0d1ec493842c 430 }
donatien 8:0d1ec493842c 431 return false;
donatien 8:0d1ec493842c 432 }
donatien 8:0d1ec493842c 433
donatien 8:0d1ec493842c 434 /*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 435 {
donatien 8:0d1ec493842c 436 if( m_hasSwitched )
donatien 8:0d1ec493842c 437 {
donatien 9:c9e9817c398c 438 DBG("USBEndpoint on Inteface #%d; Type:%d; Direction:%d", intf_nb, type, dir);
donatien 8:0d1ec493842c 439 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 440 {
donatien 8:0d1ec493842c 441 m_endpointsToFetch--;
donatien 8:0d1ec493842c 442 return true;
donatien 8:0d1ec493842c 443 }
donatien 8:0d1ec493842c 444 }
donatien 8:0d1ec493842c 445 else
donatien 8:0d1ec493842c 446 {
donatien 8:0d1ec493842c 447 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 448 {
donatien 8:0d1ec493842c 449 m_endpointsToFetch--;
donatien 8:0d1ec493842c 450 return true;
donatien 8:0d1ec493842c 451 }
donatien 8:0d1ec493842c 452 }
donatien 8:0d1ec493842c 453 return false;
donatien 8:0d1ec493842c 454 }
donatien 8:0d1ec493842c 455
donatien 8:0d1ec493842c 456
donatien 8:0d1ec493842c 457 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3772ZInitializer::getType()
donatien 8:0d1ec493842c 458 {
donatien 8:0d1ec493842c 459 return WAN_DONGLE_TYPE_VODAFONEK3772Z;
donatien 8:0d1ec493842c 460 }
ashleymills 25:3184f71557bf 461
ashleymills 25:3184f71557bf 462 //Huawei K3772 (Vodafone)
ashleymills 25:3184f71557bf 463 // Switching from mass storage device string is: "55 53 42 43 12 34 56 78 00 02 00 00 80 00 0a 11 06 20 00 00 00 00 00 01 00 00 00 00 00 00 00"
ashleymills 25:3184f71557bf 464 static uint8_t vodafone_k3772_switch_packet[] = {
ashleymills 25:3184f71557bf 465 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0x02, 0, 0, 0x80, 0, 0x0a, 0x11, 0x06, 0x20, 0, 0, 0, 0, 0, 0x01, 0, 0, 0, 0, 0, 0, 0
ashleymills 25:3184f71557bf 466 };
ashleymills 25:3184f71557bf 467
ashleymills 25:3184f71557bf 468
ashleymills 25:3184f71557bf 469 VodafoneK3772Initializer::VodafoneK3772Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
ashleymills 25:3184f71557bf 470 {
ashleymills 25:3184f71557bf 471
ashleymills 25:3184f71557bf 472 }
ashleymills 25:3184f71557bf 473
ashleymills 25:3184f71557bf 474 uint16_t VodafoneK3772Initializer::getMSDVid() { return 0x12D1; }
ashleymills 25:3184f71557bf 475 uint16_t VodafoneK3772Initializer::getMSDPid() { return 0x1526; }
ashleymills 25:3184f71557bf 476
ashleymills 25:3184f71557bf 477 uint16_t VodafoneK3772Initializer::getSerialVid() { return 0x12D1; }
ashleymills 25:3184f71557bf 478 uint16_t VodafoneK3772Initializer::getSerialPid() { return 0x14CF; }
ashleymills 25:3184f71557bf 479
ashleymills 25:3184f71557bf 480 bool VodafoneK3772Initializer::switchMode(USBDeviceConnected* pDev)
ashleymills 25:3184f71557bf 481 {
ashleymills 25:3184f71557bf 482 for (int i = 0; i < pDev->getNbInterface(); i++)
ashleymills 25:3184f71557bf 483 {
ashleymills 25:3184f71557bf 484 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
ashleymills 25:3184f71557bf 485 {
ashleymills 25:3184f71557bf 486 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
ashleymills 25:3184f71557bf 487 if ( pEp != NULL )
ashleymills 25:3184f71557bf 488 {
ashleymills 25:3184f71557bf 489 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
ashleymills 25:3184f71557bf 490 m_pHost->bulkWrite(pDev, pEp, vodafone_k3772_switch_packet, 31);
ashleymills 25:3184f71557bf 491 return true;
ashleymills 25:3184f71557bf 492 }
ashleymills 25:3184f71557bf 493 }
ashleymills 25:3184f71557bf 494 }
ashleymills 25:3184f71557bf 495 return false;
ashleymills 25:3184f71557bf 496 }
ashleymills 25:3184f71557bf 497
ashleymills 25:3184f71557bf 498 USBEndpoint* VodafoneK3772Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
ashleymills 25:3184f71557bf 499 {
ashleymills 25:3184f71557bf 500 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 25:3184f71557bf 501 }
ashleymills 25:3184f71557bf 502
ashleymills 25:3184f71557bf 503 int VodafoneK3772Initializer::getSerialPortCount()
ashleymills 25:3184f71557bf 504 {
ashleymills 25:3184f71557bf 505 return 2;
ashleymills 25:3184f71557bf 506 }
ashleymills 25:3184f71557bf 507
ashleymills 25:3184f71557bf 508 /*virtual*/ void VodafoneK3772Initializer::setVidPid(uint16_t vid, uint16_t pid)
ashleymills 25:3184f71557bf 509 {
ashleymills 25:3184f71557bf 510 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
ashleymills 25:3184f71557bf 511 {
ashleymills 25:3184f71557bf 512 m_hasSwitched = true;
ashleymills 25:3184f71557bf 513 m_currentSerialIntf = 0;
ashleymills 25:3184f71557bf 514 m_endpointsToFetch = 4;
ashleymills 25:3184f71557bf 515 }
ashleymills 25:3184f71557bf 516 else
ashleymills 25:3184f71557bf 517 {
ashleymills 25:3184f71557bf 518 m_hasSwitched = false;
ashleymills 25:3184f71557bf 519 m_endpointsToFetch = 1;
ashleymills 25:3184f71557bf 520 }
ashleymills 25:3184f71557bf 521 }
ashleymills 25:3184f71557bf 522
ashleymills 25:3184f71557bf 523 /*virtual*/ bool VodafoneK3772Initializer::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
ashleymills 25:3184f71557bf 524 {
ashleymills 25:3184f71557bf 525 if( m_hasSwitched )
ashleymills 25:3184f71557bf 526 {
ashleymills 25:3184f71557bf 527 if( intf_class == 0xFF )
ashleymills 25:3184f71557bf 528 {
ashleymills 25:3184f71557bf 529 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 2) )
ashleymills 25:3184f71557bf 530 {
ashleymills 25:3184f71557bf 531 m_currentSerialIntf++;
ashleymills 25:3184f71557bf 532 return true;
ashleymills 25:3184f71557bf 533 }
ashleymills 25:3184f71557bf 534 m_currentSerialIntf++;
ashleymills 25:3184f71557bf 535 }
ashleymills 25:3184f71557bf 536 }
ashleymills 25:3184f71557bf 537 else
ashleymills 25:3184f71557bf 538 {
ashleymills 25:3184f71557bf 539 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
ashleymills 25:3184f71557bf 540 {
ashleymills 25:3184f71557bf 541 return true;
ashleymills 25:3184f71557bf 542 }
ashleymills 25:3184f71557bf 543 }
ashleymills 25:3184f71557bf 544 return false;
ashleymills 25:3184f71557bf 545 }
ashleymills 25:3184f71557bf 546
ashleymills 25:3184f71557bf 547 /*virtual*/ bool VodafoneK3772Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
ashleymills 25:3184f71557bf 548 {
ashleymills 25:3184f71557bf 549 if( m_hasSwitched )
ashleymills 25:3184f71557bf 550 {
ashleymills 25:3184f71557bf 551 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
ashleymills 25:3184f71557bf 552 {
ashleymills 25:3184f71557bf 553 m_endpointsToFetch--;
ashleymills 25:3184f71557bf 554 return true;
ashleymills 25:3184f71557bf 555 }
ashleymills 25:3184f71557bf 556 }
ashleymills 25:3184f71557bf 557 else
ashleymills 25:3184f71557bf 558 {
ashleymills 25:3184f71557bf 559 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
ashleymills 25:3184f71557bf 560 {
ashleymills 25:3184f71557bf 561 m_endpointsToFetch--;
ashleymills 25:3184f71557bf 562 return true;
ashleymills 25:3184f71557bf 563 }
ashleymills 25:3184f71557bf 564 }
ashleymills 25:3184f71557bf 565 return false;
ashleymills 25:3184f71557bf 566 }
ashleymills 25:3184f71557bf 567
ashleymills 25:3184f71557bf 568 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3772Initializer::getType()
ashleymills 25:3184f71557bf 569 {
ashleymills 25:3184f71557bf 570 return WAN_DONGLE_TYPE_VODAFONEK3772;
ashleymills 25:3184f71557bf 571 }