Integrating the ublox LISA C200 modem

Fork of SprintUSBModemHTTPClientTest by Donatien Garnier

Committer:
sam_grove
Date:
Thu Sep 26 00:44:20 2013 -0500
Revision:
5:3f93dd1d4cb3
Exported program and replaced contents of the repo with the source
to build and debug using keil mdk. Libs NOT upto date are lwip, lwip-sys
and socket. these have newer versions under mbed_official but were starting
from a know working point

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sam_grove 5:3f93dd1d4cb3 1 /* Copyright (c) 2010-2012 mbed.org, MIT License
sam_grove 5:3f93dd1d4cb3 2 *
sam_grove 5:3f93dd1d4cb3 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
sam_grove 5:3f93dd1d4cb3 4 * and associated documentation files (the "Software"), to deal in the Software without
sam_grove 5:3f93dd1d4cb3 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
sam_grove 5:3f93dd1d4cb3 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
sam_grove 5:3f93dd1d4cb3 7 * Software is furnished to do so, subject to the following conditions:
sam_grove 5:3f93dd1d4cb3 8 *
sam_grove 5:3f93dd1d4cb3 9 * The above copyright notice and this permission notice shall be included in all copies or
sam_grove 5:3f93dd1d4cb3 10 * substantial portions of the Software.
sam_grove 5:3f93dd1d4cb3 11 *
sam_grove 5:3f93dd1d4cb3 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
sam_grove 5:3f93dd1d4cb3 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
sam_grove 5:3f93dd1d4cb3 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
sam_grove 5:3f93dd1d4cb3 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
sam_grove 5:3f93dd1d4cb3 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
sam_grove 5:3f93dd1d4cb3 17 */
sam_grove 5:3f93dd1d4cb3 18
sam_grove 5:3f93dd1d4cb3 19 #define __DEBUG__ 0
sam_grove 5:3f93dd1d4cb3 20 #ifndef __MODULE__
sam_grove 5:3f93dd1d4cb3 21 #define __MODULE__ "WANDongle.cpp"
sam_grove 5:3f93dd1d4cb3 22 #endif
sam_grove 5:3f93dd1d4cb3 23
sam_grove 5:3f93dd1d4cb3 24 #include "core/dbg.h"
sam_grove 5:3f93dd1d4cb3 25 #include <cstdint>
sam_grove 5:3f93dd1d4cb3 26 #include "rtos.h"
sam_grove 5:3f93dd1d4cb3 27
sam_grove 5:3f93dd1d4cb3 28 #include "WANDongle.h"
sam_grove 5:3f93dd1d4cb3 29 #include "WANDongleInitializer.h"
sam_grove 5:3f93dd1d4cb3 30
sam_grove 5:3f93dd1d4cb3 31 WANDongle::WANDongle() : m_pInitializer(NULL), m_serialCount(0)
sam_grove 5:3f93dd1d4cb3 32 {
sam_grove 5:3f93dd1d4cb3 33 host = USBHost::getHostInst();
sam_grove 5:3f93dd1d4cb3 34 init();
sam_grove 5:3f93dd1d4cb3 35 }
sam_grove 5:3f93dd1d4cb3 36
sam_grove 5:3f93dd1d4cb3 37
sam_grove 5:3f93dd1d4cb3 38 bool WANDongle::connected() {
sam_grove 5:3f93dd1d4cb3 39 return dev_connected;
sam_grove 5:3f93dd1d4cb3 40 }
sam_grove 5:3f93dd1d4cb3 41
sam_grove 5:3f93dd1d4cb3 42 bool WANDongle::tryConnect()
sam_grove 5:3f93dd1d4cb3 43 {
sam_grove 5:3f93dd1d4cb3 44 //FIXME should run on USB thread
sam_grove 5:3f93dd1d4cb3 45
sam_grove 5:3f93dd1d4cb3 46 DBG("Trying to connect device");
sam_grove 5:3f93dd1d4cb3 47
sam_grove 5:3f93dd1d4cb3 48 if (dev_connected) {
sam_grove 5:3f93dd1d4cb3 49 return true;
sam_grove 5:3f93dd1d4cb3 50 }
sam_grove 5:3f93dd1d4cb3 51
sam_grove 5:3f93dd1d4cb3 52 m_pInitializer = NULL;
sam_grove 5:3f93dd1d4cb3 53
sam_grove 5:3f93dd1d4cb3 54 host->lock();
sam_grove 5:3f93dd1d4cb3 55
sam_grove 5:3f93dd1d4cb3 56 for (int i = 0; i < MAX_DEVICE_NB; i++)
sam_grove 5:3f93dd1d4cb3 57 {
sam_grove 5:3f93dd1d4cb3 58 if ((dev = host->getDevice(i)) != NULL)
sam_grove 5:3f93dd1d4cb3 59 {
sam_grove 5:3f93dd1d4cb3 60 m_pInitializer = NULL; //Will be set in setVidPid callback
sam_grove 5:3f93dd1d4cb3 61
sam_grove 5:3f93dd1d4cb3 62 DBG("Found one device reset it");
sam_grove 5:3f93dd1d4cb3 63 int ret = host->resetDevice(dev);
sam_grove 5:3f93dd1d4cb3 64 if(ret)
sam_grove 5:3f93dd1d4cb3 65 {
sam_grove 5:3f93dd1d4cb3 66 WARN("Could not reset it");
sam_grove 5:3f93dd1d4cb3 67 host->unlock();
sam_grove 5:3f93dd1d4cb3 68 return false;
sam_grove 5:3f93dd1d4cb3 69 }
sam_grove 5:3f93dd1d4cb3 70
sam_grove 5:3f93dd1d4cb3 71 DBG("Enumerate");
sam_grove 5:3f93dd1d4cb3 72 ret = host->enumerate(dev, this);
sam_grove 5:3f93dd1d4cb3 73 if(ret)
sam_grove 5:3f93dd1d4cb3 74 {
sam_grove 5:3f93dd1d4cb3 75 WARN("Could not enumerate");
sam_grove 5:3f93dd1d4cb3 76 host->unlock();
sam_grove 5:3f93dd1d4cb3 77 return false;
sam_grove 5:3f93dd1d4cb3 78 }
sam_grove 5:3f93dd1d4cb3 79
sam_grove 5:3f93dd1d4cb3 80 DBG("Device has VID:%04x PID:%04x", dev->getVid(), dev->getPid());
sam_grove 5:3f93dd1d4cb3 81
sam_grove 5:3f93dd1d4cb3 82 if(m_pInitializer) //If an initializer has been found
sam_grove 5:3f93dd1d4cb3 83 {
sam_grove 5:3f93dd1d4cb3 84 DBG("m_pInitializer=%p", m_pInitializer);
sam_grove 5:3f93dd1d4cb3 85 DBG("m_pInitializer->getSerialVid()=%04x", m_pInitializer->getSerialVid());
sam_grove 5:3f93dd1d4cb3 86 DBG("m_pInitializer->getSerialPid()=%04x", m_pInitializer->getSerialPid());
sam_grove 5:3f93dd1d4cb3 87 if ((dev->getVid() == m_pInitializer->getSerialVid()) && (dev->getPid() == m_pInitializer->getSerialPid()))
sam_grove 5:3f93dd1d4cb3 88 {
sam_grove 5:3f93dd1d4cb3 89 DBG("The dongle is in virtual serial mode");
sam_grove 5:3f93dd1d4cb3 90 host->registerDriver(dev, 0, this, &WANDongle::init);
sam_grove 5:3f93dd1d4cb3 91 m_serialCount = m_pInitializer->getSerialPortCount();
sam_grove 5:3f93dd1d4cb3 92 if( m_serialCount > WANDONGLE_MAX_SERIAL_PORTS )
sam_grove 5:3f93dd1d4cb3 93 {
sam_grove 5:3f93dd1d4cb3 94 m_serialCount = WANDONGLE_MAX_SERIAL_PORTS;
sam_grove 5:3f93dd1d4cb3 95 }
sam_grove 5:3f93dd1d4cb3 96 for(int j = 0; j < m_serialCount; j++)
sam_grove 5:3f93dd1d4cb3 97 {
sam_grove 5:3f93dd1d4cb3 98 DBG("Connecting serial port #%d", j+1);
sam_grove 5:3f93dd1d4cb3 99 DBG("Ep %p", m_pInitializer->getEp(dev, j, false));
sam_grove 5:3f93dd1d4cb3 100 DBG("Ep %p", m_pInitializer->getEp(dev, j, true));
sam_grove 5:3f93dd1d4cb3 101 m_serial[j].connect( dev, m_pInitializer->getEp(dev, j, false), m_pInitializer->getEp(dev, j, true) );
sam_grove 5:3f93dd1d4cb3 102 }
sam_grove 5:3f93dd1d4cb3 103
sam_grove 5:3f93dd1d4cb3 104 DBG("Device connected");
sam_grove 5:3f93dd1d4cb3 105
sam_grove 5:3f93dd1d4cb3 106 dev_connected = true;
sam_grove 5:3f93dd1d4cb3 107 host->unlock();
sam_grove 5:3f93dd1d4cb3 108
sam_grove 5:3f93dd1d4cb3 109
sam_grove 5:3f93dd1d4cb3 110 return true;
sam_grove 5:3f93dd1d4cb3 111 }
sam_grove 5:3f93dd1d4cb3 112 else if ((dev->getVid() == m_pInitializer->getMSDVid()) && (dev->getPid() == m_pInitializer->getMSDPid()))
sam_grove 5:3f93dd1d4cb3 113 {
sam_grove 5:3f93dd1d4cb3 114 DBG("Dongle detected in MSD mode");
sam_grove 5:3f93dd1d4cb3 115 //Try to switch
sam_grove 5:3f93dd1d4cb3 116 if( m_pInitializer->switchMode(dev) )
sam_grove 5:3f93dd1d4cb3 117 {
sam_grove 5:3f93dd1d4cb3 118 DBG("Switched OK");
sam_grove 5:3f93dd1d4cb3 119 host->unlock();
sam_grove 5:3f93dd1d4cb3 120 return false; //Will be connected on a next iteration
sam_grove 5:3f93dd1d4cb3 121 }
sam_grove 5:3f93dd1d4cb3 122 else
sam_grove 5:3f93dd1d4cb3 123 {
sam_grove 5:3f93dd1d4cb3 124 ERR("Could not switch mode");
sam_grove 5:3f93dd1d4cb3 125 host->unlock();
sam_grove 5:3f93dd1d4cb3 126 return false;
sam_grove 5:3f93dd1d4cb3 127 }
sam_grove 5:3f93dd1d4cb3 128 }
sam_grove 5:3f93dd1d4cb3 129 } //if()
sam_grove 5:3f93dd1d4cb3 130 } //if()
sam_grove 5:3f93dd1d4cb3 131 } //for()
sam_grove 5:3f93dd1d4cb3 132 host->unlock();
sam_grove 5:3f93dd1d4cb3 133 return false;
sam_grove 5:3f93dd1d4cb3 134 }
sam_grove 5:3f93dd1d4cb3 135
sam_grove 5:3f93dd1d4cb3 136 bool WANDongle::disconnect()
sam_grove 5:3f93dd1d4cb3 137 {
sam_grove 5:3f93dd1d4cb3 138 dev_connected = false;
sam_grove 5:3f93dd1d4cb3 139 for(int i = 0; i < WANDONGLE_MAX_SERIAL_PORTS; i++)
sam_grove 5:3f93dd1d4cb3 140 {
sam_grove 5:3f93dd1d4cb3 141 m_serial[i].disconnect();
sam_grove 5:3f93dd1d4cb3 142 }
sam_grove 5:3f93dd1d4cb3 143 return true;
sam_grove 5:3f93dd1d4cb3 144 }
sam_grove 5:3f93dd1d4cb3 145
sam_grove 5:3f93dd1d4cb3 146 WAN_DONGLE_TYPE WANDongle::getDongleType()
sam_grove 5:3f93dd1d4cb3 147 {
sam_grove 5:3f93dd1d4cb3 148 if( m_pInitializer != NULL )
sam_grove 5:3f93dd1d4cb3 149 {
sam_grove 5:3f93dd1d4cb3 150 return m_pInitializer->getType();
sam_grove 5:3f93dd1d4cb3 151 }
sam_grove 5:3f93dd1d4cb3 152 else
sam_grove 5:3f93dd1d4cb3 153 {
sam_grove 5:3f93dd1d4cb3 154 return WAN_DONGLE_TYPE_UNKNOWN;
sam_grove 5:3f93dd1d4cb3 155 }
sam_grove 5:3f93dd1d4cb3 156 }
sam_grove 5:3f93dd1d4cb3 157
sam_grove 5:3f93dd1d4cb3 158 IUSBHostSerial& WANDongle::getSerial(int index)
sam_grove 5:3f93dd1d4cb3 159 {
sam_grove 5:3f93dd1d4cb3 160 return m_serial[index];
sam_grove 5:3f93dd1d4cb3 161 }
sam_grove 5:3f93dd1d4cb3 162
sam_grove 5:3f93dd1d4cb3 163 int WANDongle::getSerialCount()
sam_grove 5:3f93dd1d4cb3 164 {
sam_grove 5:3f93dd1d4cb3 165 return m_serialCount;
sam_grove 5:3f93dd1d4cb3 166 }
sam_grove 5:3f93dd1d4cb3 167
sam_grove 5:3f93dd1d4cb3 168 //Private methods
sam_grove 5:3f93dd1d4cb3 169 void WANDongle::init()
sam_grove 5:3f93dd1d4cb3 170 {
sam_grove 5:3f93dd1d4cb3 171 m_pInitializer = NULL;
sam_grove 5:3f93dd1d4cb3 172 dev_connected = false;
sam_grove 5:3f93dd1d4cb3 173 for(int i = 0; i < WANDONGLE_MAX_SERIAL_PORTS; i++)
sam_grove 5:3f93dd1d4cb3 174 {
sam_grove 5:3f93dd1d4cb3 175 m_serial[i].init(host);
sam_grove 5:3f93dd1d4cb3 176 }
sam_grove 5:3f93dd1d4cb3 177 }
sam_grove 5:3f93dd1d4cb3 178
sam_grove 5:3f93dd1d4cb3 179
sam_grove 5:3f93dd1d4cb3 180 /*virtual*/ void WANDongle::setVidPid(uint16_t vid, uint16_t pid)
sam_grove 5:3f93dd1d4cb3 181 {
sam_grove 5:3f93dd1d4cb3 182 //Load right initializer
sam_grove 5:3f93dd1d4cb3 183 WANDongleInitializer** initializer = WANDongleInitializer::getInitializers(host);
sam_grove 5:3f93dd1d4cb3 184
sam_grove 5:3f93dd1d4cb3 185 while(*initializer)
sam_grove 5:3f93dd1d4cb3 186 {
sam_grove 5:3f93dd1d4cb3 187 DBG("*initializer=%p", *initializer);
sam_grove 5:3f93dd1d4cb3 188 DBG("(*initializer)->getSerialVid()=%04x", (*initializer)->getSerialVid());
sam_grove 5:3f93dd1d4cb3 189 DBG("(*initializer)->getSerialPid()=%04x", (*initializer)->getSerialPid());
sam_grove 5:3f93dd1d4cb3 190 if ((dev->getVid() == (*initializer)->getSerialVid()) && (dev->getPid() == (*initializer)->getSerialPid()))
sam_grove 5:3f93dd1d4cb3 191 {
sam_grove 5:3f93dd1d4cb3 192 DBG("The dongle is in virtual serial mode");
sam_grove 5:3f93dd1d4cb3 193 m_pInitializer = *initializer;
sam_grove 5:3f93dd1d4cb3 194 break;
sam_grove 5:3f93dd1d4cb3 195 }
sam_grove 5:3f93dd1d4cb3 196 else if ((dev->getVid() == (*initializer)->getMSDVid()) && (dev->getPid() == (*initializer)->getMSDPid()))
sam_grove 5:3f93dd1d4cb3 197 {
sam_grove 5:3f93dd1d4cb3 198 DBG("Dongle detected in MSD mode");
sam_grove 5:3f93dd1d4cb3 199 m_pInitializer = *initializer;
sam_grove 5:3f93dd1d4cb3 200 break;
sam_grove 5:3f93dd1d4cb3 201 }
sam_grove 5:3f93dd1d4cb3 202 initializer++;
sam_grove 5:3f93dd1d4cb3 203 } //while()
sam_grove 5:3f93dd1d4cb3 204 if(m_pInitializer)
sam_grove 5:3f93dd1d4cb3 205 {
sam_grove 5:3f93dd1d4cb3 206 m_pInitializer->setVidPid(vid, pid);
sam_grove 5:3f93dd1d4cb3 207 }
sam_grove 5:3f93dd1d4cb3 208 }
sam_grove 5:3f93dd1d4cb3 209
sam_grove 5:3f93dd1d4cb3 210 /*virtual*/ bool WANDongle::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
sam_grove 5:3f93dd1d4cb3 211 {
sam_grove 5:3f93dd1d4cb3 212 if(m_pInitializer)
sam_grove 5:3f93dd1d4cb3 213 {
sam_grove 5:3f93dd1d4cb3 214 return m_pInitializer->parseInterface(intf_nb, intf_class, intf_subclass, intf_protocol);
sam_grove 5:3f93dd1d4cb3 215 }
sam_grove 5:3f93dd1d4cb3 216 else
sam_grove 5:3f93dd1d4cb3 217 {
sam_grove 5:3f93dd1d4cb3 218 return false;
sam_grove 5:3f93dd1d4cb3 219 }
sam_grove 5:3f93dd1d4cb3 220 }
sam_grove 5:3f93dd1d4cb3 221
sam_grove 5:3f93dd1d4cb3 222 /*virtual*/ bool WANDongle::useEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir) //Must return true if the endpoint will be used
sam_grove 5:3f93dd1d4cb3 223 {
sam_grove 5:3f93dd1d4cb3 224 if(m_pInitializer)
sam_grove 5:3f93dd1d4cb3 225 {
sam_grove 5:3f93dd1d4cb3 226 return m_pInitializer->useEndpoint(intf_nb, type, dir);
sam_grove 5:3f93dd1d4cb3 227 }
sam_grove 5:3f93dd1d4cb3 228 else
sam_grove 5:3f93dd1d4cb3 229 {
sam_grove 5:3f93dd1d4cb3 230 return false;
sam_grove 5:3f93dd1d4cb3 231 }
sam_grove 5:3f93dd1d4cb3 232 }