USB Host Driver with Socket Modem support. Works with revision 323 of mbed-src but broken with any later version.
Dependencies: FATFileSystem
Fork of F401RE-USBHost by
Diff: USBHost/USBDeviceConnected.cpp
- Revision:
- 9:7f9f64cf5ded
- Parent:
- 8:6463cd1964c0
- Child:
- 10:40c7f6788902
--- a/USBHost/USBDeviceConnected.cpp Fri Jan 31 13:45:07 2014 +0000 +++ b/USBHost/USBDeviceConnected.cpp Mon Feb 03 13:00:16 2014 +0000 @@ -15,8 +15,7 @@ */ #include "USBDeviceConnected.h" -//#include "dbg.h" -#define USB_DBG(...) while(0) +#include "dbg.h" USBDeviceConnected::USBDeviceConnected() { init(); @@ -35,54 +34,33 @@ device_subclass = 0; proto = 0; lowSpeed = false; - for (int i = 0; i < MAX_INTF; i++) { - memset((void *)&intf[i], 0, sizeof(INTERFACE)); - intf[i].in_use = false; - for (int j = 0; j < MAX_ENDPOINT_PER_INTERFACE; j++) { - intf[i].ep[j] = NULL; - //strcpy(intf[i].name, "Unknown"); - } - } + intf.clear(); //hub_parent = NULL; //hub = NULL; - nb_interf = 0; -} - -INTERFACE * USBDeviceConnected::getInterface(uint8_t index) { - if (index >= MAX_INTF) - return NULL; - - if (intf[index].in_use) - return &intf[index]; - - return NULL; } bool USBDeviceConnected::addInterface(uint8_t intf_nb, uint8_t intf_class, uint8_t intf_subclass, uint8_t intf_protocol) { - if ((intf_nb >= MAX_INTF) || (intf[intf_nb].in_use)) { + USB_DBG("intf_nb=%d", intf_nb); + INTERFACE* inter = intf.get(intf_nb); + if (inter) { return false; - } - intf[intf_nb].in_use = true; - intf[intf_nb].intf_class = intf_class; - intf[intf_nb].intf_subclass = intf_subclass; - intf[intf_nb].intf_protocol = intf_protocol; - intf[intf_nb].nb_endpoint = 0; + } + inter = new INTERFACE; + inter->in_use = true; + inter->intf_class = intf_class; + inter->intf_subclass = intf_subclass; + inter->intf_protocol = intf_protocol; + intf.put(intf_nb, inter); return true; } bool USBDeviceConnected::addEndpoint(uint8_t intf_nb, USBEndpoint * ept) { - if ((intf_nb >= MAX_INTF) || (intf[intf_nb].in_use == false) || (intf[intf_nb].nb_endpoint >= MAX_ENDPOINT_PER_INTERFACE)) { + INTERFACE* inter = intf.get(intf_nb); + if (inter == NULL) { return false; } - intf[intf_nb].nb_endpoint++; - - for (int i = 0; i < MAX_ENDPOINT_PER_INTERFACE; i++) { - if (intf[intf_nb].ep[i] == NULL) { - intf[intf_nb].ep[i] = ept; - return true; - } - } - return false; + inter->ep.push(ept); + return true; } void USBDeviceConnected::init(uint8_t hub_, uint8_t port_, bool lowSpeed_) { @@ -102,15 +80,15 @@ USBEndpoint * USBDeviceConnected::getEndpoint(uint8_t intf_nb, ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint8_t index) { - if (intf_nb >= MAX_INTF) { - return NULL; - } - for (int i = 0; i < MAX_ENDPOINT_PER_INTERFACE; i++) { - if ((intf[intf_nb].ep[i]->getType() == type) && (intf[intf_nb].ep[i]->getDir() == dir)) { + USB_DBG("intf_nb=%d", intf_nb); + INTERFACE* inter = intf.get(intf_nb); + USB_TEST_ASSERT(inter); + for (int i = 0; i < inter->ep.size(); i++) { + if ((inter->ep.at(i)->getType() == type) && (inter->ep.at(i)->getDir() == dir)) { if(index) { index--; } else { - return intf[intf_nb].ep[i]; + return inter->ep.at(i); } } } @@ -118,8 +96,7 @@ } USBEndpoint * USBDeviceConnected::getEndpoint(uint8_t intf_nb, uint8_t index) { - if ((intf_nb >= MAX_INTF) || (index >= MAX_ENDPOINT_PER_INTERFACE)) { - return NULL; - } - return intf[intf_nb].ep[index]; + INTERFACE* inter = intf.get(intf_nb); + USB_TEST_ASSERT(inter); + return inter->ep.at(index); }