| M480 BSP V3.05.001 The Board Support Package for M480 Series

usb.h
Go to the documentation of this file.
1 /**************************************************************************/
10 #ifndef _USBH_H_
11 #define _USBH_H_
12
13 #include "config.h"
14 #include "usbh_lib.h"
15 #include "ehci.h"
16 #include "ohci.h"
17
19
20 struct utr_t;
21 struct udev_t;
22 struct hub_dev_t;
23 struct iface_t;
24 struct ep_info_t;
25
26 /*----------------------------------------------------------------------------------*/
27 /* USB device request setup packet */
28 /*----------------------------------------------------------------------------------*/
29 #ifdef __ICCARM__
30 typedef struct
31 {
32 __packed uint8_t bmRequestType;
33 __packed uint8_t bRequest;
34 __packed uint16_t wValue;
35 __packed uint16_t wIndex;
36 __packed uint16_t wLength;
37 } DEV_REQ_T;
38 #else
39 typedef struct __attribute__((__packed__))
40 {
41 uint8_t bmRequestType;
42 uint8_t bRequest;
43 uint16_t wValue;
44 uint16_t wIndex;
45 uint16_t wLength;
46 }
47 DEV_REQ_T;
48 #endif
49
50 /*
51 * bmRequestType[7] - Data transfer direction
52 */
53 #define REQ_TYPE_OUT 0x00
54 #define REQ_TYPE_IN 0x80
55 /*
56 * bmRequestType[6:5] - Type
57 */
58 #define REQ_TYPE_STD_DEV 0x00
59 #define REQ_TYPE_CLASS_DEV 0x20
60 #define REQ_TYPE_VENDOR_DEV 0x40
61 /*
62 * bmRequestType[4:0] - Recipient
63 */
64 #define REQ_TYPE_TO_DEV 0x00
65 #define REQ_TYPE_TO_IFACE 0x01
66 #define REQ_TYPE_TO_EP 0x02
67 #define REQ_TYPE_TO_OTHER 0x03
68 /*
69 * Standard Requests
70 */
71 #define USB_REQ_GET_STATUS 0x00
72 #define USB_REQ_CLEAR_FEATURE 0x01
73 #define USB_REQ_SET_FEATURE 0x03
74 #define USB_REQ_SET_ADDRESS 0x05
75 #define USB_REQ_GET_DESCRIPTOR 0x06
76 #define USB_REQ_SET_CONFIGURATION 0x09
77 #define USB_REQ_SET_INTERFACE 0x0B
78 /*
79 * Descriptor Types
80 */
81 #define USB_DT_STANDARD 0x00
82 #define USB_DT_CLASS 0x20
83 #define USB_DT_VENDOR 0x40
84
85 #define USB_DT_DEVICE 0x01
86 #define USB_DT_CONFIGURATION 0x02
87 #define USB_DT_STRING 0x03
88 #define USB_DT_INTERFACE 0x04
89 #define USB_DT_ENDPOINT 0x05
90 #define USB_DT_DEVICE_QUALIFIER 0x06
91 #define USB_DT_OTHER_SPEED_CONF 0x07
92 #define USB_DT_IFACE_POWER 0x08
93
94
95
96 /*----------------------------------------------------------------------------------*/
97 /* USB standard descriptors */
98 /*----------------------------------------------------------------------------------*/
99
100 /* Descriptor header */
101 #ifdef __ICCARM__
102 typedef struct
103 {
104 __packed uint8_t bLength;
105 __packed uint8_t bDescriptorType;
106 } DESC_HDR_T;
107 #else
108 typedef struct __attribute__((__packed__))
109 {
110 uint8_t bLength;
111 uint8_t bDescriptorType;
112 }
113 DESC_HDR_T;
114 #endif
115
116 /*----------------------------------------------------------------------------------*/
117 /* USB device descriptor */
118 /*----------------------------------------------------------------------------------*/
119 #ifdef __ICCARM__
120 typedef struct
121 {
122 __packed uint8_t bLength;
123 __packed uint8_t bDescriptorType;
124 __packed uint16_t bcdUSB;
125 __packed uint8_t bDeviceClass;
126 __packed uint8_t bDeviceSubClass;
127 __packed uint8_t bDeviceProtocol;
128 __packed uint8_t bMaxPacketSize0;
129 __packed uint16_t idVendor;
130 __packed uint16_t idProduct;
131 __packed uint16_t bcdDevice;
132 __packed uint8_t iManufacturer;
133 __packed uint8_t iProduct;
134 __packed uint8_t iSerialNumber;
135 __packed uint8_t bNumConfigurations;
136 } DESC_DEV_T;
137 #else
138 /*----------------------------------------------------------------------------------*/
139 /* USB device descriptor */
140 /*----------------------------------------------------------------------------------*/
141 typedef struct __attribute__((__packed__))
142 {
143 uint8_t bLength;
144 uint8_t bDescriptorType;
145 uint16_t bcdUSB;
146 uint8_t bDeviceClass;
147 uint8_t bDeviceSubClass;
148 uint8_t bDeviceProtocol;
149 uint8_t bMaxPacketSize0;
150 uint16_t idVendor;
151 uint16_t idProduct;
152 uint16_t bcdDevice;
153 uint8_t iManufacturer;
154 uint8_t iProduct;
155 uint8_t iSerialNumber;
156 uint8_t bNumConfigurations;
157 }
158 DESC_DEV_T;
159 #endif
160
161 /*
162 * Configuration Descriptor
163 */
164 #ifdef __ICCARM__
165 typedef struct usb_config_descriptor
166 {
167 __packed uint8_t bLength;
168 __packed uint8_t bDescriptorType;
169 __packed uint16_t wTotalLength;
170 __packed uint8_t bNumInterfaces;
171 __packed uint8_t bConfigurationValue;
172 __packed uint8_t iConfiguration;
173 __packed uint8_t bmAttributes;
174 __packed uint8_t MaxPower;
175 } DESC_CONF_T;
176 #else
177 typedef struct __attribute__((__packed__)) usb_config_descriptor
178 {
179 uint8_t bLength;
180 uint8_t bDescriptorType;
181 uint16_t wTotalLength;
182 uint8_t bNumInterfaces;
183 uint8_t bConfigurationValue;
184 uint8_t iConfiguration;
185 uint8_t bmAttributes;
186 uint8_t MaxPower;
187 } DESC_CONF_T;
188 #endif
189
190 /*
191 * Interface Descriptor
192 */
193 #ifdef __ICCARM__
194 typedef struct usb_interface_descriptor
195 {
196 __packed uint8_t bLength;
197 __packed uint8_t bDescriptorType;
198 __packed uint8_t bInterfaceNumber;
199 __packed uint8_t bAlternateSetting;
200 __packed uint8_t bNumEndpoints;
201 __packed uint8_t bInterfaceClass;
202 __packed uint8_t bInterfaceSubClass;
203 __packed uint8_t bInterfaceProtocol;
204 __packed uint8_t iInterface;
205 } DESC_IF_T;
206 #else
207 typedef struct __attribute__((__packed__)) usb_interface_descriptor
208 {
209 uint8_t bLength;
210 uint8_t bDescriptorType;
211 uint8_t bInterfaceNumber;
212 uint8_t bAlternateSetting;
213 uint8_t bNumEndpoints;
214 uint8_t bInterfaceClass;
215 uint8_t bInterfaceSubClass;
216 uint8_t bInterfaceProtocol;
217 uint8_t iInterface;
218 } DESC_IF_T;
219 #endif
220
221 /*
222 * Interface descriptor bInterfaceClass[7:0]
223 */
224 #define USB_CLASS_AUDIO 0x01
225 #define USB_CLASS_COMM 0x02
226 #define USB_CLASS_HID 0x03
227 #define USB_CLASS_PRINTER 0x07
228 #define USB_CLASS_MASS_STORAGE 0x08
229 #define USB_CLASS_HUB 0x09
230 #define USB_CLASS_DATA 0x0A
231 #define USB_CLASS_VIDEO 0x0E
232
233 /*
234 * Endpoint Descriptor
235 */
236 #ifdef __ICCARM__
237 typedef struct usb_endpoint_descriptor
238 {
239 __packed uint8_t bLength;
240 __packed uint8_t bDescriptorType;
241 __packed uint8_t bEndpointAddress;
242 __packed uint8_t bmAttributes;
243 __packed uint16_t wMaxPacketSize;
244 __packed uint8_t bInterval;
245 __packed uint8_t bRefresh;
246 __packed uint8_t bSynchAddress;
247 } DESC_EP_T;
248 #else
249 typedef struct __attribute__((__packed__)) usb_endpoint_descriptor
250 {
251 uint8_t bLength;
252 uint8_t bDescriptorType;
253 uint8_t bEndpointAddress;
254 uint8_t bmAttributes;
255 uint16_t wMaxPacketSize;
256 uint8_t bInterval;
257 uint8_t bRefresh;
258 uint8_t bSynchAddress;
259 } DESC_EP_T;
260 #endif
261
262 /*
263 * Endpoint descriptor bEndpointAddress[7] - direction
264 */
265 #define EP_ADDR_DIR_MASK 0x80
266 #define EP_ADDR_DIR_IN 0x80
267 #define EP_ADDR_DIR_OUT 0x00
268
269 /*
270 * Endpoint descriptor bmAttributes[1:0] - transfer type
271 */
272 #define EP_ATTR_TT_MASK 0x03
273 #define EP_ATTR_TT_CTRL 0x00
274 #define EP_ATTR_TT_ISO 0x01
275 #define EP_ATTR_TT_BULK 0x02
276 #define EP_ATTR_TT_INT 0x03
277
278
279 /*----------------------------------------------------------------------------------*/
280 /* USB Host controller driver */
281 /*----------------------------------------------------------------------------------*/
282 typedef struct
283 {
284 int (*init) (void);
285 void (*shutdown) (void);
286 void (*suspend) (void);
287 void (*resume) (void);
288 int (*ctrl_xfer)(struct utr_t *utr);
289 int (*bulk_xfer)(struct utr_t *utr);
290 int (*int_xfer)(struct utr_t *utr);
291 int (*iso_xfer)(struct utr_t *utr);
292 int (*quit_xfer)(struct utr_t *utr, struct ep_info_t *ep);
293
294 /* root hub support */
295 int (*rthub_port_reset)(int port);
296 int (*rthub_polling) (void);
297 } HC_DRV_T;
298
299
300 /*----------------------------------------------------------------------------------*/
301 /* USB device driver */
302 /*----------------------------------------------------------------------------------*/
303 typedef struct
304 {
305 int (*probe) (struct iface_t *iface);
306 void (*disconnect) (struct iface_t *iface);
307 void (*suspend) (struct iface_t *iface);
308 void (*resume) (struct iface_t *iface);
309 } UDEV_DRV_T;
310
311
312 /*----------------------------------------------------------------------------------*/
313 /* USB device */
314 /*----------------------------------------------------------------------------------*/
315
316 typedef enum
317 {
318 SPEED_LOW,
319 SPEED_FULL,
320 SPEED_HIGH
321 } SPEED_E;
322
323 typedef struct ep_info_t
324 {
325 uint8_t bEndpointAddress;
326 uint8_t bmAttributes;
327 uint8_t bInterval;
328 uint8_t bToggle;
329 uint16_t wMaxPacketSize;
330 void *hw_pipe;
331 } EP_INFO_T;
332
333 typedef struct udev_t
334 {
335 DESC_DEV_T descriptor;
336 struct hub_dev_t *parent;
337 uint8_t port_num;
338 uint8_t dev_num;
339 int8_t cur_conf;
340 SPEED_E speed;
341 /*
342 * The followings are lightweight USB stack internal used .
343 */
344 uint8_t *cfd_buff;
345 EP_INFO_T ep0;
346 HC_DRV_T *hc_driver;
347 struct iface_t *iface_list;
348 struct udev_t *next;
349 } UDEV_T;
350
351 typedef struct alt_iface_t
352 {
353 DESC_IF_T *ifd;
354 EP_INFO_T ep[MAX_EP_PER_IFACE];
355 } ALT_IFACE_T;
356
357 typedef struct iface_t
358 {
359 UDEV_T *udev;
360 uint8_t if_num;
361 uint8_t num_alt;
362 ALT_IFACE_T *aif;
363 ALT_IFACE_T alt[MAX_ALT_PER_IFACE];
364 UDEV_DRV_T *driver;
365 void *context;
366 struct iface_t *next;
367 } IFACE_T;
368
369
370 /*----------------------------------------------------------------------------------*/
371 /* URB (USB Request Block) */
372 /*----------------------------------------------------------------------------------*/
373
374 #define IF_PER_UTR 8 /* number of frames per UTR isochronous transfer (DO NOT modify it!) */
375
376 typedef void (*FUNC_UTR_T)(struct utr_t *);
377
378 typedef struct utr_t
379 {
380 UDEV_T *udev;
381 DEV_REQ_T setup;
382 EP_INFO_T *ep;
383 uint8_t *buff;
384 uint8_t bIsTransferDone;
385 uint32_t data_len;
386 uint32_t xfer_len;
387 uint8_t bIsoNewSched;
388 uint16_t iso_sf;
389 uint16_t iso_xlen[IF_PER_UTR];
390 uint8_t * iso_buff[IF_PER_UTR];
391 int iso_status[IF_PER_UTR];
392 int td_cnt;
393 int status;
394 int interval;
395 void *context;
396 FUNC_UTR_T func;
397 struct utr_t *next; /* point to the next UTR of the same endpoint. \hideinitializer */
398 } UTR_T;
399
400
401 /*----------------------------------------------------------------------------------*/
402 /* Global variables */
403 /*----------------------------------------------------------------------------------*/
404 extern USBH_T *_ohci;
405 extern HSUSBH_T *_ehci;
406
407 extern HC_DRV_T ohci_driver;
408 extern HC_DRV_T ehci_driver;
409
410 extern UDEV_T * g_udev_list;
411
412 /*----------------------------------------------------------------------------------*/
413 /* USB stack exported functions */
414 /*----------------------------------------------------------------------------------*/
415 extern void delay_us(int usec);
416
417 extern void dump_ohci_regs(void);
418 extern void dump_ohci_ports(void);
419 extern void dump_ohci_int_table(void);
420 extern void dump_ehci_regs(void);
421 extern void dump_ehci_qtd(qTD_T *qtd);
422 extern void dump_ehci_asynclist(void);
423 extern void dump_ehci_period_frame_list_simple(void);
424 extern void usbh_dump_buff_bytes(uint8_t *buff, int nSize);
425 extern void usbh_dump_interface_descriptor(DESC_IF_T *if_desc);
426 extern void usbh_dump_endpoint_descriptor(DESC_EP_T *ep_desc);
427 extern void usbh_dump_iface(IFACE_T *iface);
428 extern void usbh_dump_ep_info(EP_INFO_T *ep);
429
430 /*
431 * Memory management functions
432 */
433 extern void usbh_memory_init(void);
434 extern uint32_t usbh_memory_used(void);
435 extern void * usbh_alloc_mem(int size);
436 extern void usbh_free_mem(void *p, int size);
437 extern int alloc_dev_address(void);
438 extern void free_dev_address(int dev_addr);
439 extern UDEV_T * alloc_device(void);
440 extern void free_device(UDEV_T *udev);
441 extern UTR_T * alloc_utr(UDEV_T *udev);
442 extern void free_utr(UTR_T *utr);
443 extern ED_T * alloc_ohci_ED(void);
444 extern void free_ohci_ED(ED_T *ed);
445 extern TD_T * alloc_ohci_TD(UTR_T *utr);
446 extern void free_ohci_TD(TD_T *td);
447 extern QH_T * alloc_ehci_QH(void);
448 extern void free_ehci_QH(QH_T *qh);
449 extern qTD_T * alloc_ehci_qTD(UTR_T *utr);
450 extern void free_ehci_qTD(qTD_T *qtd);
451 extern iTD_T * alloc_ehci_iTD(void);
452 extern void free_ehci_iTD(iTD_T *itd);
453 extern siTD_T * alloc_ehci_siTD(void);
454 extern void free_ehci_siTD(siTD_T *sitd);
455
456
457 extern void usbh_hub_init(void);
458 extern int connect_device(UDEV_T *);
459 extern void disconnect_device(UDEV_T *);
460 extern int usbh_register_driver(UDEV_DRV_T *driver);
461 extern EP_INFO_T * usbh_iface_find_ep(IFACE_T *iface, uint8_t ep_addr, uint8_t dir_type);
462 extern int usbh_reset_device(UDEV_T *);
463
464 /*
465 * USB Standard Request functions
466 */
467 extern int usbh_get_device_descriptor(UDEV_T *udev, DESC_DEV_T *desc_buff);
468 extern int usbh_get_config_descriptor(UDEV_T *udev, uint8_t *desc_buff, int buff_len);
469 extern int usbh_set_configuration(UDEV_T *udev, uint8_t conf_val);
470 extern int usbh_set_interface(IFACE_T *iface, uint16_t alt_setting);
471 extern int usbh_clear_halt(UDEV_T *udev, uint16_t ep_addr);
472
473 extern int usbh_ctrl_xfer(UDEV_T *udev, uint8_t bmRequestType, uint8_t bRequest, uint16_t wValue, uint16_t wIndex, uint16_t wLength, uint8_t *buff, uint32_t *xfer_len, uint32_t timeout);
474 extern int usbh_bulk_xfer(UTR_T *utr);
475 extern int usbh_int_xfer(UTR_T *utr);
476 extern int usbh_iso_xfer(UTR_T *utr);
477 extern int usbh_quit_utr(UTR_T *utr);
478 extern int usbh_quit_xfer(UDEV_T *udev, EP_INFO_T *ep);
479
480
482
483 #endif /* _USBH_H_ */
config.h
This header file defines the configuration of USB Host library.
USBH_T
Definition: usbh_reg.h:26
__attribute__
void *__dso_handle __attribute__((weak))
Definition: _syscalls.c:35
usbh_lib.h
USB Host library exported header file.
ehci.h
USB EHCI host controller driver header file.
HSUSBH_T
Definition: hsusbh_reg.h:26
ohci.h
USB OHCI host controller driver header file.