X-TOUCH to djay bridge

Dependencies:   mbed mbed-rtos FATFileSystem

Committer:
okini3939
Date:
Wed Jun 05 04:54:37 2019 +0000
Revision:
1:0dac72ab5910
sample

Who changed what in which revision?

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