USB Host WAN Dongle library

Fork of USBHostWANDongle_bleedingedge by Donatien Garnier

Committer:
ashleymills
Date:
Fri Sep 20 10:40:15 2013 +0000
Revision:
27:980fe31c14f7
Parent:
24:f4b676f61906
Added support for Ublox LISA U200 module

Who changed what in which revision?

UserRevisionLine numberNew contents of line
donatien 10:08bce4cd973a 1 /* Copyright (c) 2010-2012 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 #ifndef USBHOST_H
donatien 0:ae46a0638b2c 20 #define USBHOST_H
donatien 0:ae46a0638b2c 21
donatien 0:ae46a0638b2c 22 #include "USBHALHost.h"
donatien 0:ae46a0638b2c 23 #include "USBDeviceConnected.h"
donatien 9:c9e9817c398c 24 #include "USBEndpoint.h"
donatien 6:075e36a3463e 25 #include "IUSBEnumerator.h"
donatien 0:ae46a0638b2c 26
donatien 0:ae46a0638b2c 27 #define MAX_DEVICE_NB 1
donatien 0:ae46a0638b2c 28
donatien 0:ae46a0638b2c 29 // singleton class
donatien 0:ae46a0638b2c 30 class USBHost : public USBHALHost {
donatien 0:ae46a0638b2c 31 public:
donatien 0:ae46a0638b2c 32 /*
donatien 0:ae46a0638b2c 33 * Static method to create or retrieve the single USBHost instance
donatien 0:ae46a0638b2c 34 */
donatien 0:ae46a0638b2c 35 static USBHost * getHostInst();
donatien 0:ae46a0638b2c 36
donatien 0:ae46a0638b2c 37 USB_TYPE getDeviceDescriptor(USBDeviceConnected * dev, uint8_t * buf) ;
donatien 8:0d1ec493842c 38 USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t * len_conf_descr = NULL) ;
donatien 0:ae46a0638b2c 39 USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf) ;
donatien 0:ae46a0638b2c 40 USB_TYPE getStringDescriptor(USBDeviceConnected * dev, uint8_t index, uint8_t * buf) ;
donatien 0:ae46a0638b2c 41 USB_TYPE getReportDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint8_t len) ;
donatien 0:ae46a0638b2c 42
donatien 0:ae46a0638b2c 43 /*
donatien 0:ae46a0638b2c 44 * Control read: setup stage, data stage and status stage
donatien 0:ae46a0638b2c 45 *
donatien 0:ae46a0638b2c 46 * @param dev the control read will be done for this device
donatien 0:ae46a0638b2c 47 * @param requestType request type
donatien 0:ae46a0638b2c 48 * @param request request
donatien 0:ae46a0638b2c 49 * @param value value
donatien 0:ae46a0638b2c 50 * @param index index
donatien 0:ae46a0638b2c 51 * @param buf pointer on a buffer where will be store the data received
donatien 0:ae46a0638b2c 52 * @param len length of the transfer
donatien 0:ae46a0638b2c 53 *
donatien 0:ae46a0638b2c 54 * @returns status of the control read
donatien 0:ae46a0638b2c 55 */
donatien 0:ae46a0638b2c 56 USB_TYPE controlRead(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) ;
donatien 0:ae46a0638b2c 57
donatien 0:ae46a0638b2c 58 /*
donatien 0:ae46a0638b2c 59 * Control write: setup stage, data stage and status stage
donatien 0:ae46a0638b2c 60 *
donatien 0:ae46a0638b2c 61 * @param dev the control write will be done for this device
donatien 0:ae46a0638b2c 62 * @param requestType request type
donatien 0:ae46a0638b2c 63 * @param request request
donatien 0:ae46a0638b2c 64 * @param value value
donatien 0:ae46a0638b2c 65 * @param index index
donatien 0:ae46a0638b2c 66 * @param buf pointer on a buffer which will be written
donatien 0:ae46a0638b2c 67 * @param len length of the transfer
donatien 0:ae46a0638b2c 68 *
donatien 0:ae46a0638b2c 69 * @returns status of the control write
donatien 0:ae46a0638b2c 70 */
donatien 0:ae46a0638b2c 71 USB_TYPE controlWrite(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len) ;
donatien 0:ae46a0638b2c 72
donatien 0:ae46a0638b2c 73
donatien 0:ae46a0638b2c 74 /*
donatien 0:ae46a0638b2c 75 * Bulk read
donatien 0:ae46a0638b2c 76 *
donatien 0:ae46a0638b2c 77 * @param dev the bulk transfer will be done for this device
donatien 9:c9e9817c398c 78 * @param ep USBEndpoint which will be used to read a packet
donatien 0:ae46a0638b2c 79 * @param buf pointer on a buffer where will be store the data received
donatien 0:ae46a0638b2c 80 * @param len length of the transfer
donatien 0:ae46a0638b2c 81 * @param blocking if true, the read is blocking (wait for completion)
donatien 0:ae46a0638b2c 82 *
donatien 0:ae46a0638b2c 83 * @returns status of the bulk read
donatien 0:ae46a0638b2c 84 */
donatien 9:c9e9817c398c 85 USB_TYPE bulkRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) ;
donatien 0:ae46a0638b2c 86
donatien 0:ae46a0638b2c 87 /*
donatien 0:ae46a0638b2c 88 * Bulk write
donatien 0:ae46a0638b2c 89 *
donatien 0:ae46a0638b2c 90 * @param dev the bulk transfer will be done for this device
donatien 9:c9e9817c398c 91 * @param ep USBEndpoint which will be used to write a packet
donatien 0:ae46a0638b2c 92 * @param buf pointer on a buffer which will be written
donatien 0:ae46a0638b2c 93 * @param len length of the transfer
donatien 0:ae46a0638b2c 94 * @param blocking if true, the write is blocking (wait for completion)
donatien 0:ae46a0638b2c 95 *
donatien 0:ae46a0638b2c 96 * @returns status of the bulk write
donatien 0:ae46a0638b2c 97 */
donatien 9:c9e9817c398c 98 USB_TYPE bulkWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) ;
donatien 0:ae46a0638b2c 99
donatien 0:ae46a0638b2c 100 /*
donatien 0:ae46a0638b2c 101 * Interrupt read
donatien 0:ae46a0638b2c 102 *
donatien 0:ae46a0638b2c 103 * @param dev the bulk transfer will be done for this device
donatien 9:c9e9817c398c 104 * @param ep USBEndpoint which will be used to write a packet
donatien 0:ae46a0638b2c 105 * @param buf pointer on a buffer which will be written
donatien 0:ae46a0638b2c 106 * @param len length of the transfer
donatien 0:ae46a0638b2c 107 * @param blocking if true, the read is blocking (wait for completion)
donatien 0:ae46a0638b2c 108 *
donatien 0:ae46a0638b2c 109 * @returns status of the interrupt read
donatien 0:ae46a0638b2c 110 */
donatien 9:c9e9817c398c 111 USB_TYPE interruptRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) ;
donatien 0:ae46a0638b2c 112
donatien 0:ae46a0638b2c 113 /*
donatien 0:ae46a0638b2c 114 * Interrupt write
donatien 0:ae46a0638b2c 115 *
donatien 0:ae46a0638b2c 116 * @param dev the bulk transfer will be done for this device
donatien 9:c9e9817c398c 117 * @param ep USBEndpoint which will be used to write a packet
donatien 0:ae46a0638b2c 118 * @param buf pointer on a buffer which will be written
donatien 0:ae46a0638b2c 119 * @param len length of the transfer
donatien 0:ae46a0638b2c 120 * @param blocking if true, the write is blocking (wait for completion)
donatien 0:ae46a0638b2c 121 *
donatien 0:ae46a0638b2c 122 * @returns status of the interrupt write
donatien 0:ae46a0638b2c 123 */
donatien 9:c9e9817c398c 124 USB_TYPE interruptWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true) ;
donatien 0:ae46a0638b2c 125
donatien 0:ae46a0638b2c 126 /*
donatien 0:ae46a0638b2c 127 * Enumerate a device. This method is responsible for:
donatien 0:ae46a0638b2c 128 * - set the address of the device
donatien 0:ae46a0638b2c 129 * - fill a USBDeviceConnected object:
donatien 0:ae46a0638b2c 130 * - add interfaces, endpoints, ...
donatien 0:ae46a0638b2c 131 * - set a configuration
donatien 0:ae46a0638b2c 132 *
donatien 0:ae46a0638b2c 133 * @param dev device which will be enumerated
donatien 0:ae46a0638b2c 134 *
donatien 0:ae46a0638b2c 135 * @returns status of the enumeration
donatien 0:ae46a0638b2c 136 */
donatien 6:075e36a3463e 137 USB_TYPE enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerator) ;
donatien 0:ae46a0638b2c 138
donatien 0:ae46a0638b2c 139 /*
donatien 0:ae46a0638b2c 140 * Get a device
donatien 0:ae46a0638b2c 141 *
donatien 0:ae46a0638b2c 142 * @param index index of the device which will be returned
donatien 0:ae46a0638b2c 143 *
donatien 0:ae46a0638b2c 144 * @returns pointer on the "index" device
donatien 0:ae46a0638b2c 145 */
donatien 0:ae46a0638b2c 146 USBDeviceConnected * getDevice(uint8_t index) ;
donatien 0:ae46a0638b2c 147
donatien 0:ae46a0638b2c 148 /*
donatien 0:ae46a0638b2c 149 * reset port and hub of a specific device
donatien 0:ae46a0638b2c 150 *
donatien 0:ae46a0638b2c 151 * @param pointer on the device hich will be reseted
donatien 0:ae46a0638b2c 152 */
donatien 11:a0841fba0599 153 USB_TYPE resetDevice(USBDeviceConnected * dev) ;
donatien 0:ae46a0638b2c 154
donatien 0:ae46a0638b2c 155 /*
donatien 0:ae46a0638b2c 156 * If there is a HID device connected, the host stores the length of the report descriptor.
donatien 0:ae46a0638b2c 157 * This avoid to the driver to re-ask the configuration descriptor to request the report descriptor
donatien 0:ae46a0638b2c 158 *
donatien 0:ae46a0638b2c 159 * @returns length of the report descriptor
donatien 0:ae46a0638b2c 160 */
donatien 0:ae46a0638b2c 161 uint16_t getLengthReportDescr() {
donatien 0:ae46a0638b2c 162 return lenReportDescr;
donatien 0:ae46a0638b2c 163 };
donatien 0:ae46a0638b2c 164
donatien 0:ae46a0638b2c 165 /**
donatien 0:ae46a0638b2c 166 * register a driver into the host associated with a callback function called when the device is disconnected
donatien 0:ae46a0638b2c 167 *
donatien 0:ae46a0638b2c 168 * @param dev device
donatien 0:ae46a0638b2c 169 * @param tptr pointer to the object to call the member function on
donatien 0:ae46a0638b2c 170 * @param mptr pointer to the member function to be called
donatien 0:ae46a0638b2c 171 */
donatien 0:ae46a0638b2c 172 template<typename T>
donatien 0:ae46a0638b2c 173 void registerDriver(USBDeviceConnected * dev, uint8_t intf, T* tptr, void (T::*mptr)(void)) {
donatien 0:ae46a0638b2c 174 int index = findDevice(dev);
donatien 0:ae46a0638b2c 175 if ((index != -1) && (mptr != NULL) && (tptr != NULL)) {
donatien 0:ae46a0638b2c 176 dev->onDisconnect(intf, tptr, mptr);
donatien 0:ae46a0638b2c 177 }
donatien 0:ae46a0638b2c 178 }
donatien 0:ae46a0638b2c 179
donatien 0:ae46a0638b2c 180 /**
donatien 0:ae46a0638b2c 181 * register a driver into the host associated with a callback function called when the device is disconnected
donatien 0:ae46a0638b2c 182 *
donatien 0:ae46a0638b2c 183 * @param dev device
donatien 0:ae46a0638b2c 184 * @param fn callback called when the specified device has been disconnected
donatien 0:ae46a0638b2c 185 */
donatien 0:ae46a0638b2c 186 void registerDriver(USBDeviceConnected * dev, uint8_t intf, void (*fn)(void)) {
donatien 0:ae46a0638b2c 187 int index = findDevice(dev);
donatien 0:ae46a0638b2c 188 if ((index != -1) && (fn != NULL)) {
donatien 0:ae46a0638b2c 189 dev->onDisconnect(intf, fn);
donatien 0:ae46a0638b2c 190 }
donatien 0:ae46a0638b2c 191 }
donatien 0:ae46a0638b2c 192
donatien 0:ae46a0638b2c 193
donatien 0:ae46a0638b2c 194 protected:
donatien 0:ae46a0638b2c 195
donatien 0:ae46a0638b2c 196 /*
donatien 0:ae46a0638b2c 197 * Virtual method called when a device has been connected
donatien 0:ae46a0638b2c 198 *
donatien 0:ae46a0638b2c 199 * @param hub hub number of the device
donatien 0:ae46a0638b2c 200 * @param port port number of the device
donatien 0:ae46a0638b2c 201 * @param lowSpeed 1 if low speed, 0 otherwise
donatien 0:ae46a0638b2c 202 */
donatien 0:ae46a0638b2c 203 virtual void deviceConnected(int hub, int port, bool lowSpeed) ;
donatien 0:ae46a0638b2c 204
donatien 0:ae46a0638b2c 205 /*
donatien 0:ae46a0638b2c 206 * Virtuel method called when a device has been disconnected
donatien 0:ae46a0638b2c 207 *
donatien 0:ae46a0638b2c 208 * @param hub hub number of the device
donatien 0:ae46a0638b2c 209 * @param port port number of the device
donatien 0:ae46a0638b2c 210 * @param addr list of the TDs which have been completed to dequeue freed TDs
donatien 0:ae46a0638b2c 211 */
donatien 0:ae46a0638b2c 212 virtual void deviceDisconnected(int hub, int port, volatile uint32_t addr) ;
donatien 0:ae46a0638b2c 213
donatien 0:ae46a0638b2c 214 /*
donatien 0:ae46a0638b2c 215 * Virtual method called when a transfer has been completed
donatien 0:ae46a0638b2c 216 *
donatien 0:ae46a0638b2c 217 * @param addr list of the TDs which have been completed
donatien 0:ae46a0638b2c 218 */
donatien 0:ae46a0638b2c 219 virtual void transferCompleted(volatile uint32_t addr) ;
donatien 0:ae46a0638b2c 220
donatien 0:ae46a0638b2c 221
donatien 0:ae46a0638b2c 222 private:
donatien 0:ae46a0638b2c 223 // singleton class -> constructor is private
donatien 0:ae46a0638b2c 224 USBHost();
donatien 0:ae46a0638b2c 225
donatien 0:ae46a0638b2c 226 static USBHost * instHost;
donatien 0:ae46a0638b2c 227
donatien 0:ae46a0638b2c 228 uint8_t nb_devices;
donatien 0:ae46a0638b2c 229 uint16_t lenReportDescr;
donatien 0:ae46a0638b2c 230
donatien 0:ae46a0638b2c 231 void fillControlBuf(uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, int len) ;
donatien 6:075e36a3463e 232 void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ;
donatien 0:ae46a0638b2c 233 void freeDevice(USBDeviceConnected * dev) ;
donatien 0:ae46a0638b2c 234 int findDevice(USBDeviceConnected * dev) ;
donatien 0:ae46a0638b2c 235
donatien 0:ae46a0638b2c 236
donatien 0:ae46a0638b2c 237 // endpoints
donatien 9:c9e9817c398c 238 void unqueueEndpoint(USBEndpoint * ep) ;
donatien 9:c9e9817c398c 239 USBEndpoint endpoints[MAX_ENDPOINT];
donatien 9:c9e9817c398c 240 USBEndpoint* volatile control;
donatien 0:ae46a0638b2c 241
donatien 9:c9e9817c398c 242 USBEndpoint* volatile headControlEndpoint;
donatien 9:c9e9817c398c 243 USBEndpoint* volatile headBulkEndpoint;
donatien 9:c9e9817c398c 244 USBEndpoint* volatile headInterruptEndpoint;
donatien 0:ae46a0638b2c 245
donatien 9:c9e9817c398c 246 USBEndpoint* volatile tailControlEndpoint;
donatien 9:c9e9817c398c 247 USBEndpoint* volatile tailBulkEndpoint;
donatien 9:c9e9817c398c 248 USBEndpoint* volatile tailInterruptEndpoint;
donatien 0:ae46a0638b2c 249
donatien 0:ae46a0638b2c 250 bool controlEndpointAllocated;
donatien 0:ae46a0638b2c 251
donatien 0:ae46a0638b2c 252
donatien 0:ae46a0638b2c 253 // devices connected
donatien 0:ae46a0638b2c 254 USBDeviceConnected devices[MAX_DEVICE_NB];
donatien 0:ae46a0638b2c 255 volatile bool deviceInUse[MAX_DEVICE_NB];
donatien 0:ae46a0638b2c 256 volatile bool deviceReset[MAX_DEVICE_NB];
donatien 0:ae46a0638b2c 257
donatien 0:ae46a0638b2c 258 /*
donatien 0:ae46a0638b2c 259 * Add a transfer on the TD linked list associated to an ED
donatien 0:ae46a0638b2c 260 *
donatien 0:ae46a0638b2c 261 * @param ed the transfer is associated to this ed
donatien 0:ae46a0638b2c 262 * @param buf pointer on a buffer where will be read/write data to send or receive
donatien 0:ae46a0638b2c 263 * @param len transfer length
donatien 0:ae46a0638b2c 264 *
donatien 0:ae46a0638b2c 265 * @return status of the transfer
donatien 0:ae46a0638b2c 266 */
donatien 9:c9e9817c398c 267 USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ;
donatien 0:ae46a0638b2c 268
donatien 0:ae46a0638b2c 269 /*
donatien 9:c9e9817c398c 270 * Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device
donatien 0:ae46a0638b2c 271 *
donatien 0:ae46a0638b2c 272 * @param dev pointer on a USBDeviceConnected object
donatien 9:c9e9817c398c 273 * @param ep pointer on the USBEndpoint which will be added
donatien 0:ae46a0638b2c 274 *
donatien 0:ae46a0638b2c 275 * return true if successful
donatien 0:ae46a0638b2c 276 */
donatien 9:c9e9817c398c 277 bool addEndpoint(USBDeviceConnected * dev, uint8_t intf_nb, USBEndpoint * ep) ;
donatien 0:ae46a0638b2c 278
donatien 0:ae46a0638b2c 279 /*
donatien 9:c9e9817c398c 280 * Create an USBEndpoint descriptor. Warning: the USBEndpoint is not linked.
donatien 0:ae46a0638b2c 281 *
donatien 9:c9e9817c398c 282 * @param type USBEndpoint type (CONTROL_ENDPOINT, BULK_ENDPOINT, INTERRUPT_ENDPOINT)
donatien 9:c9e9817c398c 283 * @param dir USBEndpoint direction (no meaning for CONTROL_ENDPOINT)
donatien 9:c9e9817c398c 284 * @param size USBEndpoint max packet size
donatien 9:c9e9817c398c 285 * @param addr USBEndpoint address
donatien 0:ae46a0638b2c 286 *
donatien 9:c9e9817c398c 287 * @returns pointer on the USBEndpoint created
donatien 0:ae46a0638b2c 288 */
donatien 9:c9e9817c398c 289 USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ;
donatien 0:ae46a0638b2c 290
donatien 0:ae46a0638b2c 291
donatien 0:ae46a0638b2c 292 // to store a setup packet
donatien 0:ae46a0638b2c 293 uint8_t setupPacket[8];
donatien 0:ae46a0638b2c 294
donatien 0:ae46a0638b2c 295
donatien 0:ae46a0638b2c 296 /////////////////////////
donatien 0:ae46a0638b2c 297 /// FOR DEBUG
donatien 0:ae46a0638b2c 298 /////////////////////////
ashleymills 24:f4b676f61906 299 public:
donatien 0:ae46a0638b2c 300 void printBulk();
donatien 0:ae46a0638b2c 301 void printInt();
donatien 0:ae46a0638b2c 302
donatien 0:ae46a0638b2c 303 };
donatien 0:ae46a0638b2c 304
donatien 0:ae46a0638b2c 305 #endif