USB Component  Version 5.1
MDK-Professional Middleware for USB Device and Host
 All Data Structures Functions Variables Enumerations Enumerator Groups Pages
rl_usbh.h
1 /*------------------------------------------------------------------------------
2  * MDK Middleware - Component ::USB:Host
3  * Copyright (c) 2004-2013 ARM Germany GmbH. All rights reserved.
4  *------------------------------------------------------------------------------
5  * Name: rl_usbh.h
6  * Purpose: USB Host header file
7  * Rev.: V5.10
8  *----------------------------------------------------------------------------*/
9 
10 #ifndef __RL_USBH_H__
11 #define __RL_USBH_H__
12 
13 #include <stdint.h>
14 #include <stdbool.h>
15 #include "cmsis_os.h"
16 #include "rl_usb.h"
17 #include "usb_def.h"
18 #include "Driver_USBH.h"
19 
20 
21 // ==== USB Host Constants and Defines ====
22 
24 #ifdef __BIG_ENDIAN
25  #define U32_LE(v) (uint32_t)(__rev(v))
26  #define U16_LE(v) (uint16_t)(__rev(v) >> 16)
27  #define U32_BE(v) (uint32_t)(v)
28  #define U16_BE(v) (uint16_t)(v)
29 #else
30  #define U32_BE(v) (uint32_t)(__rev(v))
31  #define U16_BE(v) (uint16_t)(__rev(v) >> 16)
32  #define U32_LE(v) (uint32_t)(v)
33  #define U16_LE(v) (uint16_t)(v)
34 #endif
35 
37 #define PREPARE_SETUP_PACKET(ptr_urb, ptr_data) \
38  ptr_urb->buf = ptr_data; \
39  ptr_urb->len = 8; \
40  ptr_urb->packet_type = USB_PID_SETUP; \
41  ptr_urb->toggle_bit = 0; \
42  ptr_urb->toggle_force = 1;
43 
45 #define PREPARE_SETUP_PACKET_DATA(ptr_sp, dir, typ, rcpnt, req, val, idx, len) \
46  ptr_sp->bmRequestType.Dir = dir; \
47  ptr_sp->bmRequestType.Type = typ; \
48  ptr_sp->bmRequestType.Recipient = rcpnt; \
49  ptr_sp->bRequest = req; \
50  ptr_sp->wValue = U16_LE(val); \
51  ptr_sp->wIndex = U16_LE(idx); \
52  ptr_sp->wLength = U16_LE(len);
53 
55 #define PREPARE_IN_DATA1_PACKET(ptr_urb, ptr_data, data_len) \
56  ptr_urb->buf = ptr_data; \
57  ptr_urb->len = data_len; \
58  ptr_urb->packet_type = USB_PID_IN; \
59  ptr_urb->toggle_bit = 1; \
60  ptr_urb->toggle_force = 1;
61 
63 #define PREPARE_IN_DATAx_PACKET(ptr_urb, ptr_data, data_len) \
64  ptr_urb->buf = ptr_data; \
65  ptr_urb->len = data_len; \
66  ptr_urb->packet_type = USB_PID_IN; \
67  ptr_urb->toggle_force = 0;
68 
70 #define PREPARE_OUT_DATA1_PACKET(ptr_urb, ptr_data, data_len) \
71  ptr_urb->buf = ptr_data; \
72  ptr_urb->len = data_len; \
73  ptr_urb->packet_type = USB_PID_OUT; \
74  ptr_urb->toggle_bit = 1; \
75  ptr_urb->toggle_force = 1;
76 
78 #define PREPARE_OUT_DATAx_PACKET(ptr_urb, ptr_data, data_len) \
79  ptr_urb->buf = ptr_data; \
80  ptr_urb->len = data_len; \
81  ptr_urb->packet_type = USB_PID_OUT; \
82  ptr_urb->toggle_force = 0;
83 
85 #define PREPARE_PING_PACKET(ptr_urb) \
86  ptr_urb->len = 0; \
87  ptr_urb->packet_type = USB_PID_PING; \
88  ptr_urb->toggle_force = 0;
89 
91 #define PREPARE_MSC_CBW(ptr_cbw, sig, tag, len, flg, lun, cb_len, cb0, cb1, cb2, cb3, cb4, cb5, cb6, cb7, cb8, cb9, cb10, cb11, cb12, cb13, cb14, cb15)\
92  ptr_cbw->dSignature = U32_LE(sig); \
93  ptr_cbw->dTag = U32_LE(++tag); \
94  ptr_cbw->dDataLength = len; \
95  ptr_cbw->bmFlags = flg; \
96  ptr_cbw->bLUN = lun; \
97  ptr_cbw->bCBLength = cb_len; \
98  ptr_cbw->CB[0] = cb0; \
99  ptr_cbw->CB[1] = cb1; \
100  ptr_cbw->CB[2] = cb2; \
101  ptr_cbw->CB[3] = cb3; \
102  ptr_cbw->CB[4] = cb4; \
103  ptr_cbw->CB[5] = cb5; \
104  ptr_cbw->CB[6] = cb6; \
105  ptr_cbw->CB[7] = cb7; \
106  ptr_cbw->CB[8] = cb8; \
107  ptr_cbw->CB[9] = cb9; \
108  ptr_cbw->CB[10] = cb10; \
109  ptr_cbw->CB[11] = cb11; \
110  ptr_cbw->CB[12] = cb12; \
111  ptr_cbw->CB[13] = cb13; \
112  ptr_cbw->CB[14] = cb14; \
113  ptr_cbw->CB[15] = cb15;
114 
115 
116 // ==== USB Host Structures ====
117 
118 /* ------------------- Start of section using anonymous unions ------------------ */
119 #if defined(__CC_ARM)
120  #pragma push
121  #pragma anon_unions
122 #elif defined(__ICCARM__)
123  #pragma language=extended
124 #elif defined(__GNUC__)
125  /* anonymous unions are enabled by default */
126 #elif defined(__TMS470__)
127  /* anonymous unions are enabled by default */
128 #elif defined(__TASKING__)
129  #pragma warning 586
130 #else
131  #warning Not supported compiler type
132 #endif
133 
135 typedef struct {
136  ARM_USBH_EP_HANDLE ep_handle;
137  osThreadId thread_id;
138 } USBH_EP_TID_t;
139 
141 typedef struct {
142  uint16_t ep_tid_index;
143  ARM_USBH_EP_HANDLE ep_handle;
144  __packed struct {
145  uint8_t dev_addr : 8;
146  uint8_t dev_speed : 8;
147  uint8_t hub_addr : 8;
148  uint8_t hub_port : 8;
149  };
151  uint8_t bmAttributes;
152  uint16_t wMaxPacketSize;
153  uint8_t bInterval;
154 } USBH_EP;
155 
157 typedef struct _USBH_HC_t {
158  uint16_t max_ep;
159 } const USBH_HC_t;
160 
162 typedef struct _USBH_OHCI_t {
163  uint32_t *ptr_OHCI;
164  uint16_t max_ED;
165  uint16_t max_TD;
166  uint16_t max_ITD;
167  uint32_t *ptr_HCCA;
168  uint32_t *ptr_ED;
169  uint32_t *ptr_TD;
170  uint32_t *ptr_ITD;
171  uint32_t *ptr_TDURB;
172 } const USBH_OHCI_t;
173 
175 typedef struct _USBH_EHCI_t {
176  uint32_t *ptr_EHCI;
177  uint16_t max_qH;
178  uint16_t max_qTD;
179  uint16_t max_iTD;
180  uint16_t max_siTD;
181  uint16_t max_FSTN;
182  uint32_t *ptr_PFL;
183  uint32_t *ptr_qH;
184  uint32_t *ptr_qTD;
185  uint32_t *ptr_iTD;
186  uint32_t *ptr_siTD;
187  uint32_t *ptr_FSTN;
188  uint32_t *ptr_qTDURB;
189 } const USBH_EHCI_t;
190 
192 typedef struct {
193  uint32_t port_con_phy;
194  uint32_t port_con_phy_ex;
195  uint32_t port_con;
196  uint32_t port_state[2];
197  uint32_t port_retry;
198  uint32_t port_oc;
201  uint8_t last_dev_addr;
202  uint32_t dev_addr_mask[4];
204  usbStatus last_error;
205 } USBH_HCI;
206 
208 typedef struct {
209  uint8_t class;
210  uint8_t subclass;
211  uint8_t protocol;
212  uint8_t dev_desc_len;
213  uint8_t cfg_desc_len;
214  uint8_t ctrl;
215  uint8_t port;
216  uint8_t address;
217  uint8_t speed;
218  struct {
219  uint8_t configured : 1;
220  uint8_t initialized : 1;
221  };
222  osThreadId recovery_thread_id;
223  usbStatus last_error;
224 } USBH_DEV;
225 
227 typedef struct {
231  uint8_t do_ping;
232  uint8_t max_lun;
233  uint32_t tag;
234  bool media_ok;
235 } USBH_MSC;
236 
238 typedef struct {
240 //ARM_USBH_URB int_in_urb; ///< interrupt in URB
241 //ARM_USBH_URB int_out_urb; ///< interrupt out URB
244  uint8_t *ptr_int_in_buf;
246  uint16_t report_desc_len;
247  uint8_t report_in_data_buf[8];
250 } USBH_HID;
251 
253 typedef struct {
254  USBH_DEV *ptr_dev;
255 
256 } USBH_CLS;
257 
259 typedef struct {
260  uint8_t ClassID;
261 
262  int8_t (*Configure ) (uint8_t ctrl, uint8_t port, uint8_t speed, int8_t address, USB_CONFIGURATION_DESCRIPTOR *ptr_cfg_desc);
263  usbStatus (*Unconfigure ) (int8_t instance);
264  usbStatus (*Initialize ) (int8_t instance);
265  usbStatus (*Uninitialize) (int8_t instance);
266 } USBH_DCD;
267 
268 /* -------------------- End of section using anonymous unions ------------------- */
269 #if defined(__CC_ARM)
270  #pragma pop
271 #elif defined(__ICCARM__)
272  /* leave anonymous unions enabled */
273 #elif defined(__GNUC__)
274  /* anonymous unions are enabled by default */
275 #elif defined(__TMS470__)
276  /* anonymous unions are enabled by default */
277 #elif defined(__TASKING__)
278  #pragma warning restore
279 #else
280  #warning Not supported compiler type
281 #endif
282 
283 
284 // ==== USB Host Library Functions ====
285 
298 extern ARM_USBH_EP_HANDLE USBH_DriverEndpointCreate (uint8_t ctrl, uint8_t dev_addr, uint8_t dev_speed, uint8_t hub_addr, uint8_t hub_port, uint8_t ep_addr, uint8_t ep_type, uint16_t ep_max_packet_size, uint8_t ep_interval);
299 
313 extern usbStatus USBH_DriverEndpointModify (uint8_t ctrl, ARM_USBH_EP_HANDLE ep_hndl, uint8_t dev_addr, uint8_t dev_speed, uint8_t hub_addr, uint8_t hub_port, uint16_t ep_max_packet_size);
314 
318 extern usbStatus USBH_DriverEndpointDelete (uint8_t ctrl, ARM_USBH_EP_HANDLE ep_hndl);
319 
323 extern usbStatus USBH_DriverEndpointReset (uint8_t ctrl, ARM_USBH_EP_HANDLE ep_hndl);
324 
330 extern usbStatus USBH_SendSetup (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data);
331 
338 extern usbStatus USBH_SendData (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data, uint32_t num);
339 
346 extern usbStatus USBH_ReceiveData (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data, uint32_t num);
347 
352 extern usbStatus USBH_AbortData (uint8_t ctrl, USBH_EP *ptr_ep);
353 
360 extern usbStatus USBH_GetStatus (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t *ptr_stat_dat);
361 
368 extern usbStatus USBH_ClearFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
369 
376 extern usbStatus USBH_SetFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
377 
382 extern usbStatus USBH_SetAddress (uint8_t ctrl, uint8_t device_address);
383 
393 extern usbStatus USBH_GetDescriptor (uint8_t ctrl, uint8_t recipient, uint8_t descriptor_type, uint8_t descriptor_index, uint8_t language_id, uint8_t *descriptor_data, uint16_t descriptor_length);
394 
404 extern usbStatus USBH_SetDescriptor (uint8_t ctrl, uint8_t recipient, uint8_t descriptor_type, uint8_t descriptor_index, uint8_t language_id, uint8_t *descriptor_data, uint16_t descriptor_length);
405 
410 extern usbStatus USBH_GetConfiguration (uint8_t ctrl, uint8_t *ptr_configuration);
411 
416 extern usbStatus USBH_SetConfiguration (uint8_t ctrl, uint8_t configuration);
417 
423 extern usbStatus USBH_GetInterface (uint8_t ctrl, uint8_t index, uint8_t *ptr_alternate);
424 
430 extern usbStatus USBH_SetInterface (uint8_t ctrl, uint8_t index, uint8_t alternate);
431 
437 extern usbStatus USBH_SyncFrame (uint8_t ctrl, uint8_t index, uint8_t *ptr_frame_number);
438 
444 extern usbStatus USBH_MemoryAllocate (uint8_t ctrl, uint8_t **ptr, uint32_t size);
445 
450 extern usbStatus USBH_MemoryFree (uint8_t ctrl, uint8_t *ptr);
451 
456 extern void USBH_HID_ParseReportDescriptor (int8_t instance, uint8_t *ptr_hid_report_desc);
457 
462 extern void USBH_HID_DataReceived (int8_t instance, uint16_t len);
463 
464 #endif