Skip to content

Commit af1451b

Browse files
authored
Merge pull request #219 from adafruit/rp2040-enhance-irq-task-runner
Rp2040 enhance irq task runner
2 parents 35016f8 + 69fb16d commit af1451b

File tree

3 files changed

+15
-38
lines changed

3 files changed

+15
-38
lines changed

src/arduino/ports/rp2040/Adafruit_TinyUSB_rp2040.cpp

Lines changed: 12 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -40,9 +40,6 @@ extern "C" {
4040
#include "arduino/Adafruit_TinyUSB_API.h"
4141
#include "tusb.h"
4242

43-
// USB processing will be a periodic timer task
44-
#define USB_TASK_INTERVAL 1000
45-
4643
// SDK >= 1.4.0 need to dynamically request the IRQ to avoid conflicts
4744
#if (PICO_SDK_VERSION_MAJOR * 100 + PICO_SDK_VERSION_MINOR) < 104
4845
#define USB_TASK_IRQ 31
@@ -63,34 +60,15 @@ static unsigned int USB_TASK_IRQ;
6360
// mbed use old pico-sdk does not have unique_id
6461
#ifdef ARDUINO_ARCH_MBED
6562

66-
#include "mbed.h"
67-
static mbed::Ticker _usb_ticker;
68-
6963
#define get_unique_id(_serial) flash_get_unique_id(_serial)
7064

71-
static void ticker_task(void) { irq_set_pending(USB_TASK_IRQ); }
72-
73-
static void setup_periodic_usb_hanlder(uint64_t us) {
74-
_usb_ticker.attach(ticker_task, (std::chrono::microseconds)us);
75-
}
76-
7765
#else
7866

7967
#include "pico/unique_id.h"
80-
8168
#define get_unique_id(_serial) \
8269
pico_get_unique_board_id((pico_unique_board_id_t *)_serial);
8370

84-
static int64_t timer_task(__unused alarm_id_t id, __unused void *user_data) {
85-
irq_set_pending(USB_TASK_IRQ);
86-
return USB_TASK_INTERVAL;
87-
}
88-
89-
static void setup_periodic_usb_hanlder(uint64_t us) {
90-
add_alarm_in_us(us, timer_task, NULL, true);
91-
}
92-
93-
#endif // mbed
71+
#endif
9472

9573
//--------------------------------------------------------------------+
9674
// Porting API
@@ -100,7 +78,7 @@ static void setup_periodic_usb_hanlder(uint64_t us) {
10078
// have multiple cores updating the TUSB state in parallel
10179
mutex_t __usb_mutex;
10280

103-
static void usb_irq() {
81+
static void usb_task_irq(void) {
10482
// if the mutex is already owned, then we are in user code
10583
// in this file which will do a tud_task itself, so we'll just do nothing
10684
// until the next tick; we won't starve
@@ -110,26 +88,24 @@ static void usb_irq() {
11088
}
11189
}
11290

113-
void TinyUSB_Port_InitDevice(uint8_t rhport) {
114-
(void)rhport;
91+
// invoked when there is hardware usb irq, trigger task runner later
92+
static void usb_task_trigger_irq(void) { irq_set_pending(USB_TASK_IRQ); }
11593

94+
void TinyUSB_Port_InitDevice(uint8_t rhport) {
11695
mutex_init(&__usb_mutex);
11796

118-
irq_set_enabled(USBCTRL_IRQ, false);
119-
irq_handler_t current_handler = irq_get_exclusive_handler(USBCTRL_IRQ);
120-
if (current_handler) {
121-
irq_remove_handler(USBCTRL_IRQ, current_handler);
122-
}
123-
124-
tusb_init();
97+
tud_init(rhport);
12598

126-
// soft irq for periodically task runner
99+
// soft irq for task runner
127100
#if (PICO_SDK_VERSION_MAJOR * 100 + PICO_SDK_VERSION_MINOR) >= 104
128101
USB_TASK_IRQ = user_irq_claim_unused(true);
129102
#endif
130-
irq_set_exclusive_handler(USB_TASK_IRQ, usb_irq);
103+
irq_set_exclusive_handler(USB_TASK_IRQ, usb_task_irq);
131104
irq_set_enabled(USB_TASK_IRQ, true);
132-
setup_periodic_usb_hanlder(USB_TASK_INTERVAL);
105+
106+
// add shared irq to trigger task runner
107+
irq_add_shared_handler(USBCTRL_IRQ, usb_task_trigger_irq,
108+
PICO_SHARED_IRQ_HANDLER_LOWEST_ORDER_PRIORITY);
133109
}
134110

135111
void TinyUSB_Port_EnterDFU(void) {

src/arduino/ports/rp2040/tusb_config_rp2040.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ extern int serial1_printf(const char *__restrict __format, ...);
104104
// Enable tuh_edpt_xfer() API
105105
//#define CFG_TUH_API_EDPT_XFER 1
106106

107+
#define CFG_TUH_MSC 1
107108
#define CFG_TUH_HID 4
108109

109110
#ifdef __cplusplus

tools/build_all.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@
2020
['metro_m4_tinyusb', 'adafruit:samd:adafruit_metro_m4:speed=120,usbstack=tinyusb'],
2121
['nrf52840', 'adafruit:nrf52:feather52840'],
2222
['feather_rp2040_tinyusb', 'rp2040:rp2040:adafruit_feather:flash=8388608_0,freq=125,dbgport=Disabled,dbglvl=None,usbstack=tinyusb'],
23-
['metroesp32s2', 'esp32:esp32:adafruit_metro_esp32s2:CDCOnBoot=cdc,MSCOnBoot=default,DFUOnBoot=default,UploadMode=cdc,PSRAM=enabled,PartitionScheme=tinyuf2'],
24-
#[' ', 'esp32:esp32:adafruit_feather_esp32s3:FlashMode=qio,LoopCore=1,EventsCore=1,USBMode=default,CDCOnBoot=cdc,MSCOnBoot=default,DFUOnBoot=default,UploadMode=cdc,PartitionScheme=tinyuf2'],
23+
['metroesp32s2', 'espressif:esp32:adafruit_metro_esp32s2:CDCOnBoot=cdc,MSCOnBoot=default,DFUOnBoot=default,UploadMode=cdc,PSRAM=enabled,PartitionScheme=tinyuf2'],
24+
#[' ', 'espressif:esp32:adafruit_feather_esp32s3:FlashMode=qio,LoopCore=1,EventsCore=1,USBMode=default,CDCOnBoot=cdc,MSCOnBoot=default,DFUOnBoot=default,UploadMode=cdc,PartitionScheme=tinyuf2'],
2525
]
2626

2727
# return [succeeded, failed, skipped]

0 commit comments

Comments
 (0)