29#if CFG_TUH_ENABLED && (CFG_TUSB_MCU == OPT_MCU_RP2040) && CFG_TUH_RPI_PIO_USB
33#include "pio_usb_ll.h"
43#define RHPORT_OFFSET 1
44#define RHPORT_PIO(_x) ((_x)-RHPORT_OFFSET)
46static pio_usb_configuration_t
pio_host_cfg = PIO_USB_DEFAULT_CONFIG;
51bool hcd_configure(uint8_t rhport, uint32_t cfg_id,
const void *cfg_param) {
69 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
70 pio_usb_host_port_reset_start(pio_rhport);
74 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
75 pio_usb_host_port_reset_end(pio_rhport);
79 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
81 root_port_t *root = PIO_USB_ROOT_PORT(pio_rhport);
82 port_pin_status_t line_state = pio_usb_bus_get_line_state(root);
84 return line_state != PORT_PIN_SE0;
89 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
95 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
96 pio_usb_host_close_device(pio_rhport,
dev_addr);
101 return pio_usb_host_get_frame_number();
121 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
122 return pio_usb_host_endpoint_open(pio_rhport,
dev_addr, (uint8_t
const *) desc_ep,
need_pre);
126 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
127 return pio_usb_host_endpoint_transfer(pio_rhport,
dev_addr, ep_addr,
buffer, buflen);
131 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
132 return pio_usb_host_endpoint_abort_transfer(pio_rhport,
dev_addr, ep_addr);
136 uint8_t
const pio_rhport = RHPORT_PIO(rhport);
137 return pio_usb_host_send_setup(pio_rhport,
dev_addr, setup_packet);
163 volatile uint32_t *ep_reg) {
165 const uint32_t ep_all = *ep_reg;
167 for ( uint8_t ep_idx = 0; ep_idx < PIO_USB_EP_POOL_CNT; ep_idx++ ) {
168 uint32_t
const mask = (1u << ep_idx);
170 if ( ep_all & mask ) {
171 endpoint_t * ep = PIO_USB_ENDPOINT(ep_idx);
177 (*ep_reg) &= ~ep_all;
182 uint8_t
const tu_rhport = root_id + 1;
183 root_port_t *rport = PIO_USB_ROOT_PORT(root_id);
184 uint32_t
const ints = rport->ints;
186 if ( ints & PIO_USB_INTS_ENDPOINT_COMPLETE_BITS ) {
190 if ( ints & PIO_USB_INTS_ENDPOINT_STALLED_BITS ) {
194 if ( ints & PIO_USB_INTS_ENDPOINT_ERROR_BITS ) {
198 if ( ints & PIO_USB_INTS_CONNECT_BITS ) {
202 if ( ints & PIO_USB_INTS_DISCONNECT_BITS ) {
207 rport->ints &= ~ints;
static TU_ATTR_ALWAYS_INLINE void hcd_event_device_remove(uint8_t rhport, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void hcd_event_xfer_complete(uint8_t dev_addr, uint8_t ep_addr, uint32_t xferred_bytes, xfer_result_t result, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void hcd_event_device_attach(uint8_t rhport, bool in_isr)
void hcd_devtree_get_info(uint8_t dev_addr, hcd_devtree_info_t *devtree_info)
bool hcd_setup_send(uint8_t rhport, uint8_t dev_addr, uint8_t const setup_packet[8])
void __no_inline_not_in_flash_func() pio_usb_host_irq_handler(uint8_t root_id)
static void __no_inline_not_in_flash_func() handle_endpoint_irq(root_port_t *rport, xfer_result_t result, volatile uint32_t *ep_reg)
void hcd_int_disable(uint8_t rhport)
bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param)
bool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)
void hcd_int_enable(uint8_t rhport)
bool hcd_edpt_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)
void hcd_device_close(uint8_t rhport, uint8_t dev_addr)
bool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)
void hcd_port_reset_end(uint8_t rhport)
void hcd_port_reset(uint8_t rhport)
bool hcd_port_connect_status(uint8_t rhport)
bool hcd_edpt_open(uint8_t rhport, uint8_t dev_addr, tusb_desc_endpoint_t const *desc_ep)
uint32_t hcd_frame_number(uint8_t rhport)
tusb_speed_t hcd_port_speed_get(uint8_t rhport)
static pio_usb_configuration_t pio_host_cfg
bool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
static TU_ATTR_ALWAYS_INLINE bool need_pre(uint8_t dev_addr)
static void * memcpy(void *dst, const void *src, size_t n)
AUDIO Channel Cluster Descriptor (4.1)
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
@ TUH_CFGID_RPI_PIO_USB_CONFIGURATION