29#if CFG_TUH_ENABLED && defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421
238#if OSAL_MUTEX_REQUIRED
281#define reg_read tuh_max3421_reg_read
282#define reg_write tuh_max3421_reg_write
307 uint8_t tx_buf[2] = {reg, 0};
308 uint8_t rx_buf[2] = {0, 0};
315 return ret ? rx_buf[1] : 0;
320 uint8_t rx_buf[2] = {0, 0};
414 uint8_t
const is_out = 1-ep_dir;
415 for(
size_t i=1; i<CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {
432 if (
daddr == 0 && ep_num == 0) {
441 for (
size_t i=1; i<CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {
451 uint8_t
const state = ep->state;
460 size_t const idx = (size_t) (cur_ep -
_hcd_data.
ep);
463 for (
size_t i = idx + 1; i < CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {
471 for (
size_t i = 0; i <= idx; i++) {
509#if OSAL_MUTEX_REQUIRED
520 uint8_t
const revision = reg_read(rhport,
REVISION_ADDR,
false);
521 TU_LOG2_HEX(revision);
522 TU_ASSERT(revision == 0x01 || revision == 0x12 || revision == 0x13,
false);
561 #if OSAL_MUTEX_REQUIRED
632 if (
daddr == 0 && ep_num == 0) {
735 uint8_t
const ep_dir = (uint8_t)
tu_edpt_dir(ep_addr);
761 uint8_t
const ep_dir = (uint8_t)
tu_edpt_dir(ep_addr);
783 ep->
buf = (uint8_t*)(uintptr_t) setup_packet;
837 TU_LOG3(
"Low speed\r\n");
839 TU_LOG3(
"Full speed\r\n");
845 uint8_t
const daddr = 1;
908 }
else if (next_ep) {
930 TU_LOG3(
"HRSL: %02X\r\n", hrsl);
965 }
else if (hxfr_type &
HXFR_HS) {
982#if CFG_TUSB_DEBUG >= 3
998 #define print_hirq(hirq)
1012 for (
size_t i = 0; i < CFG_TUH_MAX3421_ENDPOINT_TOTAL; i++) {
1017 if (ep_retry == NULL) {
1024 if (ep_retry != NULL && !atomic_flag_test_and_set(&
_hcd_data.
busy)) {
1039 uint8_t xact_len = 0;
1047 ep->
buf += xact_len;
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)
struct TU_ATTR_PACKED hxfr_bm_t
static void xact_in(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void hxfr_write(uint8_t rhport, uint8_t data, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void hien_write(uint8_t rhport, uint8_t data, bool in_isr)
void tuh_max3421_spi_cs_api(uint8_t rhport, bool active)
static TU_ATTR_ALWAYS_INLINE void peraddr_write(uint8_t rhport, uint8_t data, bool in_isr)
void hcd_int_disable(uint8_t rhport)
bool hcd_configure(uint8_t rhport, uint32_t cfg_id, const void *cfg_param)
void tuh_max3421_int_api(uint8_t rhport, bool enabled)
static max3421_data_t _hcd_data
bool tuh_max3421_reg_write(uint8_t rhport, uint8_t reg, uint8_t data, bool in_isr)
bool hcd_edpt_abort_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr)
static TU_ATTR_ALWAYS_INLINE void hwfifo_send(uint8_t rhport, const uint8_t *buffer, uint8_t len, bool in_isr)
static max3421_ep_t * find_ep_not_addr0(uint8_t daddr, uint8_t ep_num, uint8_t ep_dir)
bool hcd_edpt_open(uint8_t rhport, uint8_t daddr, tusb_desc_endpoint_t const *ep_desc)
static void max3421_spi_lock(uint8_t rhport, bool in_isr)
static TU_ATTR_ALWAYS_INLINE void hwfifo_setup(uint8_t rhport, const uint8_t *buffer, bool in_isr)
static void max3421_spi_unlock(uint8_t rhport, bool in_isr)
static TU_ATTR_ALWAYS_INLINE max3421_ep_t * find_opened_ep(uint8_t daddr, uint8_t ep_num, uint8_t ep_dir)
static TU_ATTR_ALWAYS_INLINE bool is_ep_pending(max3421_ep_t const *ep)
bool hcd_edpt_clear_stall(uint8_t rhport, uint8_t dev_addr, uint8_t ep_addr)
bool hcd_deinit(uint8_t rhport)
void hcd_int_enable(uint8_t rhport)
bool tuh_max3421_spi_xfer_api(uint8_t rhport, uint8_t const *tx_buf, uint8_t *rx_buf, size_t xfer_bytes)
void hcd_device_close(uint8_t rhport, uint8_t dev_addr)
static void handle_xfer_done(uint8_t rhport, bool in_isr)
static void xact_out(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr)
void hcd_port_reset_end(uint8_t rhport)
static void hwfifo_write(uint8_t rhport, uint8_t reg, const uint8_t *buffer, uint8_t len, bool in_isr)
bool hcd_setup_send(uint8_t rhport, uint8_t daddr, uint8_t const setup_packet[8])
static TU_ATTR_ALWAYS_INLINE void hirq_write(uint8_t rhport, uint8_t data, bool in_isr)
static void xact_setup(uint8_t rhport, max3421_ep_t *ep, bool in_isr)
void hcd_port_reset(uint8_t rhport)
bool hcd_port_connect_status(uint8_t rhport)
static TU_ATTR_ALWAYS_INLINE void mode_write(uint8_t rhport, uint8_t data, bool in_isr)
TU_VERIFY_STATIC(sizeof(hxfr_bm_t)==1, "size is not correct")
uint32_t hcd_frame_number(uint8_t rhport)
uint8_t tuh_max3421_reg_read(uint8_t rhport, uint8_t reg, bool in_isr)
tusb_speed_t hcd_port_speed_get(uint8_t rhport)
bool hcd_edpt_xfer(uint8_t rhport, uint8_t daddr, uint8_t ep_addr, uint8_t *buffer, uint16_t buflen)
static void xfer_complete_isr(uint8_t rhport, max3421_ep_t *ep, xfer_result_t result, uint8_t hrsl, bool in_isr)
void hcd_int_handler(uint8_t rhport, bool in_isr)
static void free_ep(uint8_t daddr)
void print_hirq(uint8_t hirq)
bool hcd_init(uint8_t rhport, const tusb_rhport_init_t *rh_init)
static max3421_ep_t * find_next_pending_ep(max3421_ep_t *cur_ep)
static TU_ATTR_ALWAYS_INLINE max3421_ep_t * allocate_ep(void)
static TU_ATTR_ALWAYS_INLINE void sndbc_write(uint8_t rhport, uint8_t data, bool in_isr)
static void xact_generic(uint8_t rhport, max3421_ep_t *ep, bool switch_ep, bool in_isr)
static tuh_configure_max3421_t _tuh_cfg
static void handle_connect_irq(uint8_t rhport, bool in_isr)
static void hwfifo_receive(uint8_t rhport, uint8_t *buffer, uint16_t len, bool in_isr)
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_lock(osal_mutex_t mutex_hdl, uint32_t msec)
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_unlock(osal_mutex_t mutex_hdl)
static TU_ATTR_ALWAYS_INLINE bool osal_mutex_delete(osal_mutex_t mutex_hdl)
SemaphoreHandle_t osal_mutex_t
static TU_ATTR_ALWAYS_INLINE osal_mutex_t osal_mutex_create(osal_mutex_def_t *mdef)
AUDIO Channel Cluster Descriptor (4.1)
uint8_t bmAttributes
See: audio_clock_source_attribute_t.
max3421_ep_t ep[CFG_TUH_MAX3421_ENDPOINT_TOTAL]
OSAL_MUTEX_DEF(spi_mutexdef)
volatile uint16_t frame_count
struct max3421_data_t::@148 sndfifo_owner
static TU_ATTR_ALWAYS_INLINE uint16_t tu_min16(uint16_t x, uint16_t y)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_min8(uint8_t x, uint8_t y)
tusb_speed_t
defined base on EHCI specs value for Endpoint Speed
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_number(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint16_t tu_edpt_packet_size(tusb_desc_endpoint_t const *desc_ep)
TU_ATTR_PACKED_END TU_ATTR_BIT_FIELD_ORDER_END static TU_ATTR_ALWAYS_INLINE tusb_dir_t tu_edpt_dir(uint8_t addr)
static TU_ATTR_ALWAYS_INLINE uint8_t tu_edpt_addr(uint8_t num, uint8_t dir)