USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
donatien
Date:
Thu May 24 16:39:35 2012 +0000
Revision:
0:ae46a0638b2c
Child:
1:49df46e3295c
Initial Commit

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 0:ae46a0638b2c 73 DBG("Vodafone K3370 dongle detected!!!");
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 0:ae46a0638b2c 81 DBG("MSD FOUND on device %p, intf %d, WILL NOW SWITCH 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 0:ae46a0638b2c 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 0:ae46a0638b2c 91 // now wait for the new device connected......... :(
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 0:ae46a0638b2c 107
donatien 0:ae46a0638b2c 108 //Vodafone K3770
donatien 0:ae46a0638b2c 109 if ((dev->getVid() == 0x12D1) && (dev->getPid() == 0x14C9)) {
donatien 0:ae46a0638b2c 110 DBG("SWITCH MODE OK!!!!!!!!!!\r\n");
donatien 0:ae46a0638b2c 111 found = true;
donatien 0:ae46a0638b2c 112 break;
donatien 0:ae46a0638b2c 113 }
donatien 0:ae46a0638b2c 114 }
donatien 0:ae46a0638b2c 115 }
donatien 0:ae46a0638b2c 116
donatien 0:ae46a0638b2c 117 host->unlock();
donatien 0:ae46a0638b2c 118
donatien 0:ae46a0638b2c 119 }
donatien 0:ae46a0638b2c 120 host->lock();
donatien 0:ae46a0638b2c 121
donatien 0:ae46a0638b2c 122 if (fetchEndpoints()) {
donatien 0:ae46a0638b2c 123 DBG("ep: %p, %p\r\n", bulk_in, bulk_out);
donatien 0:ae46a0638b2c 124 max_out_size = bulk_out->getSize();
donatien 0:ae46a0638b2c 125 if( max_out_size > WANDONGLE_MAX_OUTEP_SIZE )
donatien 0:ae46a0638b2c 126 {
donatien 0:ae46a0638b2c 127 max_out_size = WANDONGLE_MAX_OUTEP_SIZE;
donatien 0:ae46a0638b2c 128 }
donatien 0:ae46a0638b2c 129 host->unlock();
donatien 0:ae46a0638b2c 130 return true;
donatien 0:ae46a0638b2c 131 }
donatien 0:ae46a0638b2c 132 host->unlock();
donatien 0:ae46a0638b2c 133 }
donatien 0:ae46a0638b2c 134 }
donatien 0:ae46a0638b2c 135 }
donatien 0:ae46a0638b2c 136 } else if ((dev->getVid() == 0x12D1) && (dev->getPid() == 0x14C9)) {
donatien 0:ae46a0638b2c 137 if (fetchEndpoints()) {
donatien 0:ae46a0638b2c 138 DBG("ep: %p, %p\r\n", bulk_in, bulk_out);
donatien 0:ae46a0638b2c 139 max_out_size = bulk_out->getSize();
donatien 0:ae46a0638b2c 140 if( max_out_size > WANDONGLE_MAX_OUTEP_SIZE )
donatien 0:ae46a0638b2c 141 {
donatien 0:ae46a0638b2c 142 max_out_size = WANDONGLE_MAX_OUTEP_SIZE;
donatien 0:ae46a0638b2c 143 }
donatien 0:ae46a0638b2c 144 host->unlock();
donatien 0:ae46a0638b2c 145 return true;
donatien 0:ae46a0638b2c 146 }
donatien 0:ae46a0638b2c 147 }
donatien 0:ae46a0638b2c 148 }
donatien 0:ae46a0638b2c 149 }
donatien 0:ae46a0638b2c 150 host->unlock();
donatien 0:ae46a0638b2c 151 bulk_in = NULL;
donatien 0:ae46a0638b2c 152 bulk_out = NULL;
donatien 0:ae46a0638b2c 153 dev_connected = false;
donatien 0:ae46a0638b2c 154 return false;
donatien 0:ae46a0638b2c 155 }
donatien 0:ae46a0638b2c 156
donatien 0:ae46a0638b2c 157 int WANDongle::readPacket()
donatien 0:ae46a0638b2c 158 {
donatien 0:ae46a0638b2c 159 rx_mtx.lock();
donatien 0:ae46a0638b2c 160 if(lock_rx)
donatien 0:ae46a0638b2c 161 {
donatien 0:ae46a0638b2c 162 ERR("Fail");
donatien 0:ae46a0638b2c 163 rx_mtx.unlock();
donatien 0:ae46a0638b2c 164 return -1;
donatien 0:ae46a0638b2c 165 }
donatien 0:ae46a0638b2c 166
donatien 0:ae46a0638b2c 167 lock_rx = true; //Receiving
donatien 0:ae46a0638b2c 168 rx_mtx.unlock();
donatien 0:ae46a0638b2c 169 // DBG("readPacket");
donatien 0:ae46a0638b2c 170 //lock_rx.lock();
donatien 0:ae46a0638b2c 171 host->lock();
donatien 0:ae46a0638b2c 172 USB_TYPE res = host->bulkRead(dev, (Endpoint *)bulk_in, buf_in, ((Endpoint *)bulk_in)->getSize(), false); //Queue transfer
donatien 0:ae46a0638b2c 173 if(res != USB_TYPE_PROCESSING)
donatien 0:ae46a0638b2c 174 {
donatien 0:ae46a0638b2c 175 host->unlock();
donatien 0:ae46a0638b2c 176 //lock_rx.unlock();
donatien 0:ae46a0638b2c 177 ERR("host->bulkRead() returned %d", res);
donatien 0:ae46a0638b2c 178 Thread::wait(100);
donatien 0:ae46a0638b2c 179 return -1;
donatien 0:ae46a0638b2c 180 }
donatien 0:ae46a0638b2c 181 host->unlock();
donatien 0:ae46a0638b2c 182 return 0;
donatien 0:ae46a0638b2c 183 }
donatien 0:ae46a0638b2c 184
donatien 0:ae46a0638b2c 185 int WANDongle::writePacket()
donatien 0:ae46a0638b2c 186 {
donatien 0:ae46a0638b2c 187 tx_mtx.lock();
donatien 0:ae46a0638b2c 188 if(lock_tx)
donatien 0:ae46a0638b2c 189 {
donatien 0:ae46a0638b2c 190 ERR("Fail");
donatien 0:ae46a0638b2c 191 tx_mtx.unlock();
donatien 0:ae46a0638b2c 192 return -1;
donatien 0:ae46a0638b2c 193 }
donatien 0:ae46a0638b2c 194
donatien 0:ae46a0638b2c 195 lock_tx = true; //Transmitting
donatien 0:ae46a0638b2c 196 tx_mtx.unlock();
donatien 0:ae46a0638b2c 197 // DBG("writePacket");
donatien 0:ae46a0638b2c 198
donatien 0:ae46a0638b2c 199 //lock_tx.lock();
donatien 0:ae46a0638b2c 200 host->lock();
donatien 0:ae46a0638b2c 201 USB_TYPE res = host->bulkWrite(dev, (Endpoint *)bulk_out, buf_out, buf_out_len, false); //Queue transfer
donatien 0:ae46a0638b2c 202 if(res != USB_TYPE_PROCESSING)
donatien 0:ae46a0638b2c 203 {
donatien 0:ae46a0638b2c 204 host->unlock();
donatien 0:ae46a0638b2c 205 //lock_tx.unlock();
donatien 0:ae46a0638b2c 206 ERR("host->bulkWrite() returned %d", res);
donatien 0:ae46a0638b2c 207 Thread::wait(100);
donatien 0:ae46a0638b2c 208 return -1;
donatien 0:ae46a0638b2c 209 }
donatien 0:ae46a0638b2c 210 host->unlock();
donatien 0:ae46a0638b2c 211 return 0;
donatien 0:ae46a0638b2c 212 }
donatien 0:ae46a0638b2c 213
donatien 0:ae46a0638b2c 214 int WANDongle::putc(int c)
donatien 0:ae46a0638b2c 215 {
donatien 0:ae46a0638b2c 216 tx_mtx.lock();
donatien 0:ae46a0638b2c 217 if(!lock_tx)
donatien 0:ae46a0638b2c 218 {
donatien 0:ae46a0638b2c 219 if(buf_out_len < max_out_size)
donatien 0:ae46a0638b2c 220 {
donatien 0:ae46a0638b2c 221 buf_out[buf_out_len] = (uint8_t)c;
donatien 0:ae46a0638b2c 222 buf_out_len++;
donatien 0:ae46a0638b2c 223 }
donatien 0:ae46a0638b2c 224 }
donatien 0:ae46a0638b2c 225 else
donatien 0:ae46a0638b2c 226 {
donatien 0:ae46a0638b2c 227 ERR("CAN'T WRITE!");
donatien 0:ae46a0638b2c 228 }
donatien 0:ae46a0638b2c 229 tx_mtx.unlock();
donatien 0:ae46a0638b2c 230 return c;
donatien 0:ae46a0638b2c 231 }
donatien 0:ae46a0638b2c 232
donatien 0:ae46a0638b2c 233 int WANDongle::getc()
donatien 0:ae46a0638b2c 234 {
donatien 0:ae46a0638b2c 235 rx_mtx.lock();
donatien 0:ae46a0638b2c 236 int c = 0;
donatien 0:ae46a0638b2c 237 if(!lock_rx)
donatien 0:ae46a0638b2c 238 {
donatien 0:ae46a0638b2c 239 if(buf_in_read_pos < buf_in_len)
donatien 0:ae46a0638b2c 240 {
donatien 0:ae46a0638b2c 241 c = (int)buf_in[buf_in_read_pos];
donatien 0:ae46a0638b2c 242 buf_in_read_pos++;
donatien 0:ae46a0638b2c 243 }
donatien 0:ae46a0638b2c 244 }
donatien 0:ae46a0638b2c 245 else
donatien 0:ae46a0638b2c 246 {
donatien 0:ae46a0638b2c 247 ERR("CAN'T READ!");
donatien 0:ae46a0638b2c 248 }
donatien 0:ae46a0638b2c 249 rx_mtx.unlock();
donatien 0:ae46a0638b2c 250 return c;
donatien 0:ae46a0638b2c 251 }
donatien 0:ae46a0638b2c 252
donatien 0:ae46a0638b2c 253 int WANDongle::readable()
donatien 0:ae46a0638b2c 254 {
donatien 0:ae46a0638b2c 255 rx_mtx.lock();
donatien 0:ae46a0638b2c 256 if (lock_rx)
donatien 0:ae46a0638b2c 257 {
donatien 0:ae46a0638b2c 258 rx_mtx.unlock();
donatien 0:ae46a0638b2c 259 return 0;
donatien 0:ae46a0638b2c 260 }
donatien 0:ae46a0638b2c 261
donatien 0:ae46a0638b2c 262 /* if( !lock_rx.trylock() )
donatien 0:ae46a0638b2c 263 {
donatien 0:ae46a0638b2c 264 return 0;
donatien 0:ae46a0638b2c 265 }*/
donatien 0:ae46a0638b2c 266 int res = buf_in_len - buf_in_read_pos;
donatien 0:ae46a0638b2c 267 //lock_rx.unlock();
donatien 0:ae46a0638b2c 268 rx_mtx.unlock();
donatien 0:ae46a0638b2c 269 return res;
donatien 0:ae46a0638b2c 270 }
donatien 0:ae46a0638b2c 271
donatien 0:ae46a0638b2c 272 int WANDongle::writeable()
donatien 0:ae46a0638b2c 273 {
donatien 0:ae46a0638b2c 274 tx_mtx.lock();
donatien 0:ae46a0638b2c 275 if (lock_tx)
donatien 0:ae46a0638b2c 276 {
donatien 0:ae46a0638b2c 277 tx_mtx.unlock();
donatien 0:ae46a0638b2c 278 return 0;
donatien 0:ae46a0638b2c 279 }
donatien 0:ae46a0638b2c 280
donatien 0:ae46a0638b2c 281 /*if( !lock_tx.trylock() )
donatien 0:ae46a0638b2c 282 {
donatien 0:ae46a0638b2c 283 return 0;
donatien 0:ae46a0638b2c 284 }*/
donatien 0:ae46a0638b2c 285 int res = max_out_size - buf_out_len;
donatien 0:ae46a0638b2c 286 tx_mtx.unlock();
donatien 0:ae46a0638b2c 287 //lock_tx.unlock();
donatien 0:ae46a0638b2c 288 return res;
donatien 0:ae46a0638b2c 289 }
donatien 0:ae46a0638b2c 290
donatien 0:ae46a0638b2c 291 void WANDongle::attach(IUSBHostSerialListener* pListener)
donatien 0:ae46a0638b2c 292 {
donatien 0:ae46a0638b2c 293 if(pListener == NULL)
donatien 0:ae46a0638b2c 294 {
donatien 0:ae46a0638b2c 295 setupIrq(false, RxIrq);
donatien 0:ae46a0638b2c 296 setupIrq(false, TxIrq);
donatien 0:ae46a0638b2c 297 }
donatien 0:ae46a0638b2c 298 listener = pListener;
donatien 0:ae46a0638b2c 299 if(pListener != NULL)
donatien 0:ae46a0638b2c 300 {
donatien 0:ae46a0638b2c 301 setupIrq(true, RxIrq);
donatien 0:ae46a0638b2c 302 setupIrq(true, TxIrq);
donatien 0:ae46a0638b2c 303 }
donatien 0:ae46a0638b2c 304 }
donatien 0:ae46a0638b2c 305
donatien 0:ae46a0638b2c 306 void WANDongle::setupIrq(bool en, IrqType irq /*= RxIrq*/)
donatien 0:ae46a0638b2c 307 {
donatien 0:ae46a0638b2c 308 switch(irq)
donatien 0:ae46a0638b2c 309 {
donatien 0:ae46a0638b2c 310 case RxIrq:
donatien 0:ae46a0638b2c 311 rx_mtx.lock();
donatien 0:ae46a0638b2c 312 cb_rx_en = en;
donatien 0:ae46a0638b2c 313 if(en && cb_rx_pending)
donatien 0:ae46a0638b2c 314 {
donatien 0:ae46a0638b2c 315 cb_rx_pending = false;
donatien 0:ae46a0638b2c 316 rx_mtx.unlock();
donatien 0:ae46a0638b2c 317 listener->readable(); //Process the interrupt that was raised
donatien 0:ae46a0638b2c 318 }
donatien 0:ae46a0638b2c 319 else
donatien 0:ae46a0638b2c 320 {
donatien 0:ae46a0638b2c 321 rx_mtx.unlock();
donatien 0:ae46a0638b2c 322 }
donatien 0:ae46a0638b2c 323 break;
donatien 0:ae46a0638b2c 324 case TxIrq:
donatien 0:ae46a0638b2c 325 tx_mtx.lock();
donatien 0:ae46a0638b2c 326 cb_tx_en = en;
donatien 0:ae46a0638b2c 327 if(en && cb_tx_pending)
donatien 0:ae46a0638b2c 328 {
donatien 0:ae46a0638b2c 329 cb_tx_pending = false;
donatien 0:ae46a0638b2c 330 tx_mtx.unlock();
donatien 0:ae46a0638b2c 331 listener->writeable(); //Process the interrupt that was raised
donatien 0:ae46a0638b2c 332 }
donatien 0:ae46a0638b2c 333 else
donatien 0:ae46a0638b2c 334 {
donatien 0:ae46a0638b2c 335 tx_mtx.unlock();
donatien 0:ae46a0638b2c 336 }
donatien 0:ae46a0638b2c 337 break;
donatien 0:ae46a0638b2c 338 }
donatien 0:ae46a0638b2c 339 }
donatien 0:ae46a0638b2c 340
donatien 0:ae46a0638b2c 341 //Private methods
donatien 0:ae46a0638b2c 342
donatien 0:ae46a0638b2c 343 void WANDongle::init()
donatien 0:ae46a0638b2c 344 {
donatien 0:ae46a0638b2c 345 dev_connected = false;
donatien 0:ae46a0638b2c 346
donatien 0:ae46a0638b2c 347 bulk_in = NULL;
donatien 0:ae46a0638b2c 348 bulk_out = NULL;
donatien 0:ae46a0638b2c 349
donatien 0:ae46a0638b2c 350 buf_out_len = 0;
donatien 0:ae46a0638b2c 351 lock_tx = false;
donatien 0:ae46a0638b2c 352 cb_tx_en = false;
donatien 0:ae46a0638b2c 353 cb_tx_pending = false;
donatien 0:ae46a0638b2c 354
donatien 0:ae46a0638b2c 355 buf_in_len = 0;
donatien 0:ae46a0638b2c 356 buf_in_read_pos = 0;
donatien 0:ae46a0638b2c 357 lock_rx = false;
donatien 0:ae46a0638b2c 358 cb_rx_en = false;
donatien 0:ae46a0638b2c 359 cb_rx_pending = false;
donatien 0:ae46a0638b2c 360
donatien 0:ae46a0638b2c 361 }
donatien 0:ae46a0638b2c 362
donatien 0:ae46a0638b2c 363 bool WANDongle::fetchEndpoints()
donatien 0:ae46a0638b2c 364 {
donatien 0:ae46a0638b2c 365 bulk_in = dev->getEndpoint(0, BULK_ENDPOINT, IN);
donatien 0:ae46a0638b2c 366 bulk_out = dev->getEndpoint(0, BULK_ENDPOINT, OUT);
donatien 0:ae46a0638b2c 367 if ((bulk_in != NULL) && (bulk_out != NULL))
donatien 0:ae46a0638b2c 368 {
donatien 0:ae46a0638b2c 369
donatien 0:ae46a0638b2c 370 DBG("SERIAL FOUND on device %p, intf %d, bulk_in: %p, bulk_out: %p\r\n",
donatien 0:ae46a0638b2c 371 (void *)dev, 0, (void *)bulk_in, (void *)bulk_out);
donatien 0:ae46a0638b2c 372
donatien 0:ae46a0638b2c 373 bulk_in->attach(this, &WANDongle::rxHandler);
donatien 0:ae46a0638b2c 374 bulk_out->attach(this, &WANDongle::txHandler);
donatien 0:ae46a0638b2c 375 host->lock();
donatien 0:ae46a0638b2c 376 host->registerDriver(dev, 0, this, &WANDongle::init);
donatien 0:ae46a0638b2c 377 host->unlock();
donatien 0:ae46a0638b2c 378 dev_connected = true;
donatien 0:ae46a0638b2c 379
donatien 0:ae46a0638b2c 380 readPacket(); //Start receiving data
donatien 0:ae46a0638b2c 381
donatien 0:ae46a0638b2c 382 return true;
donatien 0:ae46a0638b2c 383 }
donatien 0:ae46a0638b2c 384 return false;
donatien 0:ae46a0638b2c 385 }
donatien 0:ae46a0638b2c 386
donatien 0:ae46a0638b2c 387 void WANDongle::rxHandler()
donatien 0:ae46a0638b2c 388 {
donatien 0:ae46a0638b2c 389 if (((Endpoint *) bulk_in)->getState() == USB_TYPE_IDLE) //Success
donatien 0:ae46a0638b2c 390 {
donatien 0:ae46a0638b2c 391 buf_in_read_pos = 0;
donatien 0:ae46a0638b2c 392 buf_in_len = ((Endpoint *) bulk_in)->getLengthTransferred(); //Update length
donatien 0:ae46a0638b2c 393 //lock_rx.unlock();
donatien 0:ae46a0638b2c 394 rx_mtx.lock();
donatien 0:ae46a0638b2c 395 lock_rx = false; //Transmission complete
donatien 0:ae46a0638b2c 396 if(cb_rx_en)
donatien 0:ae46a0638b2c 397 {
donatien 0:ae46a0638b2c 398 rx_mtx.unlock();
donatien 0:ae46a0638b2c 399 listener->readable(); //Call handler from the IRQ context
donatien 0:ae46a0638b2c 400 //readPacket() should be called by the handler subsequently once the buffer has been emptied
donatien 0:ae46a0638b2c 401 }
donatien 0:ae46a0638b2c 402 else
donatien 0:ae46a0638b2c 403 {
donatien 0:ae46a0638b2c 404 cb_rx_pending = true; //Queue the callback
donatien 0:ae46a0638b2c 405 rx_mtx.unlock();
donatien 0:ae46a0638b2c 406 }
donatien 0:ae46a0638b2c 407
donatien 0:ae46a0638b2c 408 }
donatien 0:ae46a0638b2c 409 else //Error, try reading again
donatien 0:ae46a0638b2c 410 {
donatien 0:ae46a0638b2c 411 //lock_rx.unlock();
donatien 0:ae46a0638b2c 412 readPacket();
donatien 0:ae46a0638b2c 413 }
donatien 0:ae46a0638b2c 414 }
donatien 0:ae46a0638b2c 415
donatien 0:ae46a0638b2c 416 void WANDongle::txHandler()
donatien 0:ae46a0638b2c 417 {
donatien 0:ae46a0638b2c 418 if (((Endpoint *) bulk_out)->getState() == USB_TYPE_IDLE) //Success
donatien 0:ae46a0638b2c 419 {
donatien 0:ae46a0638b2c 420 tx_mtx.lock();
donatien 0:ae46a0638b2c 421 buf_out_len = 0; //Reset length
donatien 0:ae46a0638b2c 422 lock_tx = false; //Transmission complete
donatien 0:ae46a0638b2c 423 //lock_tx.unlock();
donatien 0:ae46a0638b2c 424 if(cb_tx_en)
donatien 0:ae46a0638b2c 425 {
donatien 0:ae46a0638b2c 426 tx_mtx.unlock();
donatien 0:ae46a0638b2c 427 listener->writeable(); //Call handler from the IRQ context
donatien 0:ae46a0638b2c 428 //writePacket() should be called by the handler subsequently once the buffer has been filled
donatien 0:ae46a0638b2c 429 }
donatien 0:ae46a0638b2c 430 else
donatien 0:ae46a0638b2c 431 {
donatien 0:ae46a0638b2c 432 cb_tx_pending = true; //Queue the callback
donatien 0:ae46a0638b2c 433 tx_mtx.unlock();
donatien 0:ae46a0638b2c 434 }
donatien 0:ae46a0638b2c 435 }
donatien 0:ae46a0638b2c 436 else //Error, try reading again
donatien 0:ae46a0638b2c 437 {
donatien 0:ae46a0638b2c 438 //lock_tx.unlock();
donatien 0:ae46a0638b2c 439 writePacket();
donatien 0:ae46a0638b2c 440 }
donatien 0:ae46a0638b2c 441 }