Open FFBoard
Open source force feedback firmware
usbh.h
Go to the documentation of this file.
1/*
2 * The MIT License (MIT)
3 *
4 * Copyright (c) 2019 Ha Thach (tinyusb.org)
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights
9 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 * copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 * THE SOFTWARE.
23 *
24 * This file is part of the TinyUSB stack.
25 */
26
27#ifndef _TUSB_USBH_H_
28#define _TUSB_USBH_H_
29
30#ifdef __cplusplus
31 extern "C" {
32#endif
33
34#include "common/tusb_common.h"
35
36//--------------------------------------------------------------------+
37// MACRO CONSTANT TYPEDEF
38//--------------------------------------------------------------------+
39
40// forward declaration
41struct tuh_xfer_s;
42typedef struct tuh_xfer_s tuh_xfer_t;
43
44typedef void (*tuh_xfer_cb_t)(tuh_xfer_t* xfer);
45
46// Note1: layout and order of this will be changed in near future
47// it is advised to initialize it using member name
48// Note2: not all field is available/meaningful in callback,
49// some info is not saved by usbh to save SRAM
50struct tuh_xfer_s {
51 uint8_t daddr;
52 uint8_t ep_addr;
53 uint8_t TU_RESERVED; // reserved
55
56 uint32_t actual_len; // excluding setup packet
57
58 union {
59 tusb_control_request_t const* setup; // setup packet pointer if control transfer
60 uint32_t buflen; // expected length if not control transfer (not available in callback)
61 };
62
63 uint8_t* buffer; // not available in callback if not control transfer
65 uintptr_t user_data;
66
67 // uint32_t timeout_ms; // place holder, not supported yet
68};
69
70// Subject to change
71typedef struct {
72 uint8_t daddr;
75
76// ConfigID for tuh_configure()
77enum {
79 TUH_CFGID_RPI_PIO_USB_CONFIGURATION = 100, // cfg_param: pio_usb_configuration_t
81};
82
83typedef struct {
84 uint8_t max_nak; // max NAK per endpoint per frame to save CPU/SPI bus usage
85 uint8_t cpuctl; // R16: CPU Control Register
86 uint8_t pinctl; // R17: Pin Control Register. FDUPSPI bit is ignored
88
89typedef union {
90 // For TUH_CFGID_RPI_PIO_USB_CONFIGURATION use pio_usb_configuration_t
91
94
95//--------------------------------------------------------------------+
96// APPLICATION CALLBACK
97//--------------------------------------------------------------------+
98
99//TU_ATTR_WEAK uint8_t tuh_attach_cb (tusb_desc_device_t const *desc_device);
100
101// Invoked when a device is mounted (configured)
102TU_ATTR_WEAK void tuh_mount_cb (uint8_t daddr);
103
104// Invoked when a device failed to mount during enumeration process
105// TU_ATTR_WEAK void tuh_mount_failed_cb (uint8_t daddr);
106
107// Invoked when a device is unmounted (detached)
108TU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr);
109
110// Invoked when there is a new usb event, which need to be processed by tuh_task()/tuh_task_ext()
111void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr);
112
113//--------------------------------------------------------------------+
114// APPLICATION API
115//--------------------------------------------------------------------+
116
117// Configure host stack behavior with dynamic or port-specific parameters.
118// Should be called before tuh_init()
119// - cfg_id : configure ID (TBD)
120// - cfg_param: configure data, structure depends on the ID
121bool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void* cfg_param);
122
123// New API to replace tuh_init() to init host stack on specific roothub port
124bool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t* rh_init);
125
126// Init host stack
127#if TUSB_VERSION_NUMBER > 2000 // 0.20.0
128TU_ATTR_DEPRECATED("Please use tusb_init(rhport, rh_init) instead")
129#endif
130TU_ATTR_ALWAYS_INLINE static inline bool tuh_init(uint8_t rhport) {
131 const tusb_rhport_init_t rh_init = {
132 .role = TUSB_ROLE_HOST,
133 .speed = TUH_OPT_HIGH_SPEED ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL,
134 };
135 return tuh_rhport_init(rhport, &rh_init);
136}
137
138// Deinit host stack on rhport
139bool tuh_deinit(uint8_t rhport);
140
141// Check if host stack is already initialized with any roothub ports
142// To check if an rhport is initialized, use tuh_rhport_is_active()
143bool tuh_inited(void);
144
145// Task function should be called in main/rtos loop, extended version of tuh_task()
146// - timeout_ms: millisecond to wait, zero = no wait, 0xFFFFFFFF = wait forever
147// - in_isr: if function is called in ISR
148void tuh_task_ext(uint32_t timeout_ms, bool in_isr);
149
150// Task function should be called in main/rtos loop
151TU_ATTR_ALWAYS_INLINE static inline
152void tuh_task(void) {
153 tuh_task_ext(UINT32_MAX, false);
154}
155
156// Check if there is pending events need processing by tuh_task()
157bool tuh_task_event_ready(void);
158
159#ifndef _TUSB_HCD_H_
160extern void hcd_int_handler(uint8_t rhport, bool in_isr);
161#endif
162
163// Interrupt handler alias to HCD with in_isr as optional parameter
164#define _tuh_int_handler_arg0() TU_VERIFY_STATIC(false, "tuh_int_handler() must have 1 or 2 arguments")
165#define _tuh_int_handler_arg1(_rhport) hcd_int_handler(_rhport, true)
166#define _tuh_int_handler_arg2(_rhport, _in_isr) hcd_int_handler(_rhport, _in_isr)
167#define tuh_int_handler(...) TU_FUNC_OPTIONAL_ARG(_tuh_int_handler, __VA_ARGS__)
168
169// Check if roothub port is initialized and active as a host
170bool tuh_rhport_is_active(uint8_t rhport);
171
172// Assert/de-assert Bus Reset signal to roothub port. USB specs: it should last 10-50ms
173bool tuh_rhport_reset_bus(uint8_t rhport, bool active);
174
175//--------------------------------------------------------------------+
176// Device API
177//--------------------------------------------------------------------+
178
179// Get VID/PID of device
180bool tuh_vid_pid_get(uint8_t daddr, uint16_t* vid, uint16_t* pid);
181
182// Get speed of device
184
185// Check if device is connected and configured
186bool tuh_mounted(uint8_t daddr);
187
188// Check if device is suspended
189TU_ATTR_ALWAYS_INLINE static inline
190bool tuh_suspended(uint8_t daddr) {
191 // TODO implement suspend & resume on host
192 (void) daddr;
193 return false;
194}
195
196// Check if device is ready to communicate with
197TU_ATTR_ALWAYS_INLINE static inline
198bool tuh_ready(uint8_t daddr) {
200}
201
202//--------------------------------------------------------------------+
203// Transfer API
204//--------------------------------------------------------------------+
205
206// Submit a control transfer
207// - async: complete callback invoked when finished.
208// - sync : blocking if complete callback is NULL.
210
211// Submit a bulk/interrupt transfer
212// - async: complete callback invoked when finished.
213// - sync : blocking if complete callback is NULL.
215
216// Open a non-control endpoint
217bool tuh_edpt_open(uint8_t daddr, tusb_desc_endpoint_t const * desc_ep);
218
219// Abort a queued transfer. Note: it can only abort transfer that has not been started
220// Return true if a queued transfer is aborted, false if there is no transfer to abort
221bool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr);
222
223// Set Configuration (control transfer)
224// config_num = 0 will un-configure device. Note: config_num = config_descriptor_index + 1
225// true on success, false if there is on-going control transfer or incorrect parameters
226// if complete_cb == NULL i.e blocking, user_data should be pointed to xfer_reuslt_t*
227bool tuh_configuration_set(uint8_t daddr, uint8_t config_num,
229
230// Set Interface (control transfer)
231// true on success, false if there is on-going control transfer or incorrect parameters
232// if complete_cb == NULL i.e blocking, user_data should be pointed to xfer_reuslt_t*
233bool tuh_interface_set(uint8_t daddr, uint8_t itf_num, uint8_t itf_alt,
235
236//--------------------------------------------------------------------+
237// Descriptors Asynchronous (non-blocking)
238//--------------------------------------------------------------------+
239
240// Get an descriptor (control transfer)
241// true on success, false if there is on-going control transfer or incorrect parameters
242bool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index, void* buffer, uint16_t len,
244
245// Get device descriptor (control transfer)
246// true on success, false if there is on-going control transfer or incorrect parameters
247bool tuh_descriptor_get_device(uint8_t daddr, void* buffer, uint16_t len,
249
250// Get configuration descriptor (control transfer)
251// true on success, false if there is on-going control transfer or incorrect parameters
252bool tuh_descriptor_get_configuration(uint8_t daddr, uint8_t index, void* buffer, uint16_t len,
254
255// Get HID report descriptor (control transfer)
256// true on success, false if there is on-going control transfer or incorrect parameters
257bool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void* buffer, uint16_t len,
259
260// Get string descriptor (control transfer)
261// true on success, false if there is on-going control transfer or incorrect parameters
262// Blocking if complete callback is NULL, in this case 'user_data' must contain xfer_result_t variable
263bool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len,
265
266// Get manufacturer string descriptor (control transfer)
267// true on success, false if there is on-going control transfer or incorrect parameters
268bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,
270
271// Get product string descriptor (control transfer)
272// true on success, false if there is on-going control transfer or incorrect parameters
273bool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,
275
276// Get serial string descriptor (control transfer)
277// true on success, false if there is on-going control transfer or incorrect parameters
278bool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len,
280
281//--------------------------------------------------------------------+
282// Descriptors Synchronous (blocking)
283//--------------------------------------------------------------------+
284
285// Sync (blocking) version of tuh_descriptor_get()
286// return transfer result
287uint8_t tuh_descriptor_get_sync(uint8_t daddr, uint8_t type, uint8_t index, void* buffer, uint16_t len);
288
289// Sync (blocking) version of tuh_descriptor_get_device()
290// return transfer result
291uint8_t tuh_descriptor_get_device_sync(uint8_t daddr, void* buffer, uint16_t len);
292
293// Sync (blocking) version of tuh_descriptor_get_configuration()
294// return transfer result
295uint8_t tuh_descriptor_get_configuration_sync(uint8_t daddr, uint8_t index, void* buffer, uint16_t len);
296
297// Sync (blocking) version of tuh_descriptor_get_hid_report()
298// return transfer result
299uint8_t tuh_descriptor_get_hid_report_sync(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void* buffer, uint16_t len);
300
301// Sync (blocking) version of tuh_descriptor_get_string()
302// return transfer result
303uint8_t tuh_descriptor_get_string_sync(uint8_t daddr, uint8_t index, uint16_t language_id, void* buffer, uint16_t len);
304
305// Sync (blocking) version of tuh_descriptor_get_manufacturer_string()
306// return transfer result
307uint8_t tuh_descriptor_get_manufacturer_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len);
308
309// Sync (blocking) version of tuh_descriptor_get_product_string()
310// return transfer result
311uint8_t tuh_descriptor_get_product_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len);
312
313// Sync (blocking) version of tuh_descriptor_get_serial_string()
314// return transfer result
315uint8_t tuh_descriptor_get_serial_string_sync(uint8_t daddr, uint16_t language_id, void* buffer, uint16_t len);
316
317#ifdef __cplusplus
318 }
319#endif
320
321#endif
static bool in_isr
xfer_td_t xfer[EP_CBI_COUNT+1][2]
Definition: dcd_nrf5x.c:119
uint8_t const * buffer
Definition: midi_device.h:100
AUDIO Channel Cluster Descriptor (4.1)
Definition: audio.h:647
tusb_desc_interface_t desc
Definition: usbh.h:73
uint8_t daddr
Definition: usbh.h:72
xfer_result_t result
Definition: usbh.h:54
uint32_t actual_len
Definition: usbh.h:56
tusb_control_request_t const * setup
Definition: usbh.h:59
uint8_t daddr
Definition: usbh.h:51
uint8_t ep_addr
Definition: usbh.h:52
tuh_xfer_cb_t complete_cb
Definition: usbh.h:64
uint8_t * buffer
Definition: usbh.h:63
uint8_t TU_RESERVED
Definition: usbh.h:53
uintptr_t user_data
Definition: usbh.h:65
uint32_t buflen
Definition: usbh.h:60
tusb_role_t role
Definition: tusb_types.h:281
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
Definition: tusb_types.h:49
@ TUSB_SPEED_FULL
Definition: tusb_types.h:50
@ TUSB_SPEED_HIGH
Definition: tusb_types.h:52
xfer_result_t
Definition: tusb_types.h:236
tuh_configure_max3421_t max3421
Definition: usbh.h:92
uint8_t daddr
Definition: usbh.c:264
uintptr_t user_data
Definition: usbh.c:262
tuh_xfer_cb_t complete_cb
Definition: usbh.c:261
bool tuh_vid_pid_get(uint8_t daddr, uint16_t *vid, uint16_t *pid)
Definition: usbh.c:297
bool tuh_descriptor_get_manufacturer_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1038
uint8_t tuh_descriptor_get_device_sync(uint8_t daddr, void *buffer, uint16_t len)
Definition: usbh.c:1156
bool tuh_edpt_xfer(tuh_xfer_t *xfer)
Definition: usbh.c:765
void tuh_task_ext(uint32_t timeout_ms, bool in_isr)
Definition: usbh.c:465
bool tuh_descriptor_get_device(uint8_t daddr, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1019
tusb_speed_t tuh_speed_get(uint8_t daddr)
Definition: usbh.c:309
uint8_t tuh_descriptor_get_serial_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
Definition: usbh.c:1185
bool tuh_task_event_ready(void)
Definition: usbh.c:440
bool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1014
bool tuh_rhport_is_active(uint8_t rhport)
Definition: usbh.c:314
bool tuh_descriptor_get_configuration(uint8_t daddr, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1025
static TU_ATTR_ALWAYS_INLINE bool tuh_suspended(uint8_t daddr)
Definition: usbh.h:190
bool tuh_configuration_set(uint8_t daddr, uint8_t config_num, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1090
static TU_ATTR_ALWAYS_INLINE void tuh_task(void)
Definition: usbh.h:152
bool tuh_descriptor_get_string(uint8_t daddr, uint8_t index, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1032
bool tuh_interface_set(uint8_t daddr, uint8_t itf_num, uint8_t itf_alt, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1116
TU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr)
void(* tuh_xfer_cb_t)(tuh_xfer_t *xfer)
Definition: usbh.h:44
uint8_t tuh_descriptor_get_product_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
Definition: usbh.c:1180
bool tuh_descriptor_get_product_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1047
uint8_t tuh_descriptor_get_string_sync(uint8_t daddr, uint8_t index, uint16_t language_id, void *buffer, uint16_t len)
Definition: usbh.c:1170
bool tuh_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param)
Definition: usbh.c:332
bool tuh_inited(void)
Definition: usbh.c:342
bool tuh_control_xfer(tuh_xfer_t *xfer)
Definition: usbh.c:602
uint8_t tuh_descriptor_get_manufacturer_string_sync(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len)
Definition: usbh.c:1175
bool tuh_rhport_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
Definition: usbh.c:346
bool tuh_deinit(uint8_t rhport)
Definition: usbh.c:405
bool tuh_mounted(uint8_t daddr)
Definition: usbh.c:291
void tuh_event_hook_cb(uint8_t rhport, uint32_t eventid, bool in_isr)
Definition: usbh.c:62
bool tuh_rhport_reset_bus(uint8_t rhport, bool active)
Definition: usbh.c:318
TU_ATTR_DEPRECATED("Please use tusb_init(rhport, rh_init) instead") TU_ATTR_ALWAYS_INLINE static inline bool tuh_init(uint8_t rhport)
Definition: usbh.h:128
uint8_t tuh_descriptor_get_sync(uint8_t daddr, uint8_t type, uint8_t index, void *buffer, uint16_t len)
Definition: usbh.c:1151
uint8_t tuh_descriptor_get_configuration_sync(uint8_t daddr, uint8_t index, void *buffer, uint16_t len)
Definition: usbh.c:1160
void hcd_int_handler(uint8_t rhport, bool in_isr)
Definition: hcd_max3421.c:1002
TU_ATTR_WEAK void tuh_mount_cb(uint8_t daddr)
uint8_t tuh_descriptor_get_hid_report_sync(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void *buffer, uint16_t len)
Definition: usbh.c:1165
bool tuh_descriptor_get_hid_report(uint8_t daddr, uint8_t itf_num, uint8_t desc_type, uint8_t index, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1064
@ TUH_CFGID_INVALID
Definition: usbh.h:78
@ TUH_CFGID_RPI_PIO_USB_CONFIGURATION
Definition: usbh.h:79
@ TUH_CFGID_MAX3421
Definition: usbh.h:80
bool tuh_descriptor_get_serial_string(uint8_t daddr, uint16_t language_id, void *buffer, uint16_t len, tuh_xfer_cb_t complete_cb, uintptr_t user_data)
Definition: usbh.c:1055
static TU_ATTR_ALWAYS_INLINE bool tuh_ready(uint8_t daddr)
Definition: usbh.h:198
bool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr)
Definition: usbh.c:781
bool tuh_edpt_open(uint8_t daddr, tusb_desc_endpoint_t const *desc_ep)
Definition: usbh.c:930