18 #include "Driver_USBH.h"
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)
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)
37 #define PREPARE_SETUP_PACKET(ptr_urb, ptr_data) \
38 ptr_urb->buf = ptr_data; \
40 ptr_urb->packet_type = USB_PID_SETUP; \
41 ptr_urb->toggle_bit = 0; \
42 ptr_urb->toggle_force = 1;
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);
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;
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;
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;
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;
85 #define PREPARE_PING_PACKET(ptr_urb) \
87 ptr_urb->packet_type = USB_PID_PING; \
88 ptr_urb->toggle_force = 0;
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;
142 uint32_t dev_addr_mask[4];
157 uint8_t configured : 1;
158 uint8_t initialized : 1;
184 uint8_t report_in_data_buf[8];
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);
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);
243 int8_t (*Configure ) (uint8_t ctrl, uint8_t port, uint8_t speed, int8_t address, USB_CONFIGURATION_DESCRIPTOR *ptr_cfg_desc);
249 #pragma no_anon_unions
258 extern usbStatus
USBH_SendSetup (uint8_t ctrl, uint8_t *ptr_data);
265 extern usbStatus
USBH_SendData (uint8_t ctrl, uint8_t *ptr_data, uint32_t data_len);
272 extern usbStatus
USBH_ReceiveData (uint8_t ctrl, uint8_t *ptr_data, uint32_t data_len);
280 extern usbStatus
USBH_GetStatus (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t *ptr_stat_dat);
288 extern usbStatus
USBH_ClearFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
296 extern usbStatus
USBH_SetFeature (uint8_t ctrl, uint8_t recipient, uint8_t index, uint8_t feature_selector);
302 extern usbStatus
USBH_SetAddress (uint8_t ctrl, uint8_t device_address);
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);
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);
343 extern usbStatus
USBH_GetInterface (uint8_t ctrl, uint8_t idx, uint8_t *ptr_alternate);
350 extern usbStatus
USBH_SetInterface (uint8_t ctrl, uint8_t index, uint8_t alternate);
357 extern usbStatus
USBH_SyncFrame (uint8_t ctrl, uint8_t index, uint8_t *ptr_frame_number);
383 extern void USBH_HID_ParseReportDescriptor (int8_t instance, uint8_t *ptr_hid_report_desc);