From 271d1e516b34855109d2f6482ca86ca153aea1d9 Mon Sep 17 00:00:00 2001 From: Martino Facchin Date: Tue, 1 Aug 2023 11:37:40 +0200 Subject: [PATCH] USB: port to latest tinyusb --- cores/arduino/usb/USB.cpp | 22 ++++++++++++++++----- extras/tinyusb | 2 +- libraries/UsbHostMsd/UsbHostMsd.cpp | 28 ++++++++------------------- libraries/UsbHostMsd/tu_msc.c | 30 ++++++++++++++--------------- variants/MINIMA/pins_arduino.h | 2 ++ variants/PORTENTA_C33/tusb_config.h | 5 +++++ variants/UNOWIFIR4/pins_arduino.h | 2 ++ 7 files changed, 50 insertions(+), 41 deletions(-) diff --git a/cores/arduino/usb/USB.cpp b/cores/arduino/usb/USB.cpp index d08f36ab5..934bd688b 100644 --- a/cores/arduino/usb/USB.cpp +++ b/cores/arduino/usb/USB.cpp @@ -281,17 +281,17 @@ void _usbhs_interrupt_handler(void) #if CFG_TUSB_RHPORT1_MODE & OPT_MODE_HOST tuh_int_handler(1); + tuh_task(); #endif #if CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE tud_int_handler(1); -#endif tud_task(); +#endif } extern "C" { - void tud_set_irq_usbfs(IRQn_Type q); - void tud_set_irq_usbhs(IRQn_Type q); + void tusb_rusb2_set_irqnum(uint8_t rhport, int32_t irqnum); } __attribute__((weak)) void configure_usb_mux() {} @@ -324,7 +324,11 @@ void __USBStart() { usb_irq_cfg.address_of_handler = (uint32_t)_usbfs_interrupt_handler; usb_irq_cfg.first_irq_number = FSP_INVALID_VECTOR; IRQManager::getInstance().addPeripheral(IRQ_USB,(void*)&usb_irq_cfg); - tud_set_irq_usbfs((IRQn_Type)(usb_irq_cfg.first_irq_number)); + #if CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE + tusb_rusb2_set_irqnum(BOARD_TUD_RHPORT, usb_irq_cfg.first_irq_number); + #else + tusb_rusb2_set_irqnum(BOARD_TUH_RHPORT, usb_irq_cfg.first_irq_number); + #endif #endif #endif @@ -334,7 +338,11 @@ void __USBStart() { usb_irq_cfg.address_of_handler = (uint32_t)_usbhs_interrupt_handler; usb_irq_cfg.first_irq_number = FSP_INVALID_VECTOR; IRQManager::getInstance().addPeripheral(IRQ_USB_HS,(void*)&usb_irq_cfg); - tud_set_irq_usbhs((IRQn_Type)(usb_irq_cfg.first_irq_number)); + #if CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE + tusb_rusb2_set_irqnum(BOARD_TUD_RHPORT, usb_irq_cfg.first_irq_number); + #else + tusb_rusb2_set_irqnum(BOARD_TUH_RHPORT, usb_irq_cfg.first_irq_number); + #endif #endif #endif @@ -353,6 +361,10 @@ void __USBStart() { /* init device port*/ tud_init(BOARD_TUD_RHPORT); +#ifdef VUSB_LDO_ENABLE + ((R_USB_FS0_Type*)R_USB_FS0_BASE)->USBMC_b.VDCEN = 1; +#endif + #if 0 //defined(AZURE_RTOS_THREADX) static TX_BYTE_POOL byte_pool_0; static TX_THREAD thread; diff --git a/extras/tinyusb b/extras/tinyusb index 2b735ee8f..edee46e79 160000 --- a/extras/tinyusb +++ b/extras/tinyusb @@ -1 +1 @@ -Subproject commit 2b735ee8f5476168d6b5ed1dc32edc52f4d3648a +Subproject commit edee46e7941f56f5024bf60d56921cfe10d1f7a5 diff --git a/libraries/UsbHostMsd/UsbHostMsd.cpp b/libraries/UsbHostMsd/UsbHostMsd.cpp index edd3e1f12..6796b66ac 100644 --- a/libraries/UsbHostMsd/UsbHostMsd.cpp +++ b/libraries/UsbHostMsd/UsbHostMsd.cpp @@ -113,16 +113,10 @@ int USBHostMSD::write(const void *buffer, bd_addr_t addr, bd_size_t size) { block_number = addr / block_size; count = size / block_size; - for (uint32_t b = block_number; b < block_number + count; b++) { - in_progress = true; - if(tuh_msc_write10(usb_host_msd_get_device_address(), get_lun(), buf, b, 1, complete_cb, 0)) { - while(in_progress) { - delay(10); - } - buf += block_size; - } - else { - return -1; + in_progress = true; + if(tuh_msc_write10(usb_host_msd_get_device_address(), get_lun(), buf, block_number, count, complete_cb, 0)) { + while (in_progress) { + tuh_task(); } } return 0; @@ -145,16 +139,10 @@ int USBHostMSD::read(void *buffer, bd_addr_t addr, bd_size_t size) block_number = addr / block_size; count = size / block_size; - for (uint32_t b = block_number; b < block_number + count; b++) { - in_progress = true; - if(tuh_msc_read10(usb_host_msd_get_device_address(), get_lun(), buf, b, 1, complete_cb, 0)) { - while(in_progress) { - delay(10); - } - buf += block_size; - } - else { - return -1; + in_progress = true; + if(tuh_msc_read10(usb_host_msd_get_device_address(), get_lun(), buf, block_number, count, complete_cb, 0)) { + while (in_progress) { + tuh_task(); } } return 0; diff --git a/libraries/UsbHostMsd/tu_msc.c b/libraries/UsbHostMsd/tu_msc.c index cc568aa65..22520770a 100644 --- a/libraries/UsbHostMsd/tu_msc.c +++ b/libraries/UsbHostMsd/tu_msc.c @@ -78,39 +78,41 @@ void usb_host_msd_attach_mnt_cbk(void (*fnc)(void)) { //--------------------------------------------------------------------+ static scsi_inquiry_resp_t inquiry_resp; -bool inquiry_complete_cb(uint8_t dev_addr, msc_cbw_t const* cbw, msc_csw_t const* csw) +bool inquiry_complete_cb(uint8_t dev_addr, tuh_msc_complete_data_t const * cb_data) { + msc_cbw_t const* cbw = cb_data->cbw; + msc_csw_t const* csw = cb_data->csw; + if (csw->status != 0) { - printf("Inquiry failed\r\n"); + TU_LOG2("Inquiry failed\r\n"); return false; } // Print out Vendor ID, Product ID and Rev - printf("%.8s %.16s rev %.4s\r\n", inquiry_resp.vendor_id, inquiry_resp.product_id, inquiry_resp.product_rev); + TU_LOG2("%.8s %.16s rev %.4s\r\n", inquiry_resp.vendor_id, inquiry_resp.product_id, inquiry_resp.product_rev); // Get capacity of device uint32_t const block_count = tuh_msc_get_block_count(dev_addr, cbw->lun); uint32_t const block_size = tuh_msc_get_block_size(dev_addr, cbw->lun); - printf("Disk Size: %lu MB\r\n", block_count / ((1024*1024)/block_size)); - printf("Block Count = %lu, Block Size: %lu\r\n", block_count, block_size); + TU_LOG2("Disk Size: %lu MB\r\n", block_count / ((1024*1024)/block_size)); + TU_LOG2("Block Count = %lu, Block Size: %lu\r\n", block_count, block_size); return true; } //------------- IMPLEMENTATION -------------// void tuh_msc_mount_cb(uint8_t dev_addr) { - #ifdef USB_DEBUG - mylogadd("[EVENT]: Mass Storage Device - MOUNT -> device address %i", dev_addr); - #endif + TU_LOG2("[EVENT]: Mass Storage Device - MOUNT -> device address %i", dev_addr); + + uint8_t const lun = 0; + tuh_msc_inquiry(dev_addr, lun, &inquiry_resp, inquiry_complete_cb, 0); max_lun = tuh_msc_get_maxlun(dev_addr); - #ifdef USB_DEBUG - mylogadd(" : Max LUN %i", dev_addr); - #endif - + TU_LOG2(" : Max LUN %i", dev_addr); + if(max_lun > 0) { if(usb_msc_device != NULL) { free(usb_msc_device); @@ -157,9 +159,7 @@ void tuh_msc_mount_cb(uint8_t dev_addr) { void tuh_msc_umount_cb(uint8_t dev_addr) { (void) dev_addr; - #ifdef USB_DEBUG - mylogadd("[CALL]: tuh_msc_umount_cb %i --------- UMOUNT", dev_addr); - #endif + TU_LOG2("[CALL]: tuh_msc_umount_cb %i --------- UMOUNT", dev_addr); if(usb_msc_device != NULL) { free(usb_msc_device); usb_msc_device = NULL; diff --git a/variants/MINIMA/pins_arduino.h b/variants/MINIMA/pins_arduino.h index 644a1a735..73424040c 100644 --- a/variants/MINIMA/pins_arduino.h +++ b/variants/MINIMA/pins_arduino.h @@ -157,6 +157,8 @@ static const uint8_t SS = PIN_SPI_CS; #define USB_PID (0x0069) #define USB_NAME "UNO R4 Minima" +#define VUSB_LDO_ENABLE 1 + /* EEPROM DEFINES */ #define ARDUINO_FLASH_TYPE LP_FLASH diff --git a/variants/PORTENTA_C33/tusb_config.h b/variants/PORTENTA_C33/tusb_config.h index 12691afc6..7e1782bd4 100644 --- a/variants/PORTENTA_C33/tusb_config.h +++ b/variants/PORTENTA_C33/tusb_config.h @@ -102,6 +102,11 @@ #define CFG_TUD_DFU_RUNTIME 1 #define CFG_TUH_MSC 1 +#define CFG_TUH_HUB 1 +#define CFG_TUH_DEVICE_MAX (3*CFG_TUH_HUB + 1) +#define CFG_TUH_ENDPOINT_MAX 8 +#define CFG_TUH_API_EDPT_XFER 1 + // CDC FIFO size of TX and RX #define CFG_TUD_CDC_RX_BUFSIZE ((TUD_OPT_HIGH_SPEED ? 512 : 64) * 8) diff --git a/variants/UNOWIFIR4/pins_arduino.h b/variants/UNOWIFIR4/pins_arduino.h index dc5fb93f8..50330bace 100644 --- a/variants/UNOWIFIR4/pins_arduino.h +++ b/variants/UNOWIFIR4/pins_arduino.h @@ -159,6 +159,8 @@ static const uint8_t SS = PIN_SPI_CS; #define USB_PID (0x006D) #define USB_NAME "UNO R4 WiFi" +#define VUSB_LDO_ENABLE 1 + /* EEPROM DEFINES */ #define ARDUINO_FLASH_TYPE LP_FLASH