USB Component  Version 6.0
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-2014 ARM Germany GmbH. All rights reserved.
4  *------------------------------------------------------------------------------
5  * Name: rl_usbh.h
6  * Purpose: USB Host header file
7  * Rev.: V6.00
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 ep_thread_id;
138 } USBH_EP_TID_t;
139 
141 typedef struct {
142  ARM_USBH_EP_HANDLE ep_handle;
143  struct {
144  uint8_t dev_addr : 8;
145  uint8_t dev_speed : 8;
146  uint8_t hub_addr : 8;
147  uint8_t hub_port : 8;
148  };
150  uint8_t bmAttributes;
151  uint16_t wMaxPacketSize;
152  uint8_t bInterval;
153 } USBH_EP;
154 
156 typedef struct _USBH_HC_t {
157  uint16_t max_ep;
158 } const USBH_HC_t;
159 
161 typedef struct _USBH_OHCI_t {
162  uint32_t *ptr_OHCI;
163  uint16_t max_ED;
164  uint16_t max_TD;
165  uint16_t max_ITD;
166  uint32_t *ptr_HCCA;
167  uint32_t *ptr_ED;
168  uint32_t *ptr_TD;
169  uint32_t *ptr_ITD;
170 } const USBH_OHCI_t;
171 
173 typedef struct _USBH_EHCI_t {
174  uint32_t *ptr_EHCI;
175  uint16_t max_qH;
176  uint16_t max_qTD;
177  uint16_t max_iTD;
178  uint16_t max_siTD;
179  uint16_t max_FSTN;
180  uint32_t *ptr_PFL;
181  uint32_t *ptr_qH;
182  uint32_t *ptr_qTD;
183  uint32_t *ptr_iTD;
184  uint32_t *ptr_siTD;
185  uint32_t *ptr_FSTN;
186 } const USBH_EHCI_t;
187 
189 typedef struct {
190  uint16_t port_con_phy;
191  uint16_t port_con_phy_ex;
192  uint16_t port_con;
193  uint16_t port_oc;
194  uint32_t port_state[2];
195  uint32_t port_retry;
198  uint8_t last_dev_addr;
199  uint32_t dev_addr_mask[4];
201 } USBH_HCI;
202 
204 typedef struct {
205  uint8_t class_custom;
206  uint8_t class_instance;
207  uint8_t class;
208  uint8_t subclass;
209  uint8_t protocol;
210  uint8_t dev_desc_len;
211  uint8_t cfg_desc_len;
212  uint8_t ctrl;
213  struct {
214  uint8_t dev_addr : 8;
215  uint8_t dev_speed : 8;
216  uint8_t hub_addr : 8;
217  uint8_t hub_port : 8;
218  };
219  struct {
220  uint8_t configured : 1;
221  uint8_t initialized : 1;
222  };
223  osThreadId recovery_thread_id;
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 {
242  uint8_t *ptr_int_in_buf;
244  uint16_t report_desc_len;
246  uint8_t keyboard_in_data_buf[8];
247  uint8_t keyboard_in_data_buf_ex[8];
250 } USBH_HID;
251 
253 extern const uint8_t usbh_cls_num;
254 
255 /* -------------------- End of section using anonymous unions ------------------- */
256 #if defined(__CC_ARM)
257  #pragma pop
258 #elif defined(__ICCARM__)
259  /* leave anonymous unions enabled */
260 #elif defined(__GNUC__)
261  /* anonymous unions are enabled by default */
262 #elif defined(__TMS470__)
263  /* anonymous unions are enabled by default */
264 #elif defined(__TASKING__)
265  #pragma warning restore
266 #else
267  #warning Not supported compiler type
268 #endif
269 
270 
271 // ==== USB Host Library Functions ====
272 
285 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);
286 
300 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);
301 
305 extern usbStatus USBH_DriverEndpointDelete (uint8_t ctrl, ARM_USBH_EP_HANDLE ep_hndl);
306 
310 extern usbStatus USBH_DriverEndpointReset (uint8_t ctrl, ARM_USBH_EP_HANDLE ep_hndl);
311 
317 extern usbStatus USBH_SendSetup (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data);
318 
325 extern usbStatus USBH_SendData (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data, uint32_t num);
326 
333 extern usbStatus USBH_ReceiveData (uint8_t ctrl, USBH_EP *ptr_ep, uint8_t *data, uint32_t num);
334 
339 extern usbStatus USBH_AbortData (uint8_t ctrl, USBH_EP *ptr_ep);
340 
345 extern usbStatus USBH_EP0_SendSetup (uint8_t ctrl, uint8_t *data);
346 
352 extern usbStatus USBH_EP0_SendData (uint8_t ctrl, uint8_t *data, uint32_t num);
353 
359 extern usbStatus USBH_EP0_ReceiveData (uint8_t ctrl, uint8_t *data, uint32_t num);
360 
364 extern usbStatus USBH_EP0_AbortData (uint8_t ctrl);
365 
372 extern usbStatus USBH_GetStatus (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t *ptr_stat_dat);
373 
380 extern usbStatus USBH_ClearFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
381 
388 extern usbStatus USBH_SetFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
389 
394 extern usbStatus USBH_SetAddress (uint8_t ctrl, uint8_t device_address);
395 
405 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);
406 
416 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);
417 
422 extern usbStatus USBH_GetConfiguration (uint8_t ctrl, uint8_t *ptr_configuration);
423 
428 extern usbStatus USBH_SetConfiguration (uint8_t ctrl, uint8_t configuration);
429 
435 extern usbStatus USBH_GetInterface (uint8_t ctrl, uint8_t index, uint8_t *ptr_alternate);
436 
442 extern usbStatus USBH_SetInterface (uint8_t ctrl, uint8_t index, uint8_t alternate);
443 
449 extern usbStatus USBH_SyncFrame (uint8_t ctrl, uint8_t index, uint8_t *ptr_frame_number);
450 
456 extern usbStatus USBH_MemoryAllocate (uint8_t ctrl, uint8_t **ptr, uint32_t size);
457 
462 extern usbStatus USBH_MemoryFree (uint8_t ctrl, uint8_t *ptr);
463 
468 extern void USBH_HID_ParseReportDescriptor (int8_t instance, uint8_t *ptr_hid_report_desc);
469 
474 extern void USBH_HID_DataReceived (int8_t instance, uint16_t len);
475 
482 extern int8_t USBH_CustomClass_Configure (USBH_DEV *ptr_dev, USB_CONFIGURATION_DESCRIPTOR *ptr_cfg_desc);
483 
488 extern usbStatus USBH_CustomClass_Unconfigure (int8_t instance);
489 
494 extern usbStatus USBH_CustomClass_Initialize (int8_t instance);
495 
500 extern usbStatus USBH_CustomClass_Uninitialize (int8_t instance);
501 
502 #endif