Pierre Provent / USBHost

Dependents:   TEST_USB_Nucleo_F429ZI Essais_USB_Nucleo_F429ZI SID_V3_Nucleo_F429ZI SID_V4_Nucleo_F429ZI_copy

Committer:
pierreprovent
Date:
Fri Sep 25 10:17:49 2020 +0000
Revision:
0:77ca32e8e04e
Programme acquisition en enregistrement sur clef USB carte Nucleo F429ZI cours ELE118 Cnam

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pierreprovent 0:77ca32e8e04e 1 /* mbed USBHost Library
pierreprovent 0:77ca32e8e04e 2 * Copyright (c) 2006-2013 ARM Limited
pierreprovent 0:77ca32e8e04e 3 *
pierreprovent 0:77ca32e8e04e 4 * Licensed under the Apache License, Version 2.0 (the "License");
pierreprovent 0:77ca32e8e04e 5 * you may not use this file except in compliance with the License.
pierreprovent 0:77ca32e8e04e 6 * You may obtain a copy of the License at
pierreprovent 0:77ca32e8e04e 7 *
pierreprovent 0:77ca32e8e04e 8 * http://www.apache.org/licenses/LICENSE-2.0
pierreprovent 0:77ca32e8e04e 9 *
pierreprovent 0:77ca32e8e04e 10 * Unless required by applicable law or agreed to in writing, software
pierreprovent 0:77ca32e8e04e 11 * distributed under the License is distributed on an "AS IS" BASIS,
pierreprovent 0:77ca32e8e04e 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
pierreprovent 0:77ca32e8e04e 13 * See the License for the specific language governing permissions and
pierreprovent 0:77ca32e8e04e 14 * limitations under the License.
pierreprovent 0:77ca32e8e04e 15 */
pierreprovent 0:77ca32e8e04e 16
pierreprovent 0:77ca32e8e04e 17 #ifndef USBHOST_H
pierreprovent 0:77ca32e8e04e 18 #define USBHOST_H
pierreprovent 0:77ca32e8e04e 19 #ifdef TARGET_STM
pierreprovent 0:77ca32e8e04e 20 #include "mbed.h"
pierreprovent 0:77ca32e8e04e 21 #endif
pierreprovent 0:77ca32e8e04e 22 #include "USBHALHost.h"
pierreprovent 0:77ca32e8e04e 23 #include "USBDeviceConnected.h"
pierreprovent 0:77ca32e8e04e 24 #include "IUSBEnumerator.h"
pierreprovent 0:77ca32e8e04e 25 #include "USBHostConf.h"
pierreprovent 0:77ca32e8e04e 26 #include "rtos.h"
pierreprovent 0:77ca32e8e04e 27 #include "dbg.h"
pierreprovent 0:77ca32e8e04e 28 #include "USBHostHub.h"
pierreprovent 0:77ca32e8e04e 29
pierreprovent 0:77ca32e8e04e 30 /**
pierreprovent 0:77ca32e8e04e 31 * USBHost class
pierreprovent 0:77ca32e8e04e 32 * This class is a singleton. All drivers have a reference on the static USBHost instance
pierreprovent 0:77ca32e8e04e 33 */
pierreprovent 0:77ca32e8e04e 34 class USBHost : public USBHALHost {
pierreprovent 0:77ca32e8e04e 35 public:
pierreprovent 0:77ca32e8e04e 36 /**
pierreprovent 0:77ca32e8e04e 37 * Static method to create or retrieve the single USBHost instance
pierreprovent 0:77ca32e8e04e 38 */
pierreprovent 0:77ca32e8e04e 39 static USBHost * getHostInst();
pierreprovent 0:77ca32e8e04e 40
pierreprovent 0:77ca32e8e04e 41 /**
pierreprovent 0:77ca32e8e04e 42 * Control read: setup stage, data stage and status stage
pierreprovent 0:77ca32e8e04e 43 *
pierreprovent 0:77ca32e8e04e 44 * @param dev the control read will be done for this device
pierreprovent 0:77ca32e8e04e 45 * @param requestType request type
pierreprovent 0:77ca32e8e04e 46 * @param request request
pierreprovent 0:77ca32e8e04e 47 * @param value value
pierreprovent 0:77ca32e8e04e 48 * @param index index
pierreprovent 0:77ca32e8e04e 49 * @param buf pointer on a buffer where will be store the data received
pierreprovent 0:77ca32e8e04e 50 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 51 *
pierreprovent 0:77ca32e8e04e 52 * @returns status of the control read
pierreprovent 0:77ca32e8e04e 53 */
pierreprovent 0:77ca32e8e04e 54 USB_TYPE controlRead(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len);
pierreprovent 0:77ca32e8e04e 55
pierreprovent 0:77ca32e8e04e 56 /**
pierreprovent 0:77ca32e8e04e 57 * Control write: setup stage, data stage and status stage
pierreprovent 0:77ca32e8e04e 58 *
pierreprovent 0:77ca32e8e04e 59 * @param dev the control write will be done for this device
pierreprovent 0:77ca32e8e04e 60 * @param requestType request type
pierreprovent 0:77ca32e8e04e 61 * @param request request
pierreprovent 0:77ca32e8e04e 62 * @param value value
pierreprovent 0:77ca32e8e04e 63 * @param index index
pierreprovent 0:77ca32e8e04e 64 * @param buf pointer on a buffer which will be written
pierreprovent 0:77ca32e8e04e 65 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 66 *
pierreprovent 0:77ca32e8e04e 67 * @returns status of the control write
pierreprovent 0:77ca32e8e04e 68 */
pierreprovent 0:77ca32e8e04e 69 USB_TYPE controlWrite(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len);
pierreprovent 0:77ca32e8e04e 70
pierreprovent 0:77ca32e8e04e 71 /**
pierreprovent 0:77ca32e8e04e 72 * Bulk read
pierreprovent 0:77ca32e8e04e 73 *
pierreprovent 0:77ca32e8e04e 74 * @param dev the bulk transfer will be done for this device
pierreprovent 0:77ca32e8e04e 75 * @param ep USBEndpoint which will be used to read a packet
pierreprovent 0:77ca32e8e04e 76 * @param buf pointer on a buffer where will be store the data received
pierreprovent 0:77ca32e8e04e 77 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 78 * @param blocking if true, the read is blocking (wait for completion)
pierreprovent 0:77ca32e8e04e 79 *
pierreprovent 0:77ca32e8e04e 80 * @returns status of the bulk read
pierreprovent 0:77ca32e8e04e 81 */
pierreprovent 0:77ca32e8e04e 82 USB_TYPE bulkRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true);
pierreprovent 0:77ca32e8e04e 83
pierreprovent 0:77ca32e8e04e 84 /**
pierreprovent 0:77ca32e8e04e 85 * Bulk write
pierreprovent 0:77ca32e8e04e 86 *
pierreprovent 0:77ca32e8e04e 87 * @param dev the bulk transfer will be done for this device
pierreprovent 0:77ca32e8e04e 88 * @param ep USBEndpoint which will be used to write a packet
pierreprovent 0:77ca32e8e04e 89 * @param buf pointer on a buffer which will be written
pierreprovent 0:77ca32e8e04e 90 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 91 * @param blocking if true, the write is blocking (wait for completion)
pierreprovent 0:77ca32e8e04e 92 *
pierreprovent 0:77ca32e8e04e 93 * @returns status of the bulk write
pierreprovent 0:77ca32e8e04e 94 */
pierreprovent 0:77ca32e8e04e 95 USB_TYPE bulkWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true);
pierreprovent 0:77ca32e8e04e 96
pierreprovent 0:77ca32e8e04e 97 /**
pierreprovent 0:77ca32e8e04e 98 * Interrupt read
pierreprovent 0:77ca32e8e04e 99 *
pierreprovent 0:77ca32e8e04e 100 * @param dev the bulk transfer will be done for this device
pierreprovent 0:77ca32e8e04e 101 * @param ep USBEndpoint which will be used to write a packet
pierreprovent 0:77ca32e8e04e 102 * @param buf pointer on a buffer which will be written
pierreprovent 0:77ca32e8e04e 103 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 104 * @param blocking if true, the read is blocking (wait for completion)
pierreprovent 0:77ca32e8e04e 105 *
pierreprovent 0:77ca32e8e04e 106 * @returns status of the interrupt read
pierreprovent 0:77ca32e8e04e 107 */
pierreprovent 0:77ca32e8e04e 108 USB_TYPE interruptRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true);
pierreprovent 0:77ca32e8e04e 109
pierreprovent 0:77ca32e8e04e 110 /**
pierreprovent 0:77ca32e8e04e 111 * Interrupt write
pierreprovent 0:77ca32e8e04e 112 *
pierreprovent 0:77ca32e8e04e 113 * @param dev the bulk transfer will be done for this device
pierreprovent 0:77ca32e8e04e 114 * @param ep USBEndpoint which will be used to write a packet
pierreprovent 0:77ca32e8e04e 115 * @param buf pointer on a buffer which will be written
pierreprovent 0:77ca32e8e04e 116 * @param len length of the transfer
pierreprovent 0:77ca32e8e04e 117 * @param blocking if true, the write is blocking (wait for completion)
pierreprovent 0:77ca32e8e04e 118 *
pierreprovent 0:77ca32e8e04e 119 * @returns status of the interrupt write
pierreprovent 0:77ca32e8e04e 120 */
pierreprovent 0:77ca32e8e04e 121 USB_TYPE interruptWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true);
pierreprovent 0:77ca32e8e04e 122
pierreprovent 0:77ca32e8e04e 123 /**
pierreprovent 0:77ca32e8e04e 124 * Enumerate a device.
pierreprovent 0:77ca32e8e04e 125 *
pierreprovent 0:77ca32e8e04e 126 * @param dev device which will be enumerated
pierreprovent 0:77ca32e8e04e 127 *
pierreprovent 0:77ca32e8e04e 128 * @returns status of the enumeration
pierreprovent 0:77ca32e8e04e 129 */
pierreprovent 0:77ca32e8e04e 130 USB_TYPE enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerator);
pierreprovent 0:77ca32e8e04e 131
pierreprovent 0:77ca32e8e04e 132 /**
pierreprovent 0:77ca32e8e04e 133 * reset a specific device
pierreprovent 0:77ca32e8e04e 134 *
pierreprovent 0:77ca32e8e04e 135 * @param dev device which will be resetted
pierreprovent 0:77ca32e8e04e 136 */
pierreprovent 0:77ca32e8e04e 137 USB_TYPE resetDevice(USBDeviceConnected * dev);
pierreprovent 0:77ca32e8e04e 138
pierreprovent 0:77ca32e8e04e 139 /**
pierreprovent 0:77ca32e8e04e 140 * Get a device
pierreprovent 0:77ca32e8e04e 141 *
pierreprovent 0:77ca32e8e04e 142 * @param index index of the device which will be returned
pierreprovent 0:77ca32e8e04e 143 *
pierreprovent 0:77ca32e8e04e 144 * @returns pointer on the "index" device
pierreprovent 0:77ca32e8e04e 145 */
pierreprovent 0:77ca32e8e04e 146 USBDeviceConnected * getDevice(uint8_t index);
pierreprovent 0:77ca32e8e04e 147
pierreprovent 0:77ca32e8e04e 148 /*
pierreprovent 0:77ca32e8e04e 149 * If there is a HID device connected, the host stores the length of the report descriptor.
pierreprovent 0:77ca32e8e04e 150 * This avoid to the driver to re-ask the configuration descriptor to request the report descriptor
pierreprovent 0:77ca32e8e04e 151 *
pierreprovent 0:77ca32e8e04e 152 * @returns length of the report descriptor
pierreprovent 0:77ca32e8e04e 153 */
pierreprovent 0:77ca32e8e04e 154 inline uint16_t getLengthReportDescr() {
pierreprovent 0:77ca32e8e04e 155 return lenReportDescr;
pierreprovent 0:77ca32e8e04e 156 };
pierreprovent 0:77ca32e8e04e 157
pierreprovent 0:77ca32e8e04e 158 /**
pierreprovent 0:77ca32e8e04e 159 * register a driver into the host associated with a callback function called when the device is disconnected
pierreprovent 0:77ca32e8e04e 160 *
pierreprovent 0:77ca32e8e04e 161 * @param dev device
pierreprovent 0:77ca32e8e04e 162 * @param intf interface number
pierreprovent 0:77ca32e8e04e 163 * @param tptr pointer to the object to call the member function on
pierreprovent 0:77ca32e8e04e 164 * @param mptr pointer to the member function to be called
pierreprovent 0:77ca32e8e04e 165 */
pierreprovent 0:77ca32e8e04e 166 template<typename T>
pierreprovent 0:77ca32e8e04e 167 inline void registerDriver(USBDeviceConnected * dev, uint8_t intf, T* tptr, void (T::*mptr)(void)) {
pierreprovent 0:77ca32e8e04e 168 int index = findDevice(dev);
pierreprovent 0:77ca32e8e04e 169 if ((index != -1) && (mptr != NULL) && (tptr != NULL)) {
pierreprovent 0:77ca32e8e04e 170 USB_DBG("register driver for dev: %p on intf: %d", dev, intf);
pierreprovent 0:77ca32e8e04e 171 deviceAttachedDriver[index][intf] = true;
pierreprovent 0:77ca32e8e04e 172 dev->onDisconnect(intf, tptr, mptr);
pierreprovent 0:77ca32e8e04e 173 }
pierreprovent 0:77ca32e8e04e 174 }
pierreprovent 0:77ca32e8e04e 175
pierreprovent 0:77ca32e8e04e 176 /**
pierreprovent 0:77ca32e8e04e 177 * register a driver into the host associated with a callback function called when the device is disconnected
pierreprovent 0:77ca32e8e04e 178 *
pierreprovent 0:77ca32e8e04e 179 * @param dev device
pierreprovent 0:77ca32e8e04e 180 * @param intf interface number
pierreprovent 0:77ca32e8e04e 181 * @param fn callback called when the specified device has been disconnected
pierreprovent 0:77ca32e8e04e 182 */
pierreprovent 0:77ca32e8e04e 183 inline void registerDriver(USBDeviceConnected * dev, uint8_t intf, void (*fn)(void)) {
pierreprovent 0:77ca32e8e04e 184 int index = findDevice(dev);
pierreprovent 0:77ca32e8e04e 185 if ((index != -1) && (fn != NULL)) {
pierreprovent 0:77ca32e8e04e 186 USB_DBG("register driver for dev: %p on intf: %d", dev, intf);
pierreprovent 0:77ca32e8e04e 187 deviceAttachedDriver[index][intf] = true;
pierreprovent 0:77ca32e8e04e 188 dev->onDisconnect(intf, fn);
pierreprovent 0:77ca32e8e04e 189 }
pierreprovent 0:77ca32e8e04e 190 }
pierreprovent 0:77ca32e8e04e 191
pierreprovent 0:77ca32e8e04e 192 /**
pierreprovent 0:77ca32e8e04e 193 * Instantiate to protect USB thread from accessing shared objects (USBConnectedDevices and Interfaces)
pierreprovent 0:77ca32e8e04e 194 */
pierreprovent 0:77ca32e8e04e 195 class Lock
pierreprovent 0:77ca32e8e04e 196 {
pierreprovent 0:77ca32e8e04e 197 public:
pierreprovent 0:77ca32e8e04e 198 Lock(USBHost* pHost);
pierreprovent 0:77ca32e8e04e 199 ~Lock();
pierreprovent 0:77ca32e8e04e 200 private:
pierreprovent 0:77ca32e8e04e 201 USBHost* m_pHost;
pierreprovent 0:77ca32e8e04e 202 };
pierreprovent 0:77ca32e8e04e 203
pierreprovent 0:77ca32e8e04e 204 friend class USBHostHub;
pierreprovent 0:77ca32e8e04e 205
pierreprovent 0:77ca32e8e04e 206 protected:
pierreprovent 0:77ca32e8e04e 207
pierreprovent 0:77ca32e8e04e 208 /**
pierreprovent 0:77ca32e8e04e 209 * Virtual method called when a transfer has been completed
pierreprovent 0:77ca32e8e04e 210 *
pierreprovent 0:77ca32e8e04e 211 * @param addr list of the TDs which have been completed
pierreprovent 0:77ca32e8e04e 212 */
pierreprovent 0:77ca32e8e04e 213 virtual void transferCompleted(volatile uint32_t addr);
pierreprovent 0:77ca32e8e04e 214
pierreprovent 0:77ca32e8e04e 215 /**
pierreprovent 0:77ca32e8e04e 216 * Virtual method called when a device has been connected
pierreprovent 0:77ca32e8e04e 217 *
pierreprovent 0:77ca32e8e04e 218 * @param hub hub number of the device
pierreprovent 0:77ca32e8e04e 219 * @param port port number of the device
pierreprovent 0:77ca32e8e04e 220 * @param lowSpeed 1 if low speed, 0 otherwise
pierreprovent 0:77ca32e8e04e 221 * @param hub_parent reference on the parent hub
pierreprovent 0:77ca32e8e04e 222 */
pierreprovent 0:77ca32e8e04e 223 virtual void deviceConnected(int hub, int port, bool lowSpeed, USBHostHub * hub_parent = NULL);
pierreprovent 0:77ca32e8e04e 224
pierreprovent 0:77ca32e8e04e 225 /**
pierreprovent 0:77ca32e8e04e 226 * Virtuel method called when a device has been disconnected
pierreprovent 0:77ca32e8e04e 227 *
pierreprovent 0:77ca32e8e04e 228 * @param hub hub number of the device
pierreprovent 0:77ca32e8e04e 229 * @param port port number of the device
pierreprovent 0:77ca32e8e04e 230 * @param addr list of the TDs which have been completed to dequeue freed TDs
pierreprovent 0:77ca32e8e04e 231 */
pierreprovent 0:77ca32e8e04e 232 virtual void deviceDisconnected(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr);
pierreprovent 0:77ca32e8e04e 233
pierreprovent 0:77ca32e8e04e 234
pierreprovent 0:77ca32e8e04e 235 private:
pierreprovent 0:77ca32e8e04e 236 // singleton class -> constructor is private
pierreprovent 0:77ca32e8e04e 237 USBHost();
pierreprovent 0:77ca32e8e04e 238 static USBHost * instHost;
pierreprovent 0:77ca32e8e04e 239 uint16_t lenReportDescr;
pierreprovent 0:77ca32e8e04e 240
pierreprovent 0:77ca32e8e04e 241 // endpoints
pierreprovent 0:77ca32e8e04e 242 void unqueueEndpoint(USBEndpoint * ep) ;
pierreprovent 0:77ca32e8e04e 243 USBEndpoint endpoints[MAX_ENDPOINT];
pierreprovent 0:77ca32e8e04e 244 USBEndpoint* volatile control;
pierreprovent 0:77ca32e8e04e 245
pierreprovent 0:77ca32e8e04e 246 USBEndpoint* volatile headControlEndpoint;
pierreprovent 0:77ca32e8e04e 247 USBEndpoint* volatile headBulkEndpoint;
pierreprovent 0:77ca32e8e04e 248 USBEndpoint* volatile headInterruptEndpoint;
pierreprovent 0:77ca32e8e04e 249
pierreprovent 0:77ca32e8e04e 250 USBEndpoint* volatile tailControlEndpoint;
pierreprovent 0:77ca32e8e04e 251 USBEndpoint* volatile tailBulkEndpoint;
pierreprovent 0:77ca32e8e04e 252 USBEndpoint* volatile tailInterruptEndpoint;
pierreprovent 0:77ca32e8e04e 253
pierreprovent 0:77ca32e8e04e 254 bool controlEndpointAllocated;
pierreprovent 0:77ca32e8e04e 255
pierreprovent 0:77ca32e8e04e 256 // devices connected
pierreprovent 0:77ca32e8e04e 257 USBDeviceConnected devices[MAX_DEVICE_CONNECTED];
pierreprovent 0:77ca32e8e04e 258 bool deviceInUse[MAX_DEVICE_CONNECTED];
pierreprovent 0:77ca32e8e04e 259 bool deviceAttachedDriver[MAX_DEVICE_CONNECTED][MAX_INTF];
pierreprovent 0:77ca32e8e04e 260 bool deviceReset[MAX_DEVICE_CONNECTED];
pierreprovent 0:77ca32e8e04e 261 bool deviceInited[MAX_DEVICE_CONNECTED];
pierreprovent 0:77ca32e8e04e 262
pierreprovent 0:77ca32e8e04e 263 #if MAX_HUB_NB
pierreprovent 0:77ca32e8e04e 264 USBHostHub hubs[MAX_HUB_NB];
pierreprovent 0:77ca32e8e04e 265 bool hub_in_use[MAX_HUB_NB];
pierreprovent 0:77ca32e8e04e 266 #endif
pierreprovent 0:77ca32e8e04e 267
pierreprovent 0:77ca32e8e04e 268 // to store a setup packet
pierreprovent 0:77ca32e8e04e 269 uint8_t setupPacket[8];
pierreprovent 0:77ca32e8e04e 270
pierreprovent 0:77ca32e8e04e 271 typedef struct {
pierreprovent 0:77ca32e8e04e 272 uint8_t event_id;
pierreprovent 0:77ca32e8e04e 273 void * td_addr;
pierreprovent 0:77ca32e8e04e 274 uint8_t hub;
pierreprovent 0:77ca32e8e04e 275 uint8_t port;
pierreprovent 0:77ca32e8e04e 276 uint8_t lowSpeed;
pierreprovent 0:77ca32e8e04e 277 uint8_t td_state;
pierreprovent 0:77ca32e8e04e 278 void * hub_parent;
pierreprovent 0:77ca32e8e04e 279 } message_t;
pierreprovent 0:77ca32e8e04e 280
pierreprovent 0:77ca32e8e04e 281 Thread usbThread;
pierreprovent 0:77ca32e8e04e 282 void usb_process();
pierreprovent 0:77ca32e8e04e 283 Mail<message_t, 10> mail_usb_event;
pierreprovent 0:77ca32e8e04e 284 Mutex usb_mutex;
pierreprovent 0:77ca32e8e04e 285 Mutex td_mutex;
pierreprovent 0:77ca32e8e04e 286
pierreprovent 0:77ca32e8e04e 287 // buffer for conf descriptor
pierreprovent 0:77ca32e8e04e 288 uint8_t data[415];
pierreprovent 0:77ca32e8e04e 289
pierreprovent 0:77ca32e8e04e 290 /**
pierreprovent 0:77ca32e8e04e 291 * Add a transfer on the TD linked list associated to an ED
pierreprovent 0:77ca32e8e04e 292 *
pierreprovent 0:77ca32e8e04e 293 * @param ed the transfer is associated to this ed
pierreprovent 0:77ca32e8e04e 294 * @param buf pointer on a buffer where will be read/write data to send or receive
pierreprovent 0:77ca32e8e04e 295 * @param len transfer length
pierreprovent 0:77ca32e8e04e 296 *
pierreprovent 0:77ca32e8e04e 297 * @return status of the transfer
pierreprovent 0:77ca32e8e04e 298 */
pierreprovent 0:77ca32e8e04e 299 USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ;
pierreprovent 0:77ca32e8e04e 300
pierreprovent 0:77ca32e8e04e 301 /**
pierreprovent 0:77ca32e8e04e 302 * Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device
pierreprovent 0:77ca32e8e04e 303 *
pierreprovent 0:77ca32e8e04e 304 * @param dev pointer on a USBDeviceConnected object
pierreprovent 0:77ca32e8e04e 305 * @param ep pointer on the USBEndpoint which will be added
pierreprovent 0:77ca32e8e04e 306 *
pierreprovent 0:77ca32e8e04e 307 * return true if successful
pierreprovent 0:77ca32e8e04e 308 */
pierreprovent 0:77ca32e8e04e 309 bool addEndpoint(USBDeviceConnected * dev, uint8_t intf_nb, USBEndpoint * ep) ;
pierreprovent 0:77ca32e8e04e 310
pierreprovent 0:77ca32e8e04e 311 /**
pierreprovent 0:77ca32e8e04e 312 * Create an USBEndpoint descriptor. Warning: the USBEndpoint is not linked.
pierreprovent 0:77ca32e8e04e 313 *
pierreprovent 0:77ca32e8e04e 314 * @param type USBEndpoint type (CONTROL_ENDPOINT, BULK_ENDPOINT, INTERRUPT_ENDPOINT)
pierreprovent 0:77ca32e8e04e 315 * @param dir USBEndpoint direction (no meaning for CONTROL_ENDPOINT)
pierreprovent 0:77ca32e8e04e 316 * @param size USBEndpoint max packet size
pierreprovent 0:77ca32e8e04e 317 * @param addr USBEndpoint address
pierreprovent 0:77ca32e8e04e 318 *
pierreprovent 0:77ca32e8e04e 319 * @returns pointer on the USBEndpoint created
pierreprovent 0:77ca32e8e04e 320 */
pierreprovent 0:77ca32e8e04e 321 USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ;
pierreprovent 0:77ca32e8e04e 322
pierreprovent 0:77ca32e8e04e 323 /**
pierreprovent 0:77ca32e8e04e 324 * Request the device descriptor
pierreprovent 0:77ca32e8e04e 325 *
pierreprovent 0:77ca32e8e04e 326 * @param dev request the device descriptor on this device
pierreprovent 0:77ca32e8e04e 327 * @param buf buffer to store the device descriptor
pierreprovent 0:77ca32e8e04e 328 * @param max_len_buf maximum size of buf
pierreprovent 0:77ca32e8e04e 329 * @param len_dev_descr pointer to store the length of the packet transferred
pierreprovent 0:77ca32e8e04e 330 */
pierreprovent 0:77ca32e8e04e 331 USB_TYPE getDeviceDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_dev_descr = NULL);
pierreprovent 0:77ca32e8e04e 332
pierreprovent 0:77ca32e8e04e 333 /**
pierreprovent 0:77ca32e8e04e 334 * Request the configuration descriptor
pierreprovent 0:77ca32e8e04e 335 *
pierreprovent 0:77ca32e8e04e 336 * @param dev request the configuration descriptor on this device
pierreprovent 0:77ca32e8e04e 337 * @param buf buffer to store the configuration descriptor
pierreprovent 0:77ca32e8e04e 338 * @param max_len_buf maximum size of buf
pierreprovent 0:77ca32e8e04e 339 * @param len_conf_descr pointer to store the length of the packet transferred
pierreprovent 0:77ca32e8e04e 340 */
pierreprovent 0:77ca32e8e04e 341 USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_conf_descr = NULL);
pierreprovent 0:77ca32e8e04e 342
pierreprovent 0:77ca32e8e04e 343 /**
pierreprovent 0:77ca32e8e04e 344 * Set the address of a specific device
pierreprovent 0:77ca32e8e04e 345 *
pierreprovent 0:77ca32e8e04e 346 * @param dev device to set the address
pierreprovent 0:77ca32e8e04e 347 * @param address address
pierreprovent 0:77ca32e8e04e 348 */
pierreprovent 0:77ca32e8e04e 349 USB_TYPE setAddress(USBDeviceConnected * dev, uint8_t address);
pierreprovent 0:77ca32e8e04e 350
pierreprovent 0:77ca32e8e04e 351 /**
pierreprovent 0:77ca32e8e04e 352 * Set the configuration of a device
pierreprovent 0:77ca32e8e04e 353 *
pierreprovent 0:77ca32e8e04e 354 * @param dev device on which the specified configuration will be activated
pierreprovent 0:77ca32e8e04e 355 * @param conf configuration number to activate (usually 1)
pierreprovent 0:77ca32e8e04e 356 */
pierreprovent 0:77ca32e8e04e 357 USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf);
pierreprovent 0:77ca32e8e04e 358
pierreprovent 0:77ca32e8e04e 359 /**
pierreprovent 0:77ca32e8e04e 360 * Free a specific device
pierreprovent 0:77ca32e8e04e 361 *
pierreprovent 0:77ca32e8e04e 362 * @param dev device to be freed
pierreprovent 0:77ca32e8e04e 363 */
pierreprovent 0:77ca32e8e04e 364 void freeDevice(USBDeviceConnected * dev);
pierreprovent 0:77ca32e8e04e 365
pierreprovent 0:77ca32e8e04e 366 USB_TYPE controlTransfer( USBDeviceConnected * dev,
pierreprovent 0:77ca32e8e04e 367 uint8_t requestType,
pierreprovent 0:77ca32e8e04e 368 uint8_t request,
pierreprovent 0:77ca32e8e04e 369 uint32_t value,
pierreprovent 0:77ca32e8e04e 370 uint32_t index,
pierreprovent 0:77ca32e8e04e 371 uint8_t * buf,
pierreprovent 0:77ca32e8e04e 372 uint32_t len,
pierreprovent 0:77ca32e8e04e 373 bool write);
pierreprovent 0:77ca32e8e04e 374
pierreprovent 0:77ca32e8e04e 375 USB_TYPE generalTransfer( USBDeviceConnected * dev,
pierreprovent 0:77ca32e8e04e 376 USBEndpoint * ep,
pierreprovent 0:77ca32e8e04e 377 uint8_t * buf,
pierreprovent 0:77ca32e8e04e 378 uint32_t len,
pierreprovent 0:77ca32e8e04e 379 bool blocking,
pierreprovent 0:77ca32e8e04e 380 ENDPOINT_TYPE type,
pierreprovent 0:77ca32e8e04e 381 bool write) ;
pierreprovent 0:77ca32e8e04e 382
pierreprovent 0:77ca32e8e04e 383 void fillControlBuf(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index, int len) ;
pierreprovent 0:77ca32e8e04e 384 void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ;
pierreprovent 0:77ca32e8e04e 385 int findDevice(USBDeviceConnected * dev) ;
pierreprovent 0:77ca32e8e04e 386 int findDevice(uint8_t hub, uint8_t port, USBHostHub * hub_parent = NULL) ;
pierreprovent 0:77ca32e8e04e 387 uint8_t numberDriverAttached(USBDeviceConnected * dev);
pierreprovent 0:77ca32e8e04e 388
pierreprovent 0:77ca32e8e04e 389 /////////////////////////
pierreprovent 0:77ca32e8e04e 390 /// FOR DEBUG
pierreprovent 0:77ca32e8e04e 391 /////////////////////////
pierreprovent 0:77ca32e8e04e 392 void printList(ENDPOINT_TYPE type);
pierreprovent 0:77ca32e8e04e 393
pierreprovent 0:77ca32e8e04e 394 };
pierreprovent 0:77ca32e8e04e 395
pierreprovent 0:77ca32e8e04e 396 #endif