Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: FATFileSystem mbed-rtos
Fork of USBHost_AddIso by
USBHost.h
00001 /* mbed USBHost Library 00002 * Copyright (c) 2006-2013 ARM Limited 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 00017 #ifndef USBHOST_H 00018 #define USBHOST_H 00019 00020 #include "USBHALHost.h" 00021 #include "USBDeviceConnected.h" 00022 #include "IUSBEnumerator.h" 00023 #include "USBHostConf.h" 00024 #include "rtos.h" 00025 #include "dbg.h" 00026 #include "USBHostHub.h" 00027 00028 /** 00029 * USBHost class 00030 * This class is a singleton. All drivers have a reference on the static USBHost instance 00031 */ 00032 class USBHost : public USBHALHost { 00033 public: 00034 /** 00035 * Static method to create or retrieve the single USBHost instance 00036 */ 00037 static USBHost * getHostInst(); 00038 00039 /** 00040 * Control read: setup stage, data stage and status stage 00041 * 00042 * @param dev the control read will be done for this device 00043 * @param requestType request type 00044 * @param request request 00045 * @param value value 00046 * @param index index 00047 * @param buf pointer on a buffer where will be store the data received 00048 * @param len length of the transfer 00049 * 00050 * @returns status of the control read 00051 */ 00052 USB_TYPE controlRead(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len); 00053 00054 /** 00055 * Control write: setup stage, data stage and status stage 00056 * 00057 * @param dev the control write will be done for this device 00058 * @param requestType request type 00059 * @param request request 00060 * @param value value 00061 * @param index index 00062 * @param buf pointer on a buffer which will be written 00063 * @param len length of the transfer 00064 * 00065 * @returns status of the control write 00066 */ 00067 USB_TYPE controlWrite(USBDeviceConnected * dev, uint8_t requestType, uint8_t request, uint32_t value, uint32_t index, uint8_t * buf, uint32_t len); 00068 00069 /** 00070 * Bulk read 00071 * 00072 * @param dev the bulk transfer will be done for this device 00073 * @param ep USBEndpoint which will be used to read a packet 00074 * @param buf pointer on a buffer where will be store the data received 00075 * @param len length of the transfer 00076 * @param blocking if true, the read is blocking (wait for completion) 00077 * 00078 * @returns status of the bulk read 00079 */ 00080 USB_TYPE bulkRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true); 00081 00082 /** 00083 * Bulk write 00084 * 00085 * @param dev the bulk transfer will be done for this device 00086 * @param ep USBEndpoint which will be used to write a packet 00087 * @param buf pointer on a buffer which will be written 00088 * @param len length of the transfer 00089 * @param blocking if true, the write is blocking (wait for completion) 00090 * 00091 * @returns status of the bulk write 00092 */ 00093 USB_TYPE bulkWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true); 00094 00095 /** 00096 * Interrupt read 00097 * 00098 * @param dev the bulk transfer will be done for this device 00099 * @param ep USBEndpoint which will be used to write a packet 00100 * @param buf pointer on a buffer which will be written 00101 * @param len length of the transfer 00102 * @param blocking if true, the read is blocking (wait for completion) 00103 * 00104 * @returns status of the interrupt read 00105 */ 00106 USB_TYPE interruptRead(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true); 00107 00108 /** 00109 * Interrupt write 00110 * 00111 * @param dev the bulk transfer will be done for this device 00112 * @param ep USBEndpoint which will be used to write a packet 00113 * @param buf pointer on a buffer which will be written 00114 * @param len length of the transfer 00115 * @param blocking if true, the write is blocking (wait for completion) 00116 * 00117 * @returns status of the interrupt write 00118 */ 00119 USB_TYPE interruptWrite(USBDeviceConnected * dev, USBEndpoint * ep, uint8_t * buf, uint32_t len, bool blocking = true); 00120 00121 /** 00122 * Enumerate a device. 00123 * 00124 * @param dev device which will be enumerated 00125 * 00126 * @returns status of the enumeration 00127 */ 00128 USB_TYPE enumerate(USBDeviceConnected * dev, IUSBEnumerator* pEnumerator); 00129 #if(1) /* Isochronous */ 00130 inline uint8_t * getConfDescrCurPtr() { 00131 return &data[indexCnfdDescr]; 00132 }; 00133 00134 inline uint16_t getConfDescrRestLen() { 00135 return lenCnfdDescr - indexCnfdDescr; 00136 }; 00137 #endif 00138 00139 /** 00140 * reset a specific device 00141 * 00142 * @param dev device which will be resetted 00143 */ 00144 USB_TYPE resetDevice(USBDeviceConnected * dev); 00145 00146 /** 00147 * Get a device 00148 * 00149 * @param index index of the device which will be returned 00150 * 00151 * @returns pointer on the "index" device 00152 */ 00153 USBDeviceConnected * getDevice(uint8_t index); 00154 00155 /* 00156 * If there is a HID device connected, the host stores the length of the report descriptor. 00157 * This avoid to the driver to re-ask the configuration descriptor to request the report descriptor 00158 * 00159 * @returns length of the report descriptor 00160 */ 00161 inline uint16_t getLengthReportDescr() { 00162 return lenReportDescr; 00163 }; 00164 00165 /** 00166 * register a driver into the host associated with a callback function called when the device is disconnected 00167 * 00168 * @param dev device 00169 * @param intf interface number 00170 * @param tptr pointer to the object to call the member function on 00171 * @param mptr pointer to the member function to be called 00172 */ 00173 template<typename T> 00174 inline void registerDriver(USBDeviceConnected * dev, uint8_t intf, T* tptr, void (T::*mptr)(void)) { 00175 int index = findDevice(dev); 00176 if ((index != -1) && (mptr != NULL) && (tptr != NULL)) { 00177 USB_DBG("register driver for dev: %p on intf: %d", dev, intf); 00178 deviceAttachedDriver[index][intf] = true; 00179 dev->onDisconnect(intf, tptr, mptr); 00180 } 00181 } 00182 00183 /** 00184 * register a driver into the host associated with a callback function called when the device is disconnected 00185 * 00186 * @param dev device 00187 * @param intf interface number 00188 * @param fn callback called when the specified device has been disconnected 00189 */ 00190 inline void registerDriver(USBDeviceConnected * dev, uint8_t intf, void (*fn)(void)) { 00191 int index = findDevice(dev); 00192 if ((index != -1) && (fn != NULL)) { 00193 USB_DBG("register driver for dev: %p on intf: %d", dev, intf); 00194 deviceAttachedDriver[index][intf] = true; 00195 dev->onDisconnect(intf, fn); 00196 } 00197 } 00198 00199 /** 00200 * Instantiate to protect USB thread from accessing shared objects (USBConnectedDevices and Interfaces) 00201 */ 00202 class Lock 00203 { 00204 public: 00205 Lock(USBHost* pHost); 00206 ~Lock(); 00207 private: 00208 USBHost* m_pHost; 00209 }; 00210 00211 friend class USBHostHub; 00212 00213 protected: 00214 00215 /** 00216 * Virtual method called when a transfer has been completed 00217 * 00218 * @param addr list of the TDs which have been completed 00219 */ 00220 virtual void transferCompleted(volatile uint32_t addr); 00221 00222 /** 00223 * Virtual method called when a device has been connected 00224 * 00225 * @param hub hub number of the device 00226 * @param port port number of the device 00227 * @param lowSpeed 1 if low speed, 0 otherwise 00228 * @param hub_parent reference on the parent hub 00229 */ 00230 virtual void deviceConnected(int hub, int port, bool lowSpeed, USBHostHub * hub_parent = NULL); 00231 00232 /** 00233 * Virtuel method called when a device has been disconnected 00234 * 00235 * @param hub hub number of the device 00236 * @param port port number of the device 00237 * @param addr list of the TDs which have been completed to dequeue freed TDs 00238 */ 00239 virtual void deviceDisconnected(int hub, int port, USBHostHub * hub_parent, volatile uint32_t addr); 00240 00241 00242 private: 00243 // singleton class -> constructor is private 00244 USBHost(); 00245 static USBHost * instHost; 00246 uint16_t lenReportDescr; 00247 #if(1) /* Isochronous */ 00248 uint16_t lenCnfdDescr; 00249 uint16_t indexCnfdDescr; 00250 #endif 00251 00252 // endpoints 00253 void unqueueEndpoint(USBEndpoint * ep) ; 00254 USBEndpoint endpoints[MAX_ENDPOINT]; 00255 USBEndpoint* volatile control; 00256 00257 USBEndpoint* volatile headControlEndpoint; 00258 USBEndpoint* volatile headBulkEndpoint; 00259 USBEndpoint* volatile headInterruptEndpoint; 00260 00261 USBEndpoint* volatile tailControlEndpoint; 00262 USBEndpoint* volatile tailBulkEndpoint; 00263 USBEndpoint* volatile tailInterruptEndpoint; 00264 00265 bool controlEndpointAllocated; 00266 00267 // devices connected 00268 USBDeviceConnected devices[MAX_DEVICE_CONNECTED]; 00269 bool deviceInUse[MAX_DEVICE_CONNECTED]; 00270 bool deviceAttachedDriver[MAX_DEVICE_CONNECTED][MAX_INTF]; 00271 bool deviceReset[MAX_DEVICE_CONNECTED]; 00272 bool deviceInited[MAX_DEVICE_CONNECTED]; 00273 00274 #if MAX_HUB_NB 00275 USBHostHub hubs[MAX_HUB_NB]; 00276 bool hub_in_use[MAX_HUB_NB]; 00277 #endif 00278 00279 // to store a setup packet 00280 uint8_t setupPacket[8]; 00281 00282 typedef struct { 00283 uint8_t event_id; 00284 void * td_addr; 00285 uint8_t hub; 00286 uint8_t port; 00287 uint8_t lowSpeed; 00288 uint8_t td_state; 00289 void * hub_parent; 00290 } message_t; 00291 00292 Thread usbThread; 00293 void usb_process(); 00294 static void usb_process_static(void const * arg); 00295 Mail<message_t, 10> mail_usb_event; 00296 Mutex usb_mutex; 00297 Mutex td_mutex; 00298 00299 // buffer for conf descriptor 00300 #if(1) /* Isochronous */ 00301 uint8_t data[1024]; 00302 #else 00303 uint8_t data[415]; 00304 #endif 00305 00306 /** 00307 * Add a transfer on the TD linked list associated to an ED 00308 * 00309 * @param ed the transfer is associated to this ed 00310 * @param buf pointer on a buffer where will be read/write data to send or receive 00311 * @param len transfer length 00312 * 00313 * @return status of the transfer 00314 */ 00315 USB_TYPE addTransfer(USBEndpoint * ed, uint8_t * buf, uint32_t len) ; 00316 00317 /** 00318 * Link the USBEndpoint to the linked list and attach an USBEndpoint this USBEndpoint to a device 00319 * 00320 * @param dev pointer on a USBDeviceConnected object 00321 * @param ep pointer on the USBEndpoint which will be added 00322 * 00323 * return true if successful 00324 */ 00325 bool addEndpoint(USBDeviceConnected * dev, uint8_t intf_nb, USBEndpoint * ep) ; 00326 00327 /** 00328 * Create an USBEndpoint descriptor. Warning: the USBEndpoint is not linked. 00329 * 00330 * @param type USBEndpoint type (CONTROL_ENDPOINT, BULK_ENDPOINT, INTERRUPT_ENDPOINT) 00331 * @param dir USBEndpoint direction (no meaning for CONTROL_ENDPOINT) 00332 * @param size USBEndpoint max packet size 00333 * @param addr USBEndpoint address 00334 * 00335 * @returns pointer on the USBEndpoint created 00336 */ 00337 USBEndpoint * newEndpoint(ENDPOINT_TYPE type, ENDPOINT_DIRECTION dir, uint32_t size, uint8_t addr) ; 00338 00339 /** 00340 * Request the device descriptor 00341 * 00342 * @param dev request the device descriptor on this device 00343 * @param buf buffer to store the device descriptor 00344 * @param max_len_buf maximum size of buf 00345 * @param len_dev_descr pointer to store the length of the packet transferred 00346 */ 00347 USB_TYPE getDeviceDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_dev_descr = NULL); 00348 00349 /** 00350 * Request the configuration descriptor 00351 * 00352 * @param dev request the configuration descriptor on this device 00353 * @param buf buffer to store the configuration descriptor 00354 * @param max_len_buf maximum size of buf 00355 * @param len_conf_descr pointer to store the length of the packet transferred 00356 */ 00357 USB_TYPE getConfigurationDescriptor(USBDeviceConnected * dev, uint8_t * buf, uint16_t max_len_buf, uint16_t * len_conf_descr = NULL); 00358 00359 /** 00360 * Set the address of a specific device 00361 * 00362 * @param dev device to set the address 00363 * @param address address 00364 */ 00365 USB_TYPE setAddress(USBDeviceConnected * dev, uint8_t address); 00366 00367 /** 00368 * Set the configuration of a device 00369 * 00370 * @param dev device on which the specified configuration will be activated 00371 * @param conf configuration number to activate (usually 1) 00372 */ 00373 USB_TYPE setConfiguration(USBDeviceConnected * dev, uint8_t conf); 00374 00375 /** 00376 * Free a specific device 00377 * 00378 * @param dev device to be freed 00379 */ 00380 void freeDevice(USBDeviceConnected * dev); 00381 00382 USB_TYPE controlTransfer( USBDeviceConnected * dev, 00383 uint8_t requestType, 00384 uint8_t request, 00385 uint32_t value, 00386 uint32_t index, 00387 uint8_t * buf, 00388 uint32_t len, 00389 bool write); 00390 00391 USB_TYPE generalTransfer( USBDeviceConnected * dev, 00392 USBEndpoint * ep, 00393 uint8_t * buf, 00394 uint32_t len, 00395 bool blocking, 00396 ENDPOINT_TYPE type, 00397 bool write) ; 00398 00399 void fillControlBuf(uint8_t requestType, uint8_t request, uint16_t value, uint16_t index, int len) ; 00400 void parseConfDescr(USBDeviceConnected * dev, uint8_t * conf_descr, uint32_t len, IUSBEnumerator* pEnumerator) ; 00401 int findDevice(USBDeviceConnected * dev) ; 00402 int findDevice(uint8_t hub, uint8_t port, USBHostHub * hub_parent = NULL) ; 00403 uint8_t numberDriverAttached(USBDeviceConnected * dev); 00404 00405 ///////////////////////// 00406 /// FOR DEBUG 00407 ///////////////////////// 00408 void printList(ENDPOINT_TYPE type); 00409 00410 }; 00411 00412 #endif
Generated on Wed Jul 13 2022 01:47:44 by
1.7.2
