Changes to support Vodafone K4606

Dependents:   VodafoneUSBModem

Fork of USBHostWANDongle by mbed official

Committer:
dmitryp
Date:
Wed Jan 28 11:38:44 2015 +0000
Revision:
28:34cdecfff9f4
Parent:
27:980fe31c14f7
Added support for Vodafone K4606, for more details refer to ; http://atmega.magictale.com/2215/hacking-vodafone-k4606-3g-hsdpa-usb-modem/

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
dmitryp 28:34cdecfff9f4 31
donatien 3:4394986752db 32 WANDongleInitializer::WANDongleInitializer(USBHost* pHost) : m_pHost(pHost)
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 27:980fe31c14f7 42 static HuaweiMU509Initializer huaweiMU509(pHost);
ashleymills 27:980fe31c14f7 43 static UbloxLISAU200Initializer ubloxLISAU200(pHost);
dmitryp 28:34cdecfff9f4 44 static VodafoneK4606Initializer vodafoneK4606(pHost);
dmitryp 28:34cdecfff9f4 45
ashleymills 21:dcc8c866ccbb 46 const static WANDongleInitializer* list[] = {
ashleymills 21:dcc8c866ccbb 47 &vodafoneK3770,
ashleymills 21:dcc8c866ccbb 48 &vodafoneK3772Z,
ashleymills 25:3184f71557bf 49 &vodafoneK3772,
ashleymills 21:dcc8c866ccbb 50 &vodafoneK3773,
ashleymills 27:980fe31c14f7 51 &huaweiMU509,
ashleymills 27:980fe31c14f7 52 &ubloxLISAU200,
dmitryp 28:34cdecfff9f4 53 &vodafoneK4606,
ashleymills 21:dcc8c866ccbb 54 NULL
ashleymills 21:dcc8c866ccbb 55 };
donatien 3:4394986752db 56 return (WANDongleInitializer**)list;
donatien 3:4394986752db 57 }
donatien 3:4394986752db 58
donatien 3:4394986752db 59 //Huawei K3770 (Vodafone)
nherriot 5:3189db174f6b 60 // 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 61 static uint8_t vodafone_k3770_switch_packet[] = {
donatien 3:4394986752db 62 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 63 };
donatien 3:4394986752db 64
donatien 3:4394986752db 65 VodafoneK3770Initializer::VodafoneK3770Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 3:4394986752db 66 {
donatien 3:4394986752db 67
donatien 3:4394986752db 68 }
donatien 3:4394986752db 69
donatien 3:4394986752db 70 uint16_t VodafoneK3770Initializer::getMSDVid() { return 0x12D1; }
donatien 3:4394986752db 71 uint16_t VodafoneK3770Initializer::getMSDPid() { return 0x14D1; }
donatien 3:4394986752db 72
donatien 3:4394986752db 73 uint16_t VodafoneK3770Initializer::getSerialVid() { return 0x12D1; }
donatien 3:4394986752db 74 uint16_t VodafoneK3770Initializer::getSerialPid() { return 0x14C9; }
donatien 3:4394986752db 75
donatien 3:4394986752db 76 bool VodafoneK3770Initializer::switchMode(USBDeviceConnected* pDev)
donatien 3:4394986752db 77 {
donatien 3:4394986752db 78 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 3:4394986752db 79 {
donatien 3:4394986752db 80 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 3:4394986752db 81 {
donatien 9:c9e9817c398c 82 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 3:4394986752db 83 if ( pEp != NULL )
donatien 3:4394986752db 84 {
donatien 3:4394986752db 85 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 3:4394986752db 86 m_pHost->bulkWrite(pDev, pEp, vodafone_k3770_switch_packet, 31);
donatien 3:4394986752db 87 return true;
donatien 3:4394986752db 88 }
donatien 3:4394986752db 89 }
donatien 3:4394986752db 90 }
donatien 3:4394986752db 91 return false;
donatien 3:4394986752db 92 }
donatien 3:4394986752db 93
donatien 9:c9e9817c398c 94 USBEndpoint* VodafoneK3770Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 3:4394986752db 95 {
donatien 6:075e36a3463e 96 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 3:4394986752db 97 }
donatien 3:4394986752db 98
donatien 3:4394986752db 99 int VodafoneK3770Initializer::getSerialPortCount()
donatien 3:4394986752db 100 {
donatien 6:075e36a3463e 101 return 2;
donatien 6:075e36a3463e 102 }
donatien 6:075e36a3463e 103
donatien 6:075e36a3463e 104 /*virtual*/ void VodafoneK3770Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 6:075e36a3463e 105 {
donatien 6:075e36a3463e 106 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 6:075e36a3463e 107 {
donatien 6:075e36a3463e 108 m_hasSwitched = true;
donatien 6:075e36a3463e 109 m_currentSerialIntf = 0;
donatien 6:075e36a3463e 110 m_endpointsToFetch = 4;
donatien 6:075e36a3463e 111 }
donatien 6:075e36a3463e 112 else
donatien 6:075e36a3463e 113 {
donatien 6:075e36a3463e 114 m_hasSwitched = false;
donatien 6:075e36a3463e 115 m_endpointsToFetch = 1;
donatien 6:075e36a3463e 116 }
donatien 3:4394986752db 117 }
donatien 3:4394986752db 118
donatien 6:075e36a3463e 119 /*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 120 {
donatien 6:075e36a3463e 121 if( m_hasSwitched )
donatien 6:075e36a3463e 122 {
donatien 6:075e36a3463e 123 if( intf_class == 0xFF )
donatien 6:075e36a3463e 124 {
donatien 6:075e36a3463e 125 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 6:075e36a3463e 126 {
donatien 6:075e36a3463e 127 m_currentSerialIntf++;
donatien 6:075e36a3463e 128 return true;
donatien 6:075e36a3463e 129 }
donatien 6:075e36a3463e 130 m_currentSerialIntf++;
donatien 6:075e36a3463e 131 }
donatien 6:075e36a3463e 132 }
donatien 6:075e36a3463e 133 else
donatien 6:075e36a3463e 134 {
donatien 6:075e36a3463e 135 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 6:075e36a3463e 136 {
donatien 6:075e36a3463e 137 return true;
donatien 6:075e36a3463e 138 }
donatien 6:075e36a3463e 139 }
donatien 6:075e36a3463e 140 return false;
donatien 6:075e36a3463e 141 }
donatien 6:075e36a3463e 142
donatien 6:075e36a3463e 143 /*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 144 {
donatien 6:075e36a3463e 145 if( m_hasSwitched )
donatien 6:075e36a3463e 146 {
donatien 6:075e36a3463e 147 if( (type == BULK_ENDPOINT) && 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 else
donatien 6:075e36a3463e 154 {
donatien 6:075e36a3463e 155 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 6:075e36a3463e 156 {
donatien 6:075e36a3463e 157 m_endpointsToFetch--;
donatien 6:075e36a3463e 158 return true;
donatien 6:075e36a3463e 159 }
donatien 6:075e36a3463e 160 }
donatien 6:075e36a3463e 161 return false;
donatien 6:075e36a3463e 162 }
donatien 8:0d1ec493842c 163
donatien 8:0d1ec493842c 164 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3770Initializer::getType()
donatien 8:0d1ec493842c 165 {
ashleymills 27:980fe31c14f7 166 return WAN_DONGLE_TYPE_VODAFONE_K3770;
donatien 8:0d1ec493842c 167 }
donatien 8:0d1ec493842c 168
ashleymills 21:dcc8c866ccbb 169 //Huawei MU509 (Module)
donatien 18:7d5242aa7b95 170
ashleymills 27:980fe31c14f7 171 HuaweiMU509Initializer::HuaweiMU509Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 18:7d5242aa7b95 172 {
donatien 18:7d5242aa7b95 173
donatien 18:7d5242aa7b95 174 }
donatien 18:7d5242aa7b95 175
ashleymills 27:980fe31c14f7 176 uint16_t HuaweiMU509Initializer::getMSDVid() { return 0x12D1; }
ashleymills 27:980fe31c14f7 177 uint16_t HuaweiMU509Initializer::getMSDPid() { return 0x0000; } //No MSD mode (presumably)
ashleymills 21:dcc8c866ccbb 178
ashleymills 27:980fe31c14f7 179 uint16_t HuaweiMU509Initializer::getSerialVid() { return 0x12D1; }
ashleymills 27:980fe31c14f7 180 uint16_t HuaweiMU509Initializer::getSerialPid() { return 0x1001; }
ashleymills 21:dcc8c866ccbb 181
ashleymills 27:980fe31c14f7 182 bool HuaweiMU509Initializer::switchMode(USBDeviceConnected* pDev)
ashleymills 21:dcc8c866ccbb 183 {
donatien 22:bec61bcc9c25 184 return true; //No MSD mode
ashleymills 21:dcc8c866ccbb 185 }
ashleymills 21:dcc8c866ccbb 186
ashleymills 27:980fe31c14f7 187 USBEndpoint* HuaweiMU509Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
ashleymills 21:dcc8c866ccbb 188 {
ashleymills 24:f4b676f61906 189 /*
ashleymills 24:f4b676f61906 190 int sPort = serialPortNumber;
ashleymills 24:f4b676f61906 191 if(sPort==1)
ashleymills 24:f4b676f61906 192 sPort = 0;
ashleymills 24:f4b676f61906 193 if(sPort==2)
ashleymills 24:f4b676f61906 194 sPort = 1;
ashleymills 24:f4b676f61906 195 if(sPort==0)
ashleymills 24:f4b676f61906 196 sPort = 2;
ashleymills 24:f4b676f61906 197 return pDev->getEndpoint(sPort, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 24:f4b676f61906 198 */
ashleymills 24:f4b676f61906 199 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 24:f4b676f61906 200 //return pDev->getEndpoint((serialPortNumber==1)?0:1, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 21:dcc8c866ccbb 201 }
ashleymills 21:dcc8c866ccbb 202
ashleymills 27:980fe31c14f7 203 int HuaweiMU509Initializer::getSerialPortCount()
ashleymills 21:dcc8c866ccbb 204 {
donatien 22:bec61bcc9c25 205 return 2;
ashleymills 21:dcc8c866ccbb 206 }
ashleymills 21:dcc8c866ccbb 207
ashleymills 27:980fe31c14f7 208 /*virtual*/ void HuaweiMU509Initializer::setVidPid(uint16_t vid, uint16_t pid)
ashleymills 21:dcc8c866ccbb 209 {
donatien 22:bec61bcc9c25 210 m_currentSerialIntf = 0;
donatien 22:bec61bcc9c25 211 m_endpointsToFetch = 4;
ashleymills 21:dcc8c866ccbb 212 }
donatien 18:7d5242aa7b95 213
ashleymills 27:980fe31c14f7 214 /*virtual*/ bool HuaweiMU509Initializer::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 215 {
donatien 22:bec61bcc9c25 216 if( intf_class == 0xFF )
ashleymills 21:dcc8c866ccbb 217 {
ashleymills 24:f4b676f61906 218 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 2) )
ashleymills 21:dcc8c866ccbb 219 {
ashleymills 21:dcc8c866ccbb 220 m_currentSerialIntf++;
ashleymills 21:dcc8c866ccbb 221 return true;
ashleymills 21:dcc8c866ccbb 222 }
donatien 22:bec61bcc9c25 223 m_currentSerialIntf++;
ashleymills 21:dcc8c866ccbb 224 }
ashleymills 21:dcc8c866ccbb 225 return false;
ashleymills 21:dcc8c866ccbb 226 }
donatien 18:7d5242aa7b95 227
ashleymills 27:980fe31c14f7 228 /*virtual*/ bool HuaweiMU509Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
ashleymills 21:dcc8c866ccbb 229 {
donatien 22:bec61bcc9c25 230 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
ashleymills 21:dcc8c866ccbb 231 {
ashleymills 24:f4b676f61906 232 DBG("new endpoint");
donatien 22:bec61bcc9c25 233 m_endpointsToFetch--;
donatien 22:bec61bcc9c25 234 return true;
ashleymills 21:dcc8c866ccbb 235 }
ashleymills 21:dcc8c866ccbb 236 return false;
ashleymills 21:dcc8c866ccbb 237 }
ashleymills 21:dcc8c866ccbb 238
ashleymills 27:980fe31c14f7 239 /*virtual*/ WAN_DONGLE_TYPE HuaweiMU509Initializer::getType()
ashleymills 21:dcc8c866ccbb 240 {
ashleymills 27:980fe31c14f7 241 return WAN_DONGLE_TYPE_HUAWEI_MU509;
ashleymills 21:dcc8c866ccbb 242 }
ashleymills 21:dcc8c866ccbb 243
ashleymills 20:3abcf818be31 244 //Huawei K3773 (Vodafone)
ashleymills 20:3abcf818be31 245 // 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 246 static uint8_t vodafone_k3773_switch_packet[] = {
ashleymills 20:3abcf818be31 247 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 248 };
ashleymills 20:3abcf818be31 249
ashleymills 20:3abcf818be31 250 VodafoneK3773Initializer::VodafoneK3773Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
ashleymills 20:3abcf818be31 251 {
ashleymills 20:3abcf818be31 252
ashleymills 20:3abcf818be31 253 }
ashleymills 20:3abcf818be31 254
ashleymills 20:3abcf818be31 255 uint16_t VodafoneK3773Initializer::getMSDVid() { return 0x12D1; }
ashleymills 20:3abcf818be31 256 uint16_t VodafoneK3773Initializer::getMSDPid() { return 0x1506; }
ashleymills 20:3abcf818be31 257
ashleymills 20:3abcf818be31 258 uint16_t VodafoneK3773Initializer::getSerialVid() { return 0x12D1; }
ashleymills 20:3abcf818be31 259 uint16_t VodafoneK3773Initializer::getSerialPid() { return 0x1506; }
ashleymills 20:3abcf818be31 260
ashleymills 20:3abcf818be31 261 bool VodafoneK3773Initializer::switchMode(USBDeviceConnected* pDev)
donatien 18:7d5242aa7b95 262 {
donatien 18:7d5242aa7b95 263 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 18:7d5242aa7b95 264 {
donatien 18:7d5242aa7b95 265 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 18:7d5242aa7b95 266 {
donatien 18:7d5242aa7b95 267 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 18:7d5242aa7b95 268 if ( pEp != NULL )
donatien 18:7d5242aa7b95 269 {
donatien 18:7d5242aa7b95 270 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
ashleymills 20:3abcf818be31 271 m_pHost->bulkWrite(pDev, pEp, vodafone_k3773_switch_packet, 31);
donatien 18:7d5242aa7b95 272 return true;
donatien 18:7d5242aa7b95 273 }
donatien 18:7d5242aa7b95 274 }
donatien 18:7d5242aa7b95 275 }
donatien 18:7d5242aa7b95 276 return false;
donatien 18:7d5242aa7b95 277 }
donatien 18:7d5242aa7b95 278
ashleymills 20:3abcf818be31 279 USBEndpoint* VodafoneK3773Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 18:7d5242aa7b95 280 {
donatien 18:7d5242aa7b95 281 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 18:7d5242aa7b95 282 }
donatien 18:7d5242aa7b95 283
ashleymills 20:3abcf818be31 284 int VodafoneK3773Initializer::getSerialPortCount()
donatien 18:7d5242aa7b95 285 {
donatien 18:7d5242aa7b95 286 return 2;
donatien 18:7d5242aa7b95 287 }
donatien 18:7d5242aa7b95 288
ashleymills 20:3abcf818be31 289 /*virtual*/ void VodafoneK3773Initializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 18:7d5242aa7b95 290 {
donatien 18:7d5242aa7b95 291 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 18:7d5242aa7b95 292 {
donatien 18:7d5242aa7b95 293 m_hasSwitched = true;
donatien 18:7d5242aa7b95 294 m_currentSerialIntf = 0;
donatien 18:7d5242aa7b95 295 m_endpointsToFetch = 4;
donatien 18:7d5242aa7b95 296 }
donatien 18:7d5242aa7b95 297 else
donatien 18:7d5242aa7b95 298 {
donatien 18:7d5242aa7b95 299 m_hasSwitched = false;
donatien 18:7d5242aa7b95 300 m_endpointsToFetch = 1;
donatien 18:7d5242aa7b95 301 }
donatien 18:7d5242aa7b95 302 }
donatien 18:7d5242aa7b95 303
ashleymills 20:3abcf818be31 304 /*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 305 {
donatien 18:7d5242aa7b95 306 if( m_hasSwitched )
donatien 18:7d5242aa7b95 307 {
donatien 18:7d5242aa7b95 308 if( intf_class == 0xFF )
donatien 18:7d5242aa7b95 309 {
ashleymills 20:3abcf818be31 310 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 4) )
donatien 18:7d5242aa7b95 311 {
donatien 18:7d5242aa7b95 312 m_currentSerialIntf++;
donatien 18:7d5242aa7b95 313 return true;
donatien 18:7d5242aa7b95 314 }
donatien 18:7d5242aa7b95 315 m_currentSerialIntf++;
donatien 18:7d5242aa7b95 316 }
donatien 18:7d5242aa7b95 317 }
donatien 18:7d5242aa7b95 318 else
donatien 18:7d5242aa7b95 319 {
donatien 18:7d5242aa7b95 320 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 18:7d5242aa7b95 321 {
donatien 18:7d5242aa7b95 322 return true;
donatien 18:7d5242aa7b95 323 }
donatien 18:7d5242aa7b95 324 }
donatien 18:7d5242aa7b95 325 return false;
donatien 18:7d5242aa7b95 326 }
donatien 18:7d5242aa7b95 327
ashleymills 20:3abcf818be31 328 /*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 329 {
donatien 18:7d5242aa7b95 330 if( m_hasSwitched )
donatien 18:7d5242aa7b95 331 {
donatien 18:7d5242aa7b95 332 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 18:7d5242aa7b95 333 {
donatien 18:7d5242aa7b95 334 m_endpointsToFetch--;
donatien 18:7d5242aa7b95 335 return true;
donatien 18:7d5242aa7b95 336 }
donatien 18:7d5242aa7b95 337 }
donatien 18:7d5242aa7b95 338 else
donatien 18:7d5242aa7b95 339 {
donatien 18:7d5242aa7b95 340 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 18:7d5242aa7b95 341 {
donatien 18:7d5242aa7b95 342 m_endpointsToFetch--;
donatien 18:7d5242aa7b95 343 return true;
donatien 18:7d5242aa7b95 344 }
donatien 18:7d5242aa7b95 345 }
donatien 18:7d5242aa7b95 346 return false;
donatien 18:7d5242aa7b95 347 }
donatien 18:7d5242aa7b95 348
ashleymills 20:3abcf818be31 349 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3773Initializer::getType()
donatien 18:7d5242aa7b95 350 {
ashleymills 27:980fe31c14f7 351 return WAN_DONGLE_TYPE_VODAFONE_K3773;
donatien 18:7d5242aa7b95 352 }
donatien 18:7d5242aa7b95 353
donatien 8:0d1ec493842c 354 // NVIDIA (ICERA) /ZTE K3772-Z (Vodafone)
donatien 8:0d1ec493842c 355 // 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 356 static uint8_t vodafone_k3772_z_switch_packet[] = {
donatien 8:0d1ec493842c 357 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 358 };
donatien 8:0d1ec493842c 359
donatien 8:0d1ec493842c 360 VodafoneK3772ZInitializer::VodafoneK3772ZInitializer(USBHost* pHost) : WANDongleInitializer(pHost)
donatien 8:0d1ec493842c 361 {
donatien 8:0d1ec493842c 362
donatien 8:0d1ec493842c 363 }
donatien 8:0d1ec493842c 364
donatien 8:0d1ec493842c 365 uint16_t VodafoneK3772ZInitializer::getMSDVid() { return 0x19D2; }
donatien 8:0d1ec493842c 366 uint16_t VodafoneK3772ZInitializer::getMSDPid() { return 0x1179; }
donatien 8:0d1ec493842c 367
donatien 8:0d1ec493842c 368 uint16_t VodafoneK3772ZInitializer::getSerialVid() { return 0x19D2; }
donatien 8:0d1ec493842c 369 uint16_t VodafoneK3772ZInitializer::getSerialPid() { return 0x1181; }
donatien 8:0d1ec493842c 370
donatien 8:0d1ec493842c 371 bool VodafoneK3772ZInitializer::switchMode(USBDeviceConnected* pDev)
donatien 8:0d1ec493842c 372 {
donatien 8:0d1ec493842c 373 for (int i = 0; i < pDev->getNbInterface(); i++)
donatien 8:0d1ec493842c 374 {
donatien 8:0d1ec493842c 375 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
donatien 8:0d1ec493842c 376 {
donatien 9:c9e9817c398c 377 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
donatien 8:0d1ec493842c 378 if ( pEp != NULL )
donatien 8:0d1ec493842c 379 {
donatien 8:0d1ec493842c 380 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
donatien 8:0d1ec493842c 381 m_pHost->bulkWrite(pDev, pEp, vodafone_k3772_z_switch_packet, 31);
donatien 8:0d1ec493842c 382 return true;
donatien 8:0d1ec493842c 383 }
donatien 8:0d1ec493842c 384 }
donatien 8:0d1ec493842c 385 }
donatien 8:0d1ec493842c 386 return false;
donatien 8:0d1ec493842c 387 }
donatien 8:0d1ec493842c 388
donatien 9:c9e9817c398c 389 USBEndpoint* VodafoneK3772ZInitializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
donatien 8:0d1ec493842c 390 {
donatien 8:0d1ec493842c 391 return pDev->getEndpoint((serialPortNumber==1)?0:1, BULK_ENDPOINT, tx?OUT:IN, 0);
donatien 8:0d1ec493842c 392 }
donatien 8:0d1ec493842c 393
donatien 8:0d1ec493842c 394 int VodafoneK3772ZInitializer::getSerialPortCount()
donatien 8:0d1ec493842c 395 {
donatien 8:0d1ec493842c 396 return 2;
donatien 8:0d1ec493842c 397 }
donatien 8:0d1ec493842c 398
donatien 8:0d1ec493842c 399 /*virtual*/ void VodafoneK3772ZInitializer::setVidPid(uint16_t vid, uint16_t pid)
donatien 8:0d1ec493842c 400 {
donatien 8:0d1ec493842c 401 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
donatien 8:0d1ec493842c 402 {
donatien 8:0d1ec493842c 403 m_hasSwitched = true;
donatien 8:0d1ec493842c 404 m_currentSerialIntf = 0;
donatien 8:0d1ec493842c 405 m_endpointsToFetch = 4;
donatien 8:0d1ec493842c 406 }
donatien 8:0d1ec493842c 407 else
donatien 8:0d1ec493842c 408 {
donatien 8:0d1ec493842c 409 m_hasSwitched = false;
donatien 8:0d1ec493842c 410 m_endpointsToFetch = 1;
donatien 8:0d1ec493842c 411 }
donatien 8:0d1ec493842c 412 }
donatien 8:0d1ec493842c 413
donatien 8:0d1ec493842c 414 /*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 415 {
donatien 8:0d1ec493842c 416 if( m_hasSwitched )
donatien 8:0d1ec493842c 417 {
donatien 8:0d1ec493842c 418 DBG("Interface #%d; Class:%02x; SubClass:%02x; Protocol:%02x", intf_nb, intf_class, intf_subclass, intf_protocol);
donatien 8:0d1ec493842c 419 if( intf_class == 0x0A )
donatien 8:0d1ec493842c 420 {
donatien 8:0d1ec493842c 421 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 1) )
donatien 8:0d1ec493842c 422 {
donatien 8:0d1ec493842c 423 m_currentSerialIntf++;
donatien 8:0d1ec493842c 424 return true;
donatien 8:0d1ec493842c 425 }
donatien 8:0d1ec493842c 426 m_currentSerialIntf++;
donatien 8:0d1ec493842c 427 }
donatien 8:0d1ec493842c 428 }
donatien 8:0d1ec493842c 429 else
donatien 8:0d1ec493842c 430 {
donatien 8:0d1ec493842c 431 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
donatien 8:0d1ec493842c 432 {
donatien 8:0d1ec493842c 433 return true;
donatien 8:0d1ec493842c 434 }
donatien 8:0d1ec493842c 435 }
donatien 8:0d1ec493842c 436 return false;
donatien 8:0d1ec493842c 437 }
donatien 8:0d1ec493842c 438
donatien 8:0d1ec493842c 439 /*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 440 {
donatien 8:0d1ec493842c 441 if( m_hasSwitched )
donatien 8:0d1ec493842c 442 {
donatien 9:c9e9817c398c 443 DBG("USBEndpoint on Inteface #%d; Type:%d; Direction:%d", intf_nb, type, dir);
donatien 8:0d1ec493842c 444 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 445 {
donatien 8:0d1ec493842c 446 m_endpointsToFetch--;
donatien 8:0d1ec493842c 447 return true;
donatien 8:0d1ec493842c 448 }
donatien 8:0d1ec493842c 449 }
donatien 8:0d1ec493842c 450 else
donatien 8:0d1ec493842c 451 {
donatien 8:0d1ec493842c 452 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
donatien 8:0d1ec493842c 453 {
donatien 8:0d1ec493842c 454 m_endpointsToFetch--;
donatien 8:0d1ec493842c 455 return true;
donatien 8:0d1ec493842c 456 }
donatien 8:0d1ec493842c 457 }
donatien 8:0d1ec493842c 458 return false;
donatien 8:0d1ec493842c 459 }
donatien 8:0d1ec493842c 460
donatien 8:0d1ec493842c 461
donatien 8:0d1ec493842c 462 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3772ZInitializer::getType()
donatien 8:0d1ec493842c 463 {
ashleymills 27:980fe31c14f7 464 return WAN_DONGLE_TYPE_VODAFONE_K3772Z;
donatien 8:0d1ec493842c 465 }
ashleymills 25:3184f71557bf 466
ashleymills 25:3184f71557bf 467 //Huawei K3772 (Vodafone)
ashleymills 25:3184f71557bf 468 // 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 469 static uint8_t vodafone_k3772_switch_packet[] = {
ashleymills 25:3184f71557bf 470 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 471 };
ashleymills 25:3184f71557bf 472
ashleymills 25:3184f71557bf 473
ashleymills 25:3184f71557bf 474 VodafoneK3772Initializer::VodafoneK3772Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
ashleymills 25:3184f71557bf 475 {
ashleymills 25:3184f71557bf 476
ashleymills 25:3184f71557bf 477 }
ashleymills 25:3184f71557bf 478
ashleymills 25:3184f71557bf 479 uint16_t VodafoneK3772Initializer::getMSDVid() { return 0x12D1; }
ashleymills 25:3184f71557bf 480 uint16_t VodafoneK3772Initializer::getMSDPid() { return 0x1526; }
ashleymills 25:3184f71557bf 481
ashleymills 25:3184f71557bf 482 uint16_t VodafoneK3772Initializer::getSerialVid() { return 0x12D1; }
ashleymills 25:3184f71557bf 483 uint16_t VodafoneK3772Initializer::getSerialPid() { return 0x14CF; }
ashleymills 25:3184f71557bf 484
ashleymills 25:3184f71557bf 485 bool VodafoneK3772Initializer::switchMode(USBDeviceConnected* pDev)
ashleymills 25:3184f71557bf 486 {
ashleymills 25:3184f71557bf 487 for (int i = 0; i < pDev->getNbInterface(); i++)
ashleymills 25:3184f71557bf 488 {
ashleymills 25:3184f71557bf 489 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
ashleymills 25:3184f71557bf 490 {
ashleymills 25:3184f71557bf 491 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
ashleymills 25:3184f71557bf 492 if ( pEp != NULL )
ashleymills 25:3184f71557bf 493 {
ashleymills 25:3184f71557bf 494 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
ashleymills 25:3184f71557bf 495 m_pHost->bulkWrite(pDev, pEp, vodafone_k3772_switch_packet, 31);
ashleymills 25:3184f71557bf 496 return true;
ashleymills 25:3184f71557bf 497 }
ashleymills 25:3184f71557bf 498 }
ashleymills 25:3184f71557bf 499 }
ashleymills 25:3184f71557bf 500 return false;
ashleymills 25:3184f71557bf 501 }
ashleymills 25:3184f71557bf 502
ashleymills 25:3184f71557bf 503 USBEndpoint* VodafoneK3772Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
ashleymills 25:3184f71557bf 504 {
ashleymills 25:3184f71557bf 505 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 25:3184f71557bf 506 }
ashleymills 25:3184f71557bf 507
ashleymills 25:3184f71557bf 508 int VodafoneK3772Initializer::getSerialPortCount()
ashleymills 25:3184f71557bf 509 {
ashleymills 25:3184f71557bf 510 return 2;
ashleymills 25:3184f71557bf 511 }
ashleymills 25:3184f71557bf 512
ashleymills 25:3184f71557bf 513 /*virtual*/ void VodafoneK3772Initializer::setVidPid(uint16_t vid, uint16_t pid)
ashleymills 25:3184f71557bf 514 {
ashleymills 25:3184f71557bf 515 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
ashleymills 25:3184f71557bf 516 {
ashleymills 25:3184f71557bf 517 m_hasSwitched = true;
ashleymills 25:3184f71557bf 518 m_currentSerialIntf = 0;
ashleymills 25:3184f71557bf 519 m_endpointsToFetch = 4;
ashleymills 25:3184f71557bf 520 }
ashleymills 25:3184f71557bf 521 else
ashleymills 25:3184f71557bf 522 {
ashleymills 25:3184f71557bf 523 m_hasSwitched = false;
ashleymills 25:3184f71557bf 524 m_endpointsToFetch = 1;
ashleymills 25:3184f71557bf 525 }
ashleymills 25:3184f71557bf 526 }
ashleymills 25:3184f71557bf 527
ashleymills 25:3184f71557bf 528 /*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 529 {
ashleymills 25:3184f71557bf 530 if( m_hasSwitched )
ashleymills 25:3184f71557bf 531 {
ashleymills 25:3184f71557bf 532 if( intf_class == 0xFF )
ashleymills 25:3184f71557bf 533 {
ashleymills 25:3184f71557bf 534 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 2) )
ashleymills 25:3184f71557bf 535 {
ashleymills 25:3184f71557bf 536 m_currentSerialIntf++;
ashleymills 25:3184f71557bf 537 return true;
ashleymills 25:3184f71557bf 538 }
ashleymills 25:3184f71557bf 539 m_currentSerialIntf++;
ashleymills 25:3184f71557bf 540 }
ashleymills 25:3184f71557bf 541 }
ashleymills 25:3184f71557bf 542 else
ashleymills 25:3184f71557bf 543 {
ashleymills 25:3184f71557bf 544 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
ashleymills 25:3184f71557bf 545 {
ashleymills 25:3184f71557bf 546 return true;
ashleymills 25:3184f71557bf 547 }
ashleymills 25:3184f71557bf 548 }
ashleymills 25:3184f71557bf 549 return false;
ashleymills 25:3184f71557bf 550 }
ashleymills 25:3184f71557bf 551
ashleymills 25:3184f71557bf 552 /*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 553 {
ashleymills 25:3184f71557bf 554 if( m_hasSwitched )
ashleymills 25:3184f71557bf 555 {
ashleymills 25:3184f71557bf 556 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
ashleymills 25:3184f71557bf 557 {
ashleymills 25:3184f71557bf 558 m_endpointsToFetch--;
ashleymills 25:3184f71557bf 559 return true;
ashleymills 25:3184f71557bf 560 }
ashleymills 25:3184f71557bf 561 }
ashleymills 25:3184f71557bf 562 else
ashleymills 25:3184f71557bf 563 {
ashleymills 25:3184f71557bf 564 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
ashleymills 25:3184f71557bf 565 {
ashleymills 25:3184f71557bf 566 m_endpointsToFetch--;
ashleymills 25:3184f71557bf 567 return true;
ashleymills 25:3184f71557bf 568 }
ashleymills 25:3184f71557bf 569 }
ashleymills 25:3184f71557bf 570 return false;
ashleymills 25:3184f71557bf 571 }
ashleymills 25:3184f71557bf 572
ashleymills 25:3184f71557bf 573 /*virtual*/ WAN_DONGLE_TYPE VodafoneK3772Initializer::getType()
ashleymills 25:3184f71557bf 574 {
ashleymills 27:980fe31c14f7 575 return WAN_DONGLE_TYPE_VODAFONE_K3772;
ashleymills 27:980fe31c14f7 576 }
ashleymills 27:980fe31c14f7 577
ashleymills 27:980fe31c14f7 578
ashleymills 27:980fe31c14f7 579 //-----------------------------------------------------------------------
ashleymills 27:980fe31c14f7 580 // mamm, u-blox Modem
ashleymills 27:980fe31c14f7 581 //-----------------------------------------------------------------------
ashleymills 27:980fe31c14f7 582
ashleymills 27:980fe31c14f7 583 UbloxLISAU200Initializer::UbloxLISAU200Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
ashleymills 27:980fe31c14f7 584 {
ashleymills 27:980fe31c14f7 585
ashleymills 27:980fe31c14f7 586 }
ashleymills 27:980fe31c14f7 587
ashleymills 27:980fe31c14f7 588 uint16_t UbloxLISAU200Initializer::getMSDVid() { return 0x1546; }
ashleymills 27:980fe31c14f7 589 uint16_t UbloxLISAU200Initializer::getMSDPid() { return 0x0000; }
ashleymills 27:980fe31c14f7 590
ashleymills 27:980fe31c14f7 591 uint16_t UbloxLISAU200Initializer::getSerialVid() { return 0x1546; }
ashleymills 27:980fe31c14f7 592 uint16_t UbloxLISAU200Initializer::getSerialPid() { return 0x1102; }
ashleymills 27:980fe31c14f7 593
ashleymills 27:980fe31c14f7 594 bool UbloxLISAU200Initializer::switchMode(USBDeviceConnected* pDev)
ashleymills 27:980fe31c14f7 595 {
ashleymills 27:980fe31c14f7 596 for (int i = 0; i < pDev->getNbInterface(); i++)
ashleymills 27:980fe31c14f7 597 {
ashleymills 27:980fe31c14f7 598 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
ashleymills 27:980fe31c14f7 599 {
ashleymills 27:980fe31c14f7 600 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
ashleymills 27:980fe31c14f7 601 if ( pEp != NULL )
ashleymills 27:980fe31c14f7 602 {
ashleymills 27:980fe31c14f7 603 ERR("MSD descriptor found on device %p, intf %d", (void *)pDev, i);
ashleymills 27:980fe31c14f7 604 }
ashleymills 27:980fe31c14f7 605 }
ashleymills 27:980fe31c14f7 606 }
ashleymills 27:980fe31c14f7 607 return false;
ashleymills 27:980fe31c14f7 608 }
ashleymills 27:980fe31c14f7 609
ashleymills 27:980fe31c14f7 610 USBEndpoint* UbloxLISAU200Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
ashleymills 27:980fe31c14f7 611 {
ashleymills 27:980fe31c14f7 612 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
ashleymills 27:980fe31c14f7 613 }
ashleymills 27:980fe31c14f7 614
ashleymills 27:980fe31c14f7 615 #define UBX_SERIALCOUNT 7
ashleymills 27:980fe31c14f7 616
ashleymills 27:980fe31c14f7 617 int UbloxLISAU200Initializer::getSerialPortCount()
ashleymills 27:980fe31c14f7 618 {
ashleymills 27:980fe31c14f7 619 return UBX_SERIALCOUNT;
ashleymills 27:980fe31c14f7 620 }
ashleymills 27:980fe31c14f7 621
ashleymills 27:980fe31c14f7 622 /*virtual*/ void UbloxLISAU200Initializer::setVidPid(uint16_t vid, uint16_t pid)
ashleymills 27:980fe31c14f7 623 {
ashleymills 27:980fe31c14f7 624 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
ashleymills 27:980fe31c14f7 625 {
ashleymills 27:980fe31c14f7 626 m_hasSwitched = true;
ashleymills 27:980fe31c14f7 627 m_currentSerialIntf = 0;
ashleymills 27:980fe31c14f7 628 m_endpointsToFetch = UBX_SERIALCOUNT*2;
ashleymills 27:980fe31c14f7 629 }
ashleymills 27:980fe31c14f7 630 else
ashleymills 27:980fe31c14f7 631 {
ashleymills 27:980fe31c14f7 632 m_hasSwitched = false;
ashleymills 27:980fe31c14f7 633 m_endpointsToFetch = 1;
ashleymills 27:980fe31c14f7 634 }
ashleymills 27:980fe31c14f7 635 }
ashleymills 27:980fe31c14f7 636
ashleymills 27:980fe31c14f7 637 /*virtual*/ bool UbloxLISAU200Initializer::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 27:980fe31c14f7 638 {
ashleymills 27:980fe31c14f7 639 if( m_hasSwitched )
ashleymills 27:980fe31c14f7 640 {
ashleymills 27:980fe31c14f7 641 DBG("Interface #%d; Class:%02x; SubClass:%02x; Protocol:%02x", intf_nb, intf_class, intf_subclass, intf_protocol);
ashleymills 27:980fe31c14f7 642 if( intf_class == 0x0A )
ashleymills 27:980fe31c14f7 643 {
ashleymills 27:980fe31c14f7 644 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 1) )
ashleymills 27:980fe31c14f7 645 {
ashleymills 27:980fe31c14f7 646 m_currentSerialIntf++;
ashleymills 27:980fe31c14f7 647 return true;
ashleymills 27:980fe31c14f7 648 }
ashleymills 27:980fe31c14f7 649 m_currentSerialIntf++;
ashleymills 27:980fe31c14f7 650 }
ashleymills 27:980fe31c14f7 651 }
ashleymills 27:980fe31c14f7 652 else
ashleymills 27:980fe31c14f7 653 {
ashleymills 27:980fe31c14f7 654 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
ashleymills 27:980fe31c14f7 655 {
ashleymills 27:980fe31c14f7 656 return true;
ashleymills 27:980fe31c14f7 657 }
ashleymills 27:980fe31c14f7 658 }
ashleymills 27:980fe31c14f7 659 return false;
ashleymills 27:980fe31c14f7 660 }
ashleymills 27:980fe31c14f7 661
ashleymills 27:980fe31c14f7 662 /*virtual*/ bool UbloxLISAU200Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
ashleymills 27:980fe31c14f7 663 {
ashleymills 27:980fe31c14f7 664 if( m_hasSwitched )
ashleymills 27:980fe31c14f7 665 {
ashleymills 27:980fe31c14f7 666 DBG("USBEndpoint on Interface #%d; Type:%d; Direction:%d", intf_nb, type, dir);
ashleymills 27:980fe31c14f7 667 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
ashleymills 27:980fe31c14f7 668 {
ashleymills 27:980fe31c14f7 669 m_endpointsToFetch--;
ashleymills 27:980fe31c14f7 670 return true;
ashleymills 27:980fe31c14f7 671 }
ashleymills 27:980fe31c14f7 672 }
ashleymills 27:980fe31c14f7 673 else
ashleymills 27:980fe31c14f7 674 {
ashleymills 27:980fe31c14f7 675 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
ashleymills 27:980fe31c14f7 676 {
ashleymills 27:980fe31c14f7 677 m_endpointsToFetch--;
ashleymills 27:980fe31c14f7 678 return true;
ashleymills 27:980fe31c14f7 679 }
ashleymills 27:980fe31c14f7 680 }
ashleymills 27:980fe31c14f7 681 return false;
ashleymills 27:980fe31c14f7 682 }
ashleymills 27:980fe31c14f7 683
ashleymills 27:980fe31c14f7 684 /*virtual*/ WAN_DONGLE_TYPE UbloxLISAU200Initializer::getType()
ashleymills 27:980fe31c14f7 685 {
ashleymills 27:980fe31c14f7 686 return WAN_DONGLE_TYPE_UBLOX_LISAU200;
dmitryp 28:34cdecfff9f4 687 }
dmitryp 28:34cdecfff9f4 688
dmitryp 28:34cdecfff9f4 689
dmitryp 28:34cdecfff9f4 690 //-----------------------------------------------------------------------
dmitryp 28:34cdecfff9f4 691 // Huawei K4606 (Vodafone)
dmitryp 28:34cdecfff9f4 692 //-----------------------------------------------------------------------
dmitryp 28:34cdecfff9f4 693 // 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"
dmitryp 28:34cdecfff9f4 694 static uint8_t vodafone_k4606_switch_packet[] = {
dmitryp 28:34cdecfff9f4 695 0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0, 0, 0, 0, 0, 0, 0, 0x11, 0x06, 0x00, 0, 0, 0x00, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
dmitryp 28:34cdecfff9f4 696 };
dmitryp 28:34cdecfff9f4 697
dmitryp 28:34cdecfff9f4 698 VodafoneK4606Initializer::VodafoneK4606Initializer(USBHost* pHost) : WANDongleInitializer(pHost)
dmitryp 28:34cdecfff9f4 699 {
dmitryp 28:34cdecfff9f4 700 }
dmitryp 28:34cdecfff9f4 701
dmitryp 28:34cdecfff9f4 702 uint16_t VodafoneK4606Initializer::getMSDVid() { return 0x12D1; }
dmitryp 28:34cdecfff9f4 703 uint16_t VodafoneK4606Initializer::getMSDPid() { return 0x1F19; }
dmitryp 28:34cdecfff9f4 704
dmitryp 28:34cdecfff9f4 705 uint16_t VodafoneK4606Initializer::getSerialVid() { return 0x12D1; }
dmitryp 28:34cdecfff9f4 706 uint16_t VodafoneK4606Initializer::getSerialPid() { return 0x1001;}
dmitryp 28:34cdecfff9f4 707
dmitryp 28:34cdecfff9f4 708 bool VodafoneK4606Initializer::switchMode(USBDeviceConnected* pDev)
dmitryp 28:34cdecfff9f4 709 {
dmitryp 28:34cdecfff9f4 710 for (int i = 0; i < pDev->getNbInterface(); i++)
dmitryp 28:34cdecfff9f4 711 {
dmitryp 28:34cdecfff9f4 712 if (pDev->getInterface(i)->intf_class == MSD_CLASS)
dmitryp 28:34cdecfff9f4 713 {
dmitryp 28:34cdecfff9f4 714 USBEndpoint* pEp = pDev->getEndpoint(i, BULK_ENDPOINT, OUT);
dmitryp 28:34cdecfff9f4 715 if ( pEp != NULL )
dmitryp 28:34cdecfff9f4 716 {
dmitryp 28:34cdecfff9f4 717 DBG("Vodafone K4606 MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)pDev, i);
dmitryp 28:34cdecfff9f4 718 m_pHost->bulkWrite(pDev, pEp, vodafone_k4606_switch_packet, 31);
dmitryp 28:34cdecfff9f4 719 return true;
dmitryp 28:34cdecfff9f4 720 }
dmitryp 28:34cdecfff9f4 721 }
dmitryp 28:34cdecfff9f4 722 }
dmitryp 28:34cdecfff9f4 723 return false;
dmitryp 28:34cdecfff9f4 724 }
dmitryp 28:34cdecfff9f4 725
dmitryp 28:34cdecfff9f4 726 USBEndpoint* VodafoneK4606Initializer::getEp(USBDeviceConnected* pDev, int serialPortNumber, bool tx)
dmitryp 28:34cdecfff9f4 727 {
dmitryp 28:34cdecfff9f4 728 return pDev->getEndpoint(serialPortNumber, BULK_ENDPOINT, tx?OUT:IN, 0);
dmitryp 28:34cdecfff9f4 729 }
dmitryp 28:34cdecfff9f4 730
dmitryp 28:34cdecfff9f4 731 int VodafoneK4606Initializer::getSerialPortCount()
dmitryp 28:34cdecfff9f4 732 {
dmitryp 28:34cdecfff9f4 733 return 2;
dmitryp 28:34cdecfff9f4 734 }
dmitryp 28:34cdecfff9f4 735
dmitryp 28:34cdecfff9f4 736 void VodafoneK4606Initializer::setVidPid(uint16_t vid, uint16_t pid)
dmitryp 28:34cdecfff9f4 737 {
dmitryp 28:34cdecfff9f4 738 if( (vid == getSerialVid() ) && ( pid == getSerialPid() ) )
dmitryp 28:34cdecfff9f4 739 {
dmitryp 28:34cdecfff9f4 740 m_hasSwitched = true;
dmitryp 28:34cdecfff9f4 741 m_currentSerialIntf = 0;
dmitryp 28:34cdecfff9f4 742 m_endpointsToFetch = 4;
dmitryp 28:34cdecfff9f4 743 }
dmitryp 28:34cdecfff9f4 744 else
dmitryp 28:34cdecfff9f4 745 {
dmitryp 28:34cdecfff9f4 746 m_hasSwitched = false;
dmitryp 28:34cdecfff9f4 747 m_endpointsToFetch = 1;
dmitryp 28:34cdecfff9f4 748 }
dmitryp 28:34cdecfff9f4 749 }
dmitryp 28:34cdecfff9f4 750
dmitryp 28:34cdecfff9f4 751 bool VodafoneK4606Initializer::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
dmitryp 28:34cdecfff9f4 752 {
dmitryp 28:34cdecfff9f4 753 if( m_hasSwitched )
dmitryp 28:34cdecfff9f4 754 {
dmitryp 28:34cdecfff9f4 755 DBG("*K4606 parsing intf %d, intf_class %d, m_currentSerialIntf %d", intf_nb, intf_class, m_currentSerialIntf);
dmitryp 28:34cdecfff9f4 756
dmitryp 28:34cdecfff9f4 757 if( intf_class == 0x2 )
dmitryp 28:34cdecfff9f4 758 {
dmitryp 28:34cdecfff9f4 759 if( (m_currentSerialIntf == 0) || (m_currentSerialIntf == 2) )
dmitryp 28:34cdecfff9f4 760 {
dmitryp 28:34cdecfff9f4 761 m_currentSerialIntf++;
dmitryp 28:34cdecfff9f4 762 return true;
dmitryp 28:34cdecfff9f4 763 }
dmitryp 28:34cdecfff9f4 764 m_currentSerialIntf++;
dmitryp 28:34cdecfff9f4 765 }
dmitryp 28:34cdecfff9f4 766 }
dmitryp 28:34cdecfff9f4 767 else
dmitryp 28:34cdecfff9f4 768 {
dmitryp 28:34cdecfff9f4 769 if( (intf_nb == 0) && (intf_class == MSD_CLASS) )
dmitryp 28:34cdecfff9f4 770 {
dmitryp 28:34cdecfff9f4 771 return true;
dmitryp 28:34cdecfff9f4 772 }
dmitryp 28:34cdecfff9f4 773 }
dmitryp 28:34cdecfff9f4 774 return false;
dmitryp 28:34cdecfff9f4 775 }
dmitryp 28:34cdecfff9f4 776
dmitryp 28:34cdecfff9f4 777 bool VodafoneK4606Initializer::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
dmitryp 28:34cdecfff9f4 778 {
dmitryp 28:34cdecfff9f4 779 if( m_hasSwitched )
dmitryp 28:34cdecfff9f4 780 {
dmitryp 28:34cdecfff9f4 781 if( (type == BULK_ENDPOINT) && m_endpointsToFetch )
dmitryp 28:34cdecfff9f4 782 {
dmitryp 28:34cdecfff9f4 783 m_endpointsToFetch--;
dmitryp 28:34cdecfff9f4 784 return true;
dmitryp 28:34cdecfff9f4 785 }
dmitryp 28:34cdecfff9f4 786 }
dmitryp 28:34cdecfff9f4 787 else
dmitryp 28:34cdecfff9f4 788 {
dmitryp 28:34cdecfff9f4 789 if( (type == BULK_ENDPOINT) && (dir == OUT) && m_endpointsToFetch )
dmitryp 28:34cdecfff9f4 790 {
dmitryp 28:34cdecfff9f4 791 m_endpointsToFetch--;
dmitryp 28:34cdecfff9f4 792 return true;
dmitryp 28:34cdecfff9f4 793 }
dmitryp 28:34cdecfff9f4 794 }
dmitryp 28:34cdecfff9f4 795 return false;
dmitryp 28:34cdecfff9f4 796 }
dmitryp 28:34cdecfff9f4 797
dmitryp 28:34cdecfff9f4 798 WAN_DONGLE_TYPE VodafoneK4606Initializer::getType()
dmitryp 28:34cdecfff9f4 799 {
dmitryp 28:34cdecfff9f4 800 return WAN_DONGLE_TYPE_VODAFONE_K4606;
dmitryp 28:34cdecfff9f4 801 }