summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorhathach <[email protected]>2023-09-07 12:38:18 +0700
committerhathach <[email protected]>2023-09-07 12:38:18 +0700
commit21ab40bab2e2fee28fa595f648a17944696c3d65 (patch)
treeb91f251872cb3e4cd928fba4e586d821f3aa7718 /src
parent1b9108ea0dc237835e801d26cc7eef052acad987 (diff)
- wrap up hcd max3421, work well with nrf52840
- also add usbh_defer_func()
Diffstat (limited to 'src')
-rw-r--r--src/host/usbh.c26
-rw-r--r--src/host/usbh_pvt.h10
-rw-r--r--src/portable/analog/max3421/hcd_max3421.c36
3 files changed, 22 insertions, 50 deletions
diff --git a/src/host/usbh.c b/src/host/usbh.c
index e60e680c2..e332f35cc 100644
--- a/src/host/usbh.c
+++ b/src/host/usbh.c
@@ -753,29 +753,33 @@ bool tuh_edpt_abort_xfer(uint8_t daddr, uint8_t ep_addr) {
// USBH API For Class Driver
//--------------------------------------------------------------------+
-uint8_t usbh_get_rhport(uint8_t dev_addr)
-{
- usbh_device_t* dev = get_device(dev_addr);
+uint8_t usbh_get_rhport(uint8_t dev_addr) {
+ usbh_device_t *dev = get_device(dev_addr);
return dev ? dev->rhport : _dev0.rhport;
}
-uint8_t* usbh_get_enum_buf(void)
-{
+uint8_t *usbh_get_enum_buf(void) {
return _usbh_ctrl_buf;
}
-void usbh_int_set(bool enabled)
-{
+void usbh_int_set(bool enabled) {
// TODO all host controller if multiple are used since they shared the same event queue
- if (enabled)
- {
+ if (enabled) {
hcd_int_enable(_usbh_controller);
- }else
- {
+ } else {
hcd_int_disable(_usbh_controller);
}
}
+void usbh_defer_func(osal_task_func_t func, void *param, bool in_isr) {
+ hcd_event_t event = { 0 };
+ event.event_id = USBH_EVENT_FUNC_CALL;
+ event.func_call.func = func;
+ event.func_call.param = param;
+
+ osal_queue_send(_usbh_q, &event, in_isr);
+}
+
//--------------------------------------------------------------------+
// Endpoint API
//--------------------------------------------------------------------+
diff --git a/src/host/usbh_pvt.h b/src/host/usbh_pvt.h
index 0b58a91bc..2b61a77db 100644
--- a/src/host/usbh_pvt.h
+++ b/src/host/usbh_pvt.h
@@ -24,8 +24,8 @@
* This file is part of the TinyUSB stack.
*/
-#ifndef _TUSB_USBH_CLASSDRIVER_H_
-#define _TUSB_USBH_CLASSDRIVER_H_
+#ifndef _TUSB_USBH_PVT_H_
+#define _TUSB_USBH_PVT_H_
#include "osal/osal.h"
#include "common/tusb_fifo.h"
@@ -76,6 +76,8 @@ uint8_t* usbh_get_enum_buf(void);
void usbh_int_set(bool enabled);
+void usbh_defer_func(osal_task_func_t func, void *param, bool in_isr);
+
//--------------------------------------------------------------------+
// USBH Endpoint API
//--------------------------------------------------------------------+
@@ -85,12 +87,10 @@ bool usbh_edpt_xfer_with_callback(uint8_t dev_addr, uint8_t ep_addr, uint8_t * b
tuh_xfer_cb_t complete_cb, uintptr_t user_data);
TU_ATTR_ALWAYS_INLINE
-static inline bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes)
-{
+static inline bool usbh_edpt_xfer(uint8_t dev_addr, uint8_t ep_addr, uint8_t * buffer, uint16_t total_bytes) {
return usbh_edpt_xfer_with_callback(dev_addr, ep_addr, buffer, total_bytes, NULL, 0);
}
-
// Claim an endpoint before submitting a transfer.
// If caller does not make any transfer, it must release endpoint for others.
bool usbh_edpt_claim(uint8_t dev_addr, uint8_t ep_addr);
diff --git a/src/portable/analog/max3421/hcd_max3421.c b/src/portable/analog/max3421/hcd_max3421.c
index c61389cb9..95cf5516e 100644
--- a/src/portable/analog/max3421/hcd_max3421.c
+++ b/src/portable/analog/max3421/hcd_max3421.c
@@ -194,7 +194,6 @@ typedef struct {
uint8_t hxfr;
atomic_flag busy; // busy transferring
- volatile uint8_t intr_disable_count;
volatile uint16_t frame_count;
max3421_ep_t ep[CFG_TUH_MAX3421_ENDPOINT_TOTAL]; // [0] is reserved for addr0
@@ -241,14 +240,6 @@ static void max3421_spi_unlock(uint8_t rhport, bool in_isr) {
if (!in_isr) {
tuh_max3421e_int_api(rhport, true);
(void) osal_mutex_unlock(_hcd_data.spi_mutex);
-
- // when re-enable interrupt, we may miss INTR edge (usually via GPIO detection interrupt).
- // It would be ok if we are operating since SOF will re-trigger interrupt.
- // However, for CONDET_IRQ i.e host not operating therefore we need to manually handle it here.
- if (_hcd_data.hirq & HIRQ_CONDET_IRQ) {
- handle_connect_irq(rhport, false);
- hirq_write(rhport, HIRQ_CONDET_IRQ, false);
- }
}
}
@@ -470,28 +461,13 @@ bool hcd_init(uint8_t rhport) {
// Enable USB interrupt
// Not actually enable GPIO interrupt, just set variable to prevent handler to process
void hcd_int_enable (uint8_t rhport) {
-// tuh_max3421e_int_api(rhport, true);
-
- (void) rhport;
- if (_hcd_data.intr_disable_count) {
- _hcd_data.intr_disable_count--;
- }
-
- // when re-enable interrupt, we may miss INTR edge (usually via GPIO detection interrupt).
- // It would be ok if we are operating since SOF will re-trigger interrupt.
- // However, for CONDET_IRQ i.e host not operating therefore we need to manually handle it here.
-// if (_hcd_data.hirq & HIRQ_CONDET_IRQ) {
-// handle_connect_irq(rhport, false);
-// hirq_write(rhport, HIRQ_CONDET_IRQ, false);
-// }
+ tuh_max3421e_int_api(rhport, true);
}
// Disable USB interrupt
// Not actually disable GPIO interrupt, just set variable to prevent handler to process
void hcd_int_disable(uint8_t rhport) {
- //tuh_max3421e_int_api(rhport, false);
- (void) rhport;
- _hcd_data.intr_disable_count++;
+ tuh_max3421e_int_api(rhport, false);
}
// Get frame number (1ms)
@@ -896,14 +872,6 @@ void hcd_int_handler(uint8_t rhport) {
_hcd_data.frame_count++;
}
- // interrupt is disabled by usbh task: only ack FRAME IRQ and skip the rest
- if (_hcd_data.intr_disable_count) {
- if (hirq & HIRQ_FRAME_IRQ) {
- hirq_write(rhport, HIRQ_FRAME_IRQ, true);
- }
- return;
- }
-
if (hirq & HIRQ_CONDET_IRQ) {
handle_connect_irq(rhport, true);
}