USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Fri May 25 09:31:41 2012 +0000
Revision:
1:49df46e3295c
Parent:
0:ae46a0638b2c
Child:
2:a8b2d0cd9bbd
Memory location change for compat with new lwip lib

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 0:ae46a0638b2c 1 /* Copyright (c) 2010-2011 mbed.org, MIT License
donatien 0:ae46a0638b2c 2 *
donatien 0:ae46a0638b2c 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
donatien 0:ae46a0638b2c 4 * and associated documentation files (the "Software"), to deal in the Software without
donatien 0:ae46a0638b2c 5 * restriction, including without limitation the rights to use, copy, modify, merge, publish,
donatien 0:ae46a0638b2c 6 * distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the
donatien 0:ae46a0638b2c 7 * Software is furnished to do so, subject to the following conditions:
donatien 0:ae46a0638b2c 8 *
donatien 0:ae46a0638b2c 9 * The above copyright notice and this permission notice shall be included in all copies or
donatien 0:ae46a0638b2c 10 * substantial portions of the Software.
donatien 0:ae46a0638b2c 11 *
donatien 0:ae46a0638b2c 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
donatien 0:ae46a0638b2c 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
donatien 0:ae46a0638b2c 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
donatien 0:ae46a0638b2c 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
donatien 0:ae46a0638b2c 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
donatien 0:ae46a0638b2c 17 */
donatien 0:ae46a0638b2c 18
donatien 0:ae46a0638b2c 19 #define __DEBUG__ 4 //Maximum verbosity
donatien 0:ae46a0638b2c 20 #ifndef __MODULE__
donatien 0:ae46a0638b2c 21 #define __MODULE__ "WANDongle.cpp"
donatien 0:ae46a0638b2c 22 #endif
donatien 0:ae46a0638b2c 23
donatien 0:ae46a0638b2c 24 #include "dbg.h"
donatien 0:ae46a0638b2c 25 #include <cstdint>
donatien 0:ae46a0638b2c 26 #include "rtos.h"
donatien 0:ae46a0638b2c 27
donatien 0:ae46a0638b2c 28 #include "WANDongle.h"
donatien 0:ae46a0638b2c 29
donatien 0:ae46a0638b2c 30 //TODO refactor
donatien 0:ae46a0638b2c 31
donatien 0:ae46a0638b2c 32 //Huawei K3770 (Vodafone)
donatien 0:ae46a0638b2c 33 uint8_t vodafone_k3770_switch_packet[] = {
donatien 0:ae46a0638b2c 34 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 0:ae46a0638b2c 35 };
donatien 0:ae46a0638b2c 36
donatien 0:ae46a0638b2c 37 WANDongle::WANDongle() : cb_tx_en(false), cb_rx_en(false), listener(NULL)
donatien 0:ae46a0638b2c 38 {
donatien 0:ae46a0638b2c 39 host = USBHost::getHostInst();
donatien 0:ae46a0638b2c 40 init();
donatien 0:ae46a0638b2c 41 }
donatien 0:ae46a0638b2c 42
donatien 0:ae46a0638b2c 43
donatien 0:ae46a0638b2c 44 bool WANDongle::connected() {
donatien 0:ae46a0638b2c 45 return dev_connected;
donatien 0:ae46a0638b2c 46 }
donatien 0:ae46a0638b2c 47
donatien 0:ae46a0638b2c 48 bool WANDongle::tryConnect()
donatien 0:ae46a0638b2c 49 {
donatien 0:ae46a0638b2c 50 bool found = false;
donatien 0:ae46a0638b2c 51
donatien 0:ae46a0638b2c 52 //FIXME should run on USB thread
donatien 0:ae46a0638b2c 53
donatien 0:ae46a0638b2c 54 DBG("Trying to connect device");
donatien 0:ae46a0638b2c 55
donatien 0:ae46a0638b2c 56 if (dev_connected) {
donatien 0:ae46a0638b2c 57 return true;
donatien 0:ae46a0638b2c 58 }
donatien 0:ae46a0638b2c 59
donatien 0:ae46a0638b2c 60 host->lock();
donatien 0:ae46a0638b2c 61
donatien 0:ae46a0638b2c 62 for (int i = 0; i < MAX_DEVICE_NB; i++) {
donatien 0:ae46a0638b2c 63 if ((dev = host->getDevice(i)) != NULL) {
donatien 0:ae46a0638b2c 64
donatien 0:ae46a0638b2c 65 DBG("Found one device, reset it");
donatien 0:ae46a0638b2c 66 host->resetDevice(dev);
donatien 0:ae46a0638b2c 67
donatien 0:ae46a0638b2c 68 DBG("Enumerate");
donatien 0:ae46a0638b2c 69 host->enumerate(dev);
donatien 0:ae46a0638b2c 70
donatien 0:ae46a0638b2c 71 //Vodafone K3770
donatien 0:ae46a0638b2c 72 if ((dev->getVid() == 0x12D1) && (dev->getPid() == 0x14D1)) {
donatien 1:49df46e3295c 73 DBG("Vodafone K3370 dongle detected in MSD mode");
donatien 0:ae46a0638b2c 74
donatien 0:ae46a0638b2c 75 for (int j = 0; j < dev->getNbInterface(); j++) {
donatien 0:ae46a0638b2c 76
donatien 0:ae46a0638b2c 77 if (dev->getInterface(j)->intf_class == MSD_CLASS) {
donatien 0:ae46a0638b2c 78
donatien 0:ae46a0638b2c 79 if ( (bulk_out = dev->getEndpoint(j, BULK_ENDPOINT, OUT)) != NULL ) {
donatien 0:ae46a0638b2c 80
donatien 1:49df46e3295c 81 DBG("MSD descriptor found on device %p, intf %d, will now try to switch into serial mode", (void *)dev, j);
donatien 0:ae46a0638b2c 82
donatien 0:ae46a0638b2c 83 host->bulkWrite(dev, (Endpoint *)bulk_out, vodafone_k3770_switch_packet, 31);
donatien 0:ae46a0638b2c 84
donatien 1:49df46e3295c 85 DBG("Switch packet sent");
donatien 0:ae46a0638b2c 86 host->unlock();
donatien 0:ae46a0638b2c 87
donatien 0:ae46a0638b2c 88
donatien 0:ae46a0638b2c 89 Thread::wait(500); //Not in a thread
donatien 0:ae46a0638b2c 90
donatien 1:49df46e3295c 91 //Not wait for the dongle to reconnect
donatien 0:ae46a0638b2c 92 while (1) {
donatien 0:ae46a0638b2c 93
donatien 0:ae46a0638b2c 94 if (found) {
donatien 0:ae46a0638b2c 95 break;
donatien 0:ae46a0638b2c 96 }
donatien 0:ae46a0638b2c 97
donatien 0:ae46a0638b2c 98 Thread::wait(100);
donatien 0:ae46a0638b2c 99
donatien 0:ae46a0638b2c 100 host->lock();
donatien 0:ae46a0638b2c 101
donatien 0:ae46a0638b2c 102
donatien 0:ae46a0638b2c 103 for (int i = 0; i < MAX_DEVICE_NB; i++) {
donatien 0:ae46a0638b2c 104 if ((dev = host->getDevice(i)) != NULL) {
donatien 0:ae46a0638b2c 105 host->resetDevice(dev);
donatien 0:ae46a0638b2c 106 host->enumerate(dev);
donatien 1:49df46e3295c 107
donatien 1:49df46e3295c 108 DBG("Found one device with vid: %04x pid: %04x", dev->getVid(), dev->getPid());
donatien 0:ae46a0638b2c 109
donatien 0:ae46a0638b2c 110 //Vodafone K3770
donatien 0:ae46a0638b2c 111 if ((dev->getVid() == 0x12D1) && (dev->getPid() == 0x14C9)) {
donatien 1:49df46e3295c 112 DBG("Switched successfully");
donatien 0:ae46a0638b2c 113 found = true;
donatien 0:ae46a0638b2c 114 break;
donatien 0:ae46a0638b2c 115 }
donatien 0:ae46a0638b2c 116 }
donatien 0:ae46a0638b2c 117 }
donatien 0:ae46a0638b2c 118
donatien 0:ae46a0638b2c 119 host->unlock();
donatien 0:ae46a0638b2c 120
donatien 0:ae46a0638b2c 121 }
donatien 0:ae46a0638b2c 122 host->lock();
donatien 0:ae46a0638b2c 123
donatien 0:ae46a0638b2c 124 if (fetchEndpoints()) {
donatien 0:ae46a0638b2c 125 DBG("ep: %p, %p\r\n", bulk_in, bulk_out);
donatien 0:ae46a0638b2c 126 max_out_size = bulk_out->getSize();
donatien 0:ae46a0638b2c 127 if( max_out_size > WANDONGLE_MAX_OUTEP_SIZE )
donatien 0:ae46a0638b2c 128 {
donatien 0:ae46a0638b2c 129 max_out_size = WANDONGLE_MAX_OUTEP_SIZE;
donatien 0:ae46a0638b2c 130 }
donatien 0:ae46a0638b2c 131 host->unlock();
donatien 0:ae46a0638b2c 132 return true;
donatien 0:ae46a0638b2c 133 }
donatien 0:ae46a0638b2c 134 host->unlock();
donatien 0:ae46a0638b2c 135 }
donatien 0:ae46a0638b2c 136 }
donatien 0:ae46a0638b2c 137 }
donatien 0:ae46a0638b2c 138 } else if ((dev->getVid() == 0x12D1) && (dev->getPid() == 0x14C9)) {
donatien 0:ae46a0638b2c 139 if (fetchEndpoints()) {
donatien 0:ae46a0638b2c 140 DBG("ep: %p, %p\r\n", bulk_in, bulk_out);
donatien 0:ae46a0638b2c 141 max_out_size = bulk_out->getSize();
donatien 0:ae46a0638b2c 142 if( max_out_size > WANDONGLE_MAX_OUTEP_SIZE )
donatien 0:ae46a0638b2c 143 {
donatien 0:ae46a0638b2c 144 max_out_size = WANDONGLE_MAX_OUTEP_SIZE;
donatien 0:ae46a0638b2c 145 }
donatien 0:ae46a0638b2c 146 host->unlock();
donatien 0:ae46a0638b2c 147 return true;
donatien 0:ae46a0638b2c 148 }
donatien 0:ae46a0638b2c 149 }
donatien 0:ae46a0638b2c 150 }
donatien 0:ae46a0638b2c 151 }
donatien 0:ae46a0638b2c 152 host->unlock();
donatien 0:ae46a0638b2c 153 bulk_in = NULL;
donatien 0:ae46a0638b2c 154 bulk_out = NULL;
donatien 0:ae46a0638b2c 155 dev_connected = false;
donatien 0:ae46a0638b2c 156 return false;
donatien 0:ae46a0638b2c 157 }
donatien 0:ae46a0638b2c 158
donatien 0:ae46a0638b2c 159 int WANDongle::readPacket()
donatien 0:ae46a0638b2c 160 {
donatien 0:ae46a0638b2c 161 rx_mtx.lock();
donatien 0:ae46a0638b2c 162 if(lock_rx)
donatien 0:ae46a0638b2c 163 {
donatien 0:ae46a0638b2c 164 ERR("Fail");
donatien 0:ae46a0638b2c 165 rx_mtx.unlock();
donatien 0:ae46a0638b2c 166 return -1;
donatien 0:ae46a0638b2c 167 }
donatien 0:ae46a0638b2c 168
donatien 0:ae46a0638b2c 169 lock_rx = true; //Receiving
donatien 0:ae46a0638b2c 170 rx_mtx.unlock();
donatien 0:ae46a0638b2c 171 // DBG("readPacket");
donatien 0:ae46a0638b2c 172 //lock_rx.lock();
donatien 0:ae46a0638b2c 173 host->lock();
donatien 0:ae46a0638b2c 174 USB_TYPE res = host->bulkRead(dev, (Endpoint *)bulk_in, buf_in, ((Endpoint *)bulk_in)->getSize(), false); //Queue transfer
donatien 0:ae46a0638b2c 175 if(res != USB_TYPE_PROCESSING)
donatien 0:ae46a0638b2c 176 {
donatien 0:ae46a0638b2c 177 host->unlock();
donatien 0:ae46a0638b2c 178 //lock_rx.unlock();
donatien 0:ae46a0638b2c 179 ERR("host->bulkRead() returned %d", res);
donatien 0:ae46a0638b2c 180 Thread::wait(100);
donatien 0:ae46a0638b2c 181 return -1;
donatien 0:ae46a0638b2c 182 }
donatien 0:ae46a0638b2c 183 host->unlock();
donatien 0:ae46a0638b2c 184 return 0;
donatien 0:ae46a0638b2c 185 }
donatien 0:ae46a0638b2c 186
donatien 0:ae46a0638b2c 187 int WANDongle::writePacket()
donatien 0:ae46a0638b2c 188 {
donatien 0:ae46a0638b2c 189 tx_mtx.lock();
donatien 0:ae46a0638b2c 190 if(lock_tx)
donatien 0:ae46a0638b2c 191 {
donatien 0:ae46a0638b2c 192 ERR("Fail");
donatien 0:ae46a0638b2c 193 tx_mtx.unlock();
donatien 0:ae46a0638b2c 194 return -1;
donatien 0:ae46a0638b2c 195 }
donatien 0:ae46a0638b2c 196
donatien 0:ae46a0638b2c 197 lock_tx = true; //Transmitting
donatien 0:ae46a0638b2c 198 tx_mtx.unlock();
donatien 0:ae46a0638b2c 199 // DBG("writePacket");
donatien 0:ae46a0638b2c 200
donatien 0:ae46a0638b2c 201 //lock_tx.lock();
donatien 0:ae46a0638b2c 202 host->lock();
donatien 0:ae46a0638b2c 203 USB_TYPE res = host->bulkWrite(dev, (Endpoint *)bulk_out, buf_out, buf_out_len, false); //Queue transfer
donatien 0:ae46a0638b2c 204 if(res != USB_TYPE_PROCESSING)
donatien 0:ae46a0638b2c 205 {
donatien 0:ae46a0638b2c 206 host->unlock();
donatien 0:ae46a0638b2c 207 //lock_tx.unlock();
donatien 0:ae46a0638b2c 208 ERR("host->bulkWrite() returned %d", res);
donatien 0:ae46a0638b2c 209 Thread::wait(100);
donatien 0:ae46a0638b2c 210 return -1;
donatien 0:ae46a0638b2c 211 }
donatien 0:ae46a0638b2c 212 host->unlock();
donatien 0:ae46a0638b2c 213 return 0;
donatien 0:ae46a0638b2c 214 }
donatien 0:ae46a0638b2c 215
donatien 0:ae46a0638b2c 216 int WANDongle::putc(int c)
donatien 0:ae46a0638b2c 217 {
donatien 0:ae46a0638b2c 218 tx_mtx.lock();
donatien 0:ae46a0638b2c 219 if(!lock_tx)
donatien 0:ae46a0638b2c 220 {
donatien 0:ae46a0638b2c 221 if(buf_out_len < max_out_size)
donatien 0:ae46a0638b2c 222 {
donatien 0:ae46a0638b2c 223 buf_out[buf_out_len] = (uint8_t)c;
donatien 0:ae46a0638b2c 224 buf_out_len++;
donatien 0:ae46a0638b2c 225 }
donatien 0:ae46a0638b2c 226 }
donatien 0:ae46a0638b2c 227 else
donatien 0:ae46a0638b2c 228 {
donatien 0:ae46a0638b2c 229 ERR("CAN'T WRITE!");
donatien 0:ae46a0638b2c 230 }
donatien 0:ae46a0638b2c 231 tx_mtx.unlock();
donatien 0:ae46a0638b2c 232 return c;
donatien 0:ae46a0638b2c 233 }
donatien 0:ae46a0638b2c 234
donatien 0:ae46a0638b2c 235 int WANDongle::getc()
donatien 0:ae46a0638b2c 236 {
donatien 0:ae46a0638b2c 237 rx_mtx.lock();
donatien 0:ae46a0638b2c 238 int c = 0;
donatien 0:ae46a0638b2c 239 if(!lock_rx)
donatien 0:ae46a0638b2c 240 {
donatien 0:ae46a0638b2c 241 if(buf_in_read_pos < buf_in_len)
donatien 0:ae46a0638b2c 242 {
donatien 0:ae46a0638b2c 243 c = (int)buf_in[buf_in_read_pos];
donatien 0:ae46a0638b2c 244 buf_in_read_pos++;
donatien 0:ae46a0638b2c 245 }
donatien 0:ae46a0638b2c 246 }
donatien 0:ae46a0638b2c 247 else
donatien 0:ae46a0638b2c 248 {
donatien 0:ae46a0638b2c 249 ERR("CAN'T READ!");
donatien 0:ae46a0638b2c 250 }
donatien 0:ae46a0638b2c 251 rx_mtx.unlock();
donatien 0:ae46a0638b2c 252 return c;
donatien 0:ae46a0638b2c 253 }
donatien 0:ae46a0638b2c 254
donatien 0:ae46a0638b2c 255 int WANDongle::readable()
donatien 0:ae46a0638b2c 256 {
donatien 0:ae46a0638b2c 257 rx_mtx.lock();
donatien 0:ae46a0638b2c 258 if (lock_rx)
donatien 0:ae46a0638b2c 259 {
donatien 0:ae46a0638b2c 260 rx_mtx.unlock();
donatien 0:ae46a0638b2c 261 return 0;
donatien 0:ae46a0638b2c 262 }
donatien 0:ae46a0638b2c 263
donatien 0:ae46a0638b2c 264 /* if( !lock_rx.trylock() )
donatien 0:ae46a0638b2c 265 {
donatien 0:ae46a0638b2c 266 return 0;
donatien 0:ae46a0638b2c 267 }*/
donatien 0:ae46a0638b2c 268 int res = buf_in_len - buf_in_read_pos;
donatien 0:ae46a0638b2c 269 //lock_rx.unlock();
donatien 0:ae46a0638b2c 270 rx_mtx.unlock();
donatien 0:ae46a0638b2c 271 return res;
donatien 0:ae46a0638b2c 272 }
donatien 0:ae46a0638b2c 273
donatien 0:ae46a0638b2c 274 int WANDongle::writeable()
donatien 0:ae46a0638b2c 275 {
donatien 0:ae46a0638b2c 276 tx_mtx.lock();
donatien 0:ae46a0638b2c 277 if (lock_tx)
donatien 0:ae46a0638b2c 278 {
donatien 0:ae46a0638b2c 279 tx_mtx.unlock();
donatien 0:ae46a0638b2c 280 return 0;
donatien 0:ae46a0638b2c 281 }
donatien 0:ae46a0638b2c 282
donatien 0:ae46a0638b2c 283 /*if( !lock_tx.trylock() )
donatien 0:ae46a0638b2c 284 {
donatien 0:ae46a0638b2c 285 return 0;
donatien 0:ae46a0638b2c 286 }*/
donatien 0:ae46a0638b2c 287 int res = max_out_size - buf_out_len;
donatien 0:ae46a0638b2c 288 tx_mtx.unlock();
donatien 0:ae46a0638b2c 289 //lock_tx.unlock();
donatien 0:ae46a0638b2c 290 return res;
donatien 0:ae46a0638b2c 291 }
donatien 0:ae46a0638b2c 292
donatien 0:ae46a0638b2c 293 void WANDongle::attach(IUSBHostSerialListener* pListener)
donatien 0:ae46a0638b2c 294 {
donatien 0:ae46a0638b2c 295 if(pListener == NULL)
donatien 0:ae46a0638b2c 296 {
donatien 0:ae46a0638b2c 297 setupIrq(false, RxIrq);
donatien 0:ae46a0638b2c 298 setupIrq(false, TxIrq);
donatien 0:ae46a0638b2c 299 }
donatien 0:ae46a0638b2c 300 listener = pListener;
donatien 0:ae46a0638b2c 301 if(pListener != NULL)
donatien 0:ae46a0638b2c 302 {
donatien 0:ae46a0638b2c 303 setupIrq(true, RxIrq);
donatien 0:ae46a0638b2c 304 setupIrq(true, TxIrq);
donatien 0:ae46a0638b2c 305 }
donatien 0:ae46a0638b2c 306 }
donatien 0:ae46a0638b2c 307
donatien 0:ae46a0638b2c 308 void WANDongle::setupIrq(bool en, IrqType irq /*= RxIrq*/)
donatien 0:ae46a0638b2c 309 {
donatien 0:ae46a0638b2c 310 switch(irq)
donatien 0:ae46a0638b2c 311 {
donatien 0:ae46a0638b2c 312 case RxIrq:
donatien 0:ae46a0638b2c 313 rx_mtx.lock();
donatien 0:ae46a0638b2c 314 cb_rx_en = en;
donatien 0:ae46a0638b2c 315 if(en && cb_rx_pending)
donatien 0:ae46a0638b2c 316 {
donatien 0:ae46a0638b2c 317 cb_rx_pending = false;
donatien 0:ae46a0638b2c 318 rx_mtx.unlock();
donatien 0:ae46a0638b2c 319 listener->readable(); //Process the interrupt that was raised
donatien 0:ae46a0638b2c 320 }
donatien 0:ae46a0638b2c 321 else
donatien 0:ae46a0638b2c 322 {
donatien 0:ae46a0638b2c 323 rx_mtx.unlock();
donatien 0:ae46a0638b2c 324 }
donatien 0:ae46a0638b2c 325 break;
donatien 0:ae46a0638b2c 326 case TxIrq:
donatien 0:ae46a0638b2c 327 tx_mtx.lock();
donatien 0:ae46a0638b2c 328 cb_tx_en = en;
donatien 0:ae46a0638b2c 329 if(en && cb_tx_pending)
donatien 0:ae46a0638b2c 330 {
donatien 0:ae46a0638b2c 331 cb_tx_pending = false;
donatien 0:ae46a0638b2c 332 tx_mtx.unlock();
donatien 0:ae46a0638b2c 333 listener->writeable(); //Process the interrupt that was raised
donatien 0:ae46a0638b2c 334 }
donatien 0:ae46a0638b2c 335 else
donatien 0:ae46a0638b2c 336 {
donatien 0:ae46a0638b2c 337 tx_mtx.unlock();
donatien 0:ae46a0638b2c 338 }
donatien 0:ae46a0638b2c 339 break;
donatien 0:ae46a0638b2c 340 }
donatien 0:ae46a0638b2c 341 }
donatien 0:ae46a0638b2c 342
donatien 0:ae46a0638b2c 343 //Private methods
donatien 0:ae46a0638b2c 344
donatien 0:ae46a0638b2c 345 void WANDongle::init()
donatien 0:ae46a0638b2c 346 {
donatien 0:ae46a0638b2c 347 dev_connected = false;
donatien 0:ae46a0638b2c 348
donatien 0:ae46a0638b2c 349 bulk_in = NULL;
donatien 0:ae46a0638b2c 350 bulk_out = NULL;
donatien 0:ae46a0638b2c 351
donatien 0:ae46a0638b2c 352 buf_out_len = 0;
donatien 0:ae46a0638b2c 353 lock_tx = false;
donatien 0:ae46a0638b2c 354 cb_tx_en = false;
donatien 0:ae46a0638b2c 355 cb_tx_pending = false;
donatien 0:ae46a0638b2c 356
donatien 0:ae46a0638b2c 357 buf_in_len = 0;
donatien 0:ae46a0638b2c 358 buf_in_read_pos = 0;
donatien 0:ae46a0638b2c 359 lock_rx = false;
donatien 0:ae46a0638b2c 360 cb_rx_en = false;
donatien 0:ae46a0638b2c 361 cb_rx_pending = false;
donatien 0:ae46a0638b2c 362
donatien 0:ae46a0638b2c 363 }
donatien 0:ae46a0638b2c 364
donatien 0:ae46a0638b2c 365 bool WANDongle::fetchEndpoints()
donatien 0:ae46a0638b2c 366 {
donatien 0:ae46a0638b2c 367 bulk_in = dev->getEndpoint(0, BULK_ENDPOINT, IN);
donatien 0:ae46a0638b2c 368 bulk_out = dev->getEndpoint(0, BULK_ENDPOINT, OUT);
donatien 0:ae46a0638b2c 369 if ((bulk_in != NULL) && (bulk_out != NULL))
donatien 0:ae46a0638b2c 370 {
donatien 0:ae46a0638b2c 371
donatien 0:ae46a0638b2c 372 DBG("SERIAL FOUND on device %p, intf %d, bulk_in: %p, bulk_out: %p\r\n",
donatien 0:ae46a0638b2c 373 (void *)dev, 0, (void *)bulk_in, (void *)bulk_out);
donatien 0:ae46a0638b2c 374
donatien 0:ae46a0638b2c 375 bulk_in->attach(this, &WANDongle::rxHandler);
donatien 0:ae46a0638b2c 376 bulk_out->attach(this, &WANDongle::txHandler);
donatien 0:ae46a0638b2c 377 host->lock();
donatien 0:ae46a0638b2c 378 host->registerDriver(dev, 0, this, &WANDongle::init);
donatien 0:ae46a0638b2c 379 host->unlock();
donatien 0:ae46a0638b2c 380 dev_connected = true;
donatien 0:ae46a0638b2c 381
donatien 0:ae46a0638b2c 382 readPacket(); //Start receiving data
donatien 0:ae46a0638b2c 383
donatien 0:ae46a0638b2c 384 return true;
donatien 0:ae46a0638b2c 385 }
donatien 0:ae46a0638b2c 386 return false;
donatien 0:ae46a0638b2c 387 }
donatien 0:ae46a0638b2c 388
donatien 0:ae46a0638b2c 389 void WANDongle::rxHandler()
donatien 0:ae46a0638b2c 390 {
donatien 0:ae46a0638b2c 391 if (((Endpoint *) bulk_in)->getState() == USB_TYPE_IDLE) //Success
donatien 0:ae46a0638b2c 392 {
donatien 0:ae46a0638b2c 393 buf_in_read_pos = 0;
donatien 0:ae46a0638b2c 394 buf_in_len = ((Endpoint *) bulk_in)->getLengthTransferred(); //Update length
donatien 0:ae46a0638b2c 395 //lock_rx.unlock();
donatien 0:ae46a0638b2c 396 rx_mtx.lock();
donatien 0:ae46a0638b2c 397 lock_rx = false; //Transmission complete
donatien 0:ae46a0638b2c 398 if(cb_rx_en)
donatien 0:ae46a0638b2c 399 {
donatien 0:ae46a0638b2c 400 rx_mtx.unlock();
donatien 0:ae46a0638b2c 401 listener->readable(); //Call handler from the IRQ context
donatien 0:ae46a0638b2c 402 //readPacket() should be called by the handler subsequently once the buffer has been emptied
donatien 0:ae46a0638b2c 403 }
donatien 0:ae46a0638b2c 404 else
donatien 0:ae46a0638b2c 405 {
donatien 0:ae46a0638b2c 406 cb_rx_pending = true; //Queue the callback
donatien 0:ae46a0638b2c 407 rx_mtx.unlock();
donatien 0:ae46a0638b2c 408 }
donatien 0:ae46a0638b2c 409
donatien 0:ae46a0638b2c 410 }
donatien 0:ae46a0638b2c 411 else //Error, try reading again
donatien 0:ae46a0638b2c 412 {
donatien 0:ae46a0638b2c 413 //lock_rx.unlock();
donatien 0:ae46a0638b2c 414 readPacket();
donatien 0:ae46a0638b2c 415 }
donatien 0:ae46a0638b2c 416 }
donatien 0:ae46a0638b2c 417
donatien 0:ae46a0638b2c 418 void WANDongle::txHandler()
donatien 0:ae46a0638b2c 419 {
donatien 0:ae46a0638b2c 420 if (((Endpoint *) bulk_out)->getState() == USB_TYPE_IDLE) //Success
donatien 0:ae46a0638b2c 421 {
donatien 0:ae46a0638b2c 422 tx_mtx.lock();
donatien 0:ae46a0638b2c 423 buf_out_len = 0; //Reset length
donatien 0:ae46a0638b2c 424 lock_tx = false; //Transmission complete
donatien 0:ae46a0638b2c 425 //lock_tx.unlock();
donatien 0:ae46a0638b2c 426 if(cb_tx_en)
donatien 0:ae46a0638b2c 427 {
donatien 0:ae46a0638b2c 428 tx_mtx.unlock();
donatien 0:ae46a0638b2c 429 listener->writeable(); //Call handler from the IRQ context
donatien 0:ae46a0638b2c 430 //writePacket() should be called by the handler subsequently once the buffer has been filled
donatien 0:ae46a0638b2c 431 }
donatien 0:ae46a0638b2c 432 else
donatien 0:ae46a0638b2c 433 {
donatien 0:ae46a0638b2c 434 cb_tx_pending = true; //Queue the callback
donatien 0:ae46a0638b2c 435 tx_mtx.unlock();
donatien 0:ae46a0638b2c 436 }
donatien 0:ae46a0638b2c 437 }
donatien 0:ae46a0638b2c 438 else //Error, try reading again
donatien 0:ae46a0638b2c 439 {
donatien 0:ae46a0638b2c 440 //lock_tx.unlock();
donatien 0:ae46a0638b2c 441 writePacket();
donatien 0:ae46a0638b2c 442 }
donatien 0:ae46a0638b2c 443 }