USB Component  Version 5.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-2013 ARM Germany GmbH. All rights reserved.
4  *------------------------------------------------------------------------------
5  * Name: rl_usbh.h
6  * Purpose: USB Host header file
7  * Rev.: V5.04
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 #pragma anon_unions
119 
121 typedef struct {
122  osThreadId thread_id;
123  ARM_USBH_URB urb;
124  ARM_USBH_EP_HANDLE handle;
125  __packed struct {
126  uint8_t address : 8;
127  uint8_t speed : 8;
128  };
129  USB_ENDPOINT_DESCRIPTOR descriptor;
130 } USBH_EP;
131 
133 typedef struct {
134  uint32_t port_con_phy;
135  uint32_t port_con_phy_ex;
136  uint32_t port_con;
137  uint32_t port_act;
138  uint32_t port_oc;
141  uint8_t last_dev_addr;
142  uint32_t dev_addr_mask[4];
144  usbStatus last_error;
145 } USBH_HCI;
146 
148 typedef struct {
149  uint8_t class;
150  uint8_t subclass;
151  uint8_t protocol;
152  uint8_t ctrl;
153  uint8_t port;
154  uint8_t address;
155  uint8_t speed;
156  struct {
157  uint8_t configured : 1;
158  uint8_t initialized : 1;
159  };
160  usbStatus last_error;
161 } USBH_DEV;
162 
164 typedef struct {
168  uint8_t do_ping;
169  uint8_t max_lun;
170  uint32_t tag;
171  bool media_ok;
172 } USBH_MSC;
173 
175 typedef struct {
177  ARM_USBH_URB int_in_urb;
178  ARM_USBH_URB int_out_urb;
181  uint8_t *ptr_int_in_buf;
183  uint16_t report_desc_len;
184  uint8_t report_in_data_buf[8];
187 } USBH_HID;
188 
190 typedef struct {
191  USBH_DEV *ptr_dev;
192 
193 } USBH_CLS;
194 
196 typedef struct {
197  uint32_t ports;
198  uint16_t max_ED;
199  uint16_t max_TD;
200  uint16_t max_ITD;
201  uint32_t *ptr_HCCA;
202  uint32_t *ptr_ED;
203  uint32_t *ptr_TD;
204  uint32_t *ptr_ITD;
205  uint32_t *ptr_TDURB;
206  void (*DelayMs ) (uint32_t ms);
207  void (*RegWr ) (uint32_t reg_ofs, uint32_t val);
208  uint32_t (*RegRd ) (uint32_t reg_ofs);
209  bool (*PinsConfig ) (bool on);
210  bool (*Init ) (bool on);
211  bool (*PortPower ) (uint32_t on);
212  bool (*IrqEn ) (bool on);
213 } USBH_HWD_OHCI;
214 
216 typedef struct {
217  uint32_t ports;
218  uint16_t max_qH;
219  uint16_t max_qTD;
220  uint16_t max_iTD;
221  uint16_t max_siTD;
222  uint16_t max_FSTN;
223  uint32_t *ptr_PFL;
224  uint32_t *ptr_qH;
225  uint32_t *ptr_qTD;
226  uint32_t *ptr_iTD;
227  uint32_t *ptr_siTD;
228  uint32_t *ptr_FSTN;
229  uint32_t *ptr_qTDURB;
230  void (*DelayMs ) (uint32_t ms);
231  void (*RegWr ) (uint32_t reg_ofs, uint32_t val);
232  uint32_t (*RegRd ) (uint32_t reg_ofs);
233  bool (*PinsConfig ) (bool on);
234  bool (*Init ) (bool on);
235  bool (*PortPower ) (uint32_t on);
236  bool (*IrqEn ) (bool on);
237 } USBH_HWD_EHCI;
238 
240 typedef struct {
241  uint8_t ClassID;
242 
243  int8_t (*Configure ) (uint8_t ctrl, uint8_t port, uint8_t speed, int8_t address, USB_CONFIGURATION_DESCRIPTOR *ptr_cfg_desc);
244  usbStatus (*Unconfigure ) (int8_t instance);
245  usbStatus (*Initialize ) (int8_t instance);
246  usbStatus (*Uninitialize) (int8_t instance);
247 } USBH_DCD;
248 
249 #pragma no_anon_unions
250 
251 
252 // ==== USB Host Library Functions ====
253 
258 extern usbStatus USBH_SendSetup (uint8_t ctrl, uint8_t *ptr_data);
259 
265 extern usbStatus USBH_SendData (uint8_t ctrl, uint8_t *ptr_data, uint32_t data_len);
266 
272 extern usbStatus USBH_ReceiveData (uint8_t ctrl, uint8_t *ptr_data, uint32_t data_len);
273 
280 extern usbStatus USBH_GetStatus (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t *ptr_stat_dat);
281 
288 extern usbStatus USBH_ClearFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
289 
296 extern usbStatus USBH_SetFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
297 
302 extern usbStatus USBH_SetAddress (uint8_t ctrl, uint8_t device_address);
303 
313 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);
314 
324 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);
325 
330 extern usbStatus USBH_GetConfiguration (uint8_t ctrl, uint8_t *ptr_configuration);
331 
336 extern usbStatus USBH_SetConfiguration (uint8_t ctrl, uint8_t configuration);
337 
343 extern usbStatus USBH_GetInterface (uint8_t ctrl, uint8_t idx, uint8_t *ptr_alternate);
344 
350 extern usbStatus USBH_SetInterface (uint8_t ctrl, uint8_t index, uint8_t alternate);
351 
357 extern usbStatus USBH_SyncFrame (uint8_t ctrl, uint8_t index, uint8_t *ptr_frame_number);
358 
364 extern usbStatus USBH_MemoryAllocate (uint8_t ctrl, uint8_t **ptr, uint32_t size);
365 
370 extern usbStatus USBH_MemoryFree (uint8_t ctrl, uint8_t *ptr);
371 
377 extern usbStatus USBH_Transfer (uint8_t ctrl, USBH_EP *ptr_ep, uint32_t timeout);
378 
383 extern void USBH_HID_ParseReportDescriptor (int8_t instance, uint8_t *ptr_hid_report_desc);
384 
389 extern void USBH_HID_DataReceived (int8_t instance, uint16_t len);
390 
391 #endif