From f2168e439f19ae2e41726ee3fbed01471656d59f Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 13 Jun 2024 10:31:28 +0700 Subject: [PATCH 1/6] define Serial as SerialTinyUSB if USE_TINYUSB is defined --- examples/CDC/cdc_multi/.feather_esp32s2.test.skip | 0 examples/CDC/cdc_multi/.feather_esp32s3.test.skip | 0 examples/CDC/cdc_multi/.funhouse.test.skip | 0 examples/CDC/cdc_multi/.magtag.test.skip | 0 examples/CDC/cdc_multi/.metroesp32s2.test.skip | 0 .../cdc_multi/.pico_rp2040_tinyusb_host.test.skip | 0 examples/CDC/cdc_multi/.skip.txt | 6 ++++++ src/arduino/Adafruit_USBD_CDC.h | 12 ++++-------- src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp | 4 +++- 9 files changed, 13 insertions(+), 9 deletions(-) delete mode 100644 examples/CDC/cdc_multi/.feather_esp32s2.test.skip delete mode 100644 examples/CDC/cdc_multi/.feather_esp32s3.test.skip delete mode 100644 examples/CDC/cdc_multi/.funhouse.test.skip delete mode 100644 examples/CDC/cdc_multi/.magtag.test.skip delete mode 100644 examples/CDC/cdc_multi/.metroesp32s2.test.skip delete mode 100644 examples/CDC/cdc_multi/.pico_rp2040_tinyusb_host.test.skip create mode 100644 examples/CDC/cdc_multi/.skip.txt diff --git a/examples/CDC/cdc_multi/.feather_esp32s2.test.skip b/examples/CDC/cdc_multi/.feather_esp32s2.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.feather_esp32s3.test.skip b/examples/CDC/cdc_multi/.feather_esp32s3.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.funhouse.test.skip b/examples/CDC/cdc_multi/.funhouse.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.magtag.test.skip b/examples/CDC/cdc_multi/.magtag.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.metroesp32s2.test.skip b/examples/CDC/cdc_multi/.metroesp32s2.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.pico_rp2040_tinyusb_host.test.skip b/examples/CDC/cdc_multi/.pico_rp2040_tinyusb_host.test.skip deleted file mode 100644 index e69de29b..00000000 diff --git a/examples/CDC/cdc_multi/.skip.txt b/examples/CDC/cdc_multi/.skip.txt new file mode 100644 index 00000000..1618b4ed --- /dev/null +++ b/examples/CDC/cdc_multi/.skip.txt @@ -0,0 +1,6 @@ +feather_esp32s2 +feather_esp32s3 +funhouse +magtag +metroesp32s2 +pico_rp2040_tinyusb_host diff --git a/src/arduino/Adafruit_USBD_CDC.h b/src/arduino/Adafruit_USBD_CDC.h index d713d2c7..027bfe5b 100644 --- a/src/arduino/Adafruit_USBD_CDC.h +++ b/src/arduino/Adafruit_USBD_CDC.h @@ -93,15 +93,11 @@ class Adafruit_USBD_CDC : public Stream, public Adafruit_USBD_Interface { bool isValid(void) { return _instance != INVALID_INSTANCE; } }; -// "Serial" is used with TinyUSB CDC -#if defined(USE_TINYUSB) -extern Adafruit_USBD_CDC Serial; -#define SerialTinyUSB Serial -#endif - -// Serial is probably used with HW Uart -#ifndef SerialTinyUSB extern Adafruit_USBD_CDC SerialTinyUSB; + +// Built-in support "Serial" is used with TinyUSB CDC +#if defined(USE_TINYUSB) +#define Serial SerialTinyUSB #endif #endif // else of ESP32 diff --git a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp index 04c791f2..43f3a2c5 100644 --- a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp +++ b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp @@ -76,7 +76,9 @@ USBWakeUp_IRQHandler(void) { void yield(void) { tud_task(); - // flush cdc + if (tud_cdc_connected()) { + tud_cdc_write_flush(); + } } } From d1708bc87f1f0a9c22910f25cad7c849fabd8289 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 13 Jun 2024 11:31:12 +0700 Subject: [PATCH 2/6] move menu check to TinyUSB_API --- src/Adafruit_TinyUSB.h | 7 ------- src/arduino/Adafruit_TinyUSB_API.h | 17 ++++++++++++++--- src/arduino/Adafruit_USBD_CDC.h | 6 ++++-- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/Adafruit_TinyUSB.h b/src/Adafruit_TinyUSB.h index bb836b3b..7c3f5dcc 100644 --- a/src/Adafruit_TinyUSB.h +++ b/src/Adafruit_TinyUSB.h @@ -25,13 +25,6 @@ #ifndef ADAFRUIT_TINYUSB_H_ #define ADAFRUIT_TINYUSB_H_ -// Error message for Core that must select TinyUSB via menu -#if !defined(USE_TINYUSB) && \ - (defined(ARDUINO_ARCH_SAMD) || \ - (defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED))) -#error TinyUSB is not selected, please select it in "Tools->Menu->USB Stack" -#endif - // ESP32 out-of-sync #ifdef ARDUINO_ARCH_ESP32 #include "arduino/ports/esp32/tusb_config_esp32.h" diff --git a/src/arduino/Adafruit_TinyUSB_API.h b/src/arduino/Adafruit_TinyUSB_API.h index 92ebbd16..aa7b617b 100644 --- a/src/arduino/Adafruit_TinyUSB_API.h +++ b/src/arduino/Adafruit_TinyUSB_API.h @@ -32,13 +32,24 @@ // TinyUSB_API, USBD_CDC, USBD_Device, USBD_Interface, #define TINYUSB_API_VERSION 30000 +#if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_NRF52_ADAFRUIT) || \ + defined(ARDUINO_ARCH_ESP32) || \ + (defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED)) +#define TINYUSB_HAS_BUITLTIN_CORE_SUPPORT +#endif + // Core that has built-in support: Adafruit SAMD, Adafruit nRF, rp2040, esp32 -#if !(defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(ARDUINO_ARCH_ESP32) || \ - (defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED))) +#if !defined(TINYUSB_HAS_BUITLTIN_CORE_SUPPORT) #define TINYUSB_NEED_POLLING_TASK #endif +// Error message for Core that must select TinyUSB via menu (built-in except +// esp32) +#if !defined(USE_TINYUSB) && (defined(TINYUSB_HAS_BUITLTIN_CORE_SUPPORT) && \ + !defined(ARDUINO_ARCH_ESP32)) +#error TinyUSB is not selected, please select it in "Tools->Menu->USB Stack" +#endif + //--------------------------------------------------------------------+ // Core API // Should be called by BSP Core to initialize, process task diff --git a/src/arduino/Adafruit_USBD_CDC.h b/src/arduino/Adafruit_USBD_CDC.h index 027bfe5b..9d115b41 100644 --- a/src/arduino/Adafruit_USBD_CDC.h +++ b/src/arduino/Adafruit_USBD_CDC.h @@ -95,11 +95,13 @@ class Adafruit_USBD_CDC : public Stream, public Adafruit_USBD_Interface { extern Adafruit_USBD_CDC SerialTinyUSB; -// Built-in support "Serial" is used with TinyUSB CDC +// Built-in support "Serial" is assigned to TinyUSB CDC #if defined(USE_TINYUSB) -#define Serial SerialTinyUSB +#define SerialTinyUSB Serial #endif +extern Adafruit_USBD_CDC SerialTinyUSB; + #endif // else of ESP32 #endif // __cplusplus From f5ad52fe7f5d266e25a2a90235e5650172942015 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 13 Jun 2024 11:46:13 +0700 Subject: [PATCH 3/6] more update for ch32 --- examples/CDC/serial_echo/serial_echo.ino | 1 + src/arduino/Adafruit_TinyUSB_API.h | 2 +- src/arduino/Adafruit_USBD_CDC.h | 3 ++- src/arduino/Adafruit_USBD_Interface.h | 2 +- src/arduino/ports/ch32/tusb_config_ch32.h | 1 - src/tusb_config.h | 2 +- 6 files changed, 6 insertions(+), 5 deletions(-) diff --git a/examples/CDC/serial_echo/serial_echo.ino b/examples/CDC/serial_echo/serial_echo.ino index fb611c80..0d480892 100644 --- a/examples/CDC/serial_echo/serial_echo.ino +++ b/examples/CDC/serial_echo/serial_echo.ino @@ -13,6 +13,7 @@ /* This sketch demonstrates USB CDC Serial echo (convert to upper case) using SerialTinyUSB which * is available for both core with built-in USB support and without. + * Note: on core with built-in support Serial is alias to SerialTinyUSB */ void setup() { diff --git a/src/arduino/Adafruit_TinyUSB_API.h b/src/arduino/Adafruit_TinyUSB_API.h index aa7b617b..77826a69 100644 --- a/src/arduino/Adafruit_TinyUSB_API.h +++ b/src/arduino/Adafruit_TinyUSB_API.h @@ -33,7 +33,7 @@ #define TINYUSB_API_VERSION 30000 #if defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_NRF52_ADAFRUIT) || \ - defined(ARDUINO_ARCH_ESP32) || \ + defined(ARDUINO_ARCH_ESP32) || defined(ARDUINO_ARCH_CH32) || \ (defined(ARDUINO_ARCH_RP2040) && !defined(ARDUINO_ARCH_MBED)) #define TINYUSB_HAS_BUITLTIN_CORE_SUPPORT #endif diff --git a/src/arduino/Adafruit_USBD_CDC.h b/src/arduino/Adafruit_USBD_CDC.h index 9d115b41..9c0952f3 100644 --- a/src/arduino/Adafruit_USBD_CDC.h +++ b/src/arduino/Adafruit_USBD_CDC.h @@ -96,7 +96,8 @@ class Adafruit_USBD_CDC : public Stream, public Adafruit_USBD_Interface { extern Adafruit_USBD_CDC SerialTinyUSB; // Built-in support "Serial" is assigned to TinyUSB CDC -#if defined(USE_TINYUSB) +// CH32 defines Serial as alias in WSerial.h +#if defined(USE_TINYUSB) && !defined(ARDUINO_ARCH_CH32) #define SerialTinyUSB Serial #endif diff --git a/src/arduino/Adafruit_USBD_Interface.h b/src/arduino/Adafruit_USBD_Interface.h index 3527516c..8457f69d 100644 --- a/src/arduino/Adafruit_USBD_Interface.h +++ b/src/arduino/Adafruit_USBD_Interface.h @@ -28,7 +28,7 @@ #include #include -#if defined(CH32V20x) || defined(CH32V30x) +#if defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x) // HACK: required for ch32 core version 1.0.4 or prior, removed when 1.0.5 is // released extern "C" void yield(void); diff --git a/src/arduino/ports/ch32/tusb_config_ch32.h b/src/arduino/ports/ch32/tusb_config_ch32.h index 0235e1cf..a0ae7c49 100644 --- a/src/arduino/ports/ch32/tusb_config_ch32.h +++ b/src/arduino/ports/ch32/tusb_config_ch32.h @@ -34,7 +34,6 @@ extern "C" { //-------------------------------------------------------------------- #if defined(CH32V20x) #define CFG_TUSB_MCU OPT_MCU_CH32V20X -#define CFG_TUD_WCH_USBIP_FSDEV 1 // use USBD #elif defined(CH32V30x) #define CFG_TUSB_MCU OPT_MCU_CH32V307 #endif diff --git a/src/tusb_config.h b/src/tusb_config.h index 51099a98..c2e0702b 100644 --- a/src/tusb_config.h +++ b/src/tusb_config.h @@ -51,7 +51,7 @@ // Note: For platformio prioritize this file over the one in BSP in all cases -#elif defined(CH32V20x) || defined(CH32V30x) // using build.series +#elif defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x) #include "arduino/ports/ch32/tusb_config_ch32.h" #else #error TinyUSB Arduino Library does not support your core yet From 1b9e433c75727d492164031638ee346ae16d0314 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 13 Jun 2024 22:59:49 +0700 Subject: [PATCH 4/6] update to work with ch32v307 usbfs --- .../ports/ch32/Adafruit_TinyUSB_ch32.cpp | 59 ++++++++++++------- 1 file changed, 38 insertions(+), 21 deletions(-) diff --git a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp index 43f3a2c5..278156b9 100644 --- a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp +++ b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp @@ -24,7 +24,8 @@ #include "tusb_option.h" -#if defined(CH32V20x) && CFG_TUD_ENABLED +#if CFG_TUD_ENABLED && \ + (defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x)) #include "Arduino.h" #include "arduino/Adafruit_USBD_Device.h" @@ -38,41 +39,52 @@ //--------------------------------------------------------------------+ extern "C" { -// USBFS -__attribute__((interrupt("WCH-Interrupt-fast"))) void USBHD_IRQHandler(void) { -#if CFG_TUD_WCH_USBIP_USBFS +// USBD (fsdev) +#if CFG_TUD_WCH_USBIP_FSDEV +__attribute__((interrupt("WCH-Interrupt-fast"))) void +USB_LP_CAN1_RX0_IRQHandler(void) { tud_int_handler(0); -#endif } __attribute__((interrupt("WCH-Interrupt-fast"))) void -USBHDWakeUp_IRQHandler(void) { -#if CFG_TUD_WCH_USBIP_USBFS +USB_HP_CAN1_TX_IRQHandler(void) { tud_int_handler(0); -#endif } -// USBD (fsdev) __attribute__((interrupt("WCH-Interrupt-fast"))) void -USB_LP_CAN1_RX0_IRQHandler(void) { -#if CFG_TUD_WCH_USBIP_FSDEV +USBWakeUp_IRQHandler(void) { tud_int_handler(0); +} #endif + +// USBFS +#if CFG_TUD_WCH_USBIP_USBFS + +#ifdef CH32V20x +__attribute__((interrupt("WCH-Interrupt-fast"))) void USBHD_IRQHandler(void) { + tud_int_handler(0); } __attribute__((interrupt("WCH-Interrupt-fast"))) void -USB_HP_CAN1_TX_IRQHandler(void) { -#if CFG_TUD_WCH_USBIP_FSDEV +USBHDWakeUp_IRQHandler(void) { tud_int_handler(0); -#endif } +#endif -__attribute__((interrupt("WCH-Interrupt-fast"))) void -USBWakeUp_IRQHandler(void) { -#if CFG_TUD_WCH_USBIP_FSDEV +#ifdef CH32V30x +__attribute__((interrupt("WCH-Interrupt-fast"))) void OTG_FS_IRQHandler(void) { tud_int_handler(0); +} +#endif + #endif + +// USBHS +#if CFG_TUD_WCH_USBIP_USBHS +__attribute__((interrupt("WCH-Interrupt-fast"))) void USBHS_IRQHandler(void) { + tud_int_handler(0); } +#endif void yield(void) { tud_task(); @@ -87,21 +99,25 @@ void yield(void) { //--------------------------------------------------------------------+ void TinyUSB_Port_InitDevice(uint8_t rhport) { +#if CFG_TUD_WCH_USBIP_FSDEV || CFG_TUD_WCH_USBIP_USBFS + // Full speed OTG or FSDev uint8_t usb_div; switch (SystemCoreClock) { case 48000000: - usb_div = RCC_USBCLKSource_PLLCLK_Div1; + usb_div = 0; // div1 break; case 96000000: - usb_div = RCC_USBCLKSource_PLLCLK_Div2; + usb_div = 1; // div2 break; case 144000000: - usb_div = RCC_USBCLKSource_PLLCLK_Div3; + usb_div = 2; // div3 break; default: return; // unsupported } - RCC_USBCLKConfig(usb_div); + // RCC_USBCLKConfig(usb_div) or RCC_OTGFSCLKConfig(usb_div) + RCC->CFGR0 &= ~(3 << 22); + RCC->CFGR0 |= usb_div << 22; #if CFG_TUD_WCH_USBIP_FSDEV RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); @@ -109,6 +125,7 @@ void TinyUSB_Port_InitDevice(uint8_t rhport) { #if CFG_TUD_WCH_USBIP_USBFS RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE); +#endif #endif tud_init(rhport); From 468f72001ebc73140958ee1644b21d89578cafb8 Mon Sep 17 00:00:00 2001 From: hathach Date: Thu, 13 Jun 2024 23:33:29 +0700 Subject: [PATCH 5/6] update bulk to have 512 for highspeed usb, tested usbhs with v307 using 144mhz hse --- src/arduino/Adafruit_USBD_CDC.cpp | 6 ++++-- src/arduino/midi/Adafruit_USBD_MIDI.cpp | 6 +++--- src/arduino/msc/Adafruit_USBD_MSC.cpp | 4 ++-- .../ports/ch32/Adafruit_TinyUSB_ch32.cpp | 10 ++++++++++ src/arduino/ports/ch32/tusb_config_ch32.h | 17 ++++++++++------- src/arduino/video/Adafruit_USBD_Video.cpp | 4 +++- src/arduino/webusb/Adafruit_USBD_WebUSB.cpp | 4 ++-- 7 files changed, 34 insertions(+), 17 deletions(-) diff --git a/src/arduino/Adafruit_USBD_CDC.cpp b/src/arduino/Adafruit_USBD_CDC.cpp index 5df15c8a..893db83e 100644 --- a/src/arduino/Adafruit_USBD_CDC.cpp +++ b/src/arduino/Adafruit_USBD_CDC.cpp @@ -38,6 +38,8 @@ #define TINYUSB_API_VERSION 0 #endif +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) + // SerialTinyUSB can be macro expanding to "Serial" on supported cores Adafruit_USBD_CDC SerialTinyUSB; @@ -69,8 +71,8 @@ uint16_t Adafruit_USBD_CDC::getInterfaceDescriptor(uint8_t itfnum_deprecated, uint8_t _strid = 0; #endif - uint8_t const desc[] = { - TUD_CDC_DESCRIPTOR(itfnum, _strid, ep_notif, 8, ep_out, ep_in, 64)}; + uint8_t const desc[] = {TUD_CDC_DESCRIPTOR(itfnum, _strid, ep_notif, 8, + ep_out, ep_in, BULK_PACKET_SIZE)}; uint16_t const len = sizeof(desc); diff --git a/src/arduino/midi/Adafruit_USBD_MIDI.cpp b/src/arduino/midi/Adafruit_USBD_MIDI.cpp index d2a5c635..ad9729de 100644 --- a/src/arduino/midi/Adafruit_USBD_MIDI.cpp +++ b/src/arduino/midi/Adafruit_USBD_MIDI.cpp @@ -31,7 +31,7 @@ //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ -#define EPSIZE 64 +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) // TODO multiple instances static Adafruit_USBD_MIDI *_midi_dev = NULL; @@ -103,7 +103,7 @@ uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum_deprecated, // Endpoint OUT + jack mapping { - uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_out, EPSIZE, _n_cables)}; + uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_out, BULK_PACKET_SIZE, _n_cables)}; memcpy(buf + len, desc, sizeof(desc)); len += sizeof(desc); } @@ -116,7 +116,7 @@ uint16_t Adafruit_USBD_MIDI::getInterfaceDescriptor(uint8_t itfnum_deprecated, // Endpoint IN + jack mapping { - uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_in, EPSIZE, _n_cables)}; + uint8_t desc[] = {TUD_MIDI_DESC_EP(ep_in, BULK_PACKET_SIZE, _n_cables)}; memcpy(buf + len, desc, sizeof(desc)); len += sizeof(desc); } diff --git a/src/arduino/msc/Adafruit_USBD_MSC.cpp b/src/arduino/msc/Adafruit_USBD_MSC.cpp index 83dd8832..a580d6ff 100644 --- a/src/arduino/msc/Adafruit_USBD_MSC.cpp +++ b/src/arduino/msc/Adafruit_USBD_MSC.cpp @@ -28,7 +28,7 @@ #include "Adafruit_USBD_MSC.h" -#define EPSIZE 64 // TODO must be 512 for highspeed device +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) static Adafruit_USBD_MSC *_msc_dev = NULL; @@ -52,7 +52,7 @@ uint16_t Adafruit_USBD_MSC::getInterfaceDescriptor(uint8_t itfnum_deprecated, uint8_t const ep_out = TinyUSBDevice.allocEndpoint(TUSB_DIR_OUT); uint8_t const desc[] = { - TUD_MSC_DESCRIPTOR(itfnum, _strid, ep_out, ep_in, EPSIZE)}; + TUD_MSC_DESCRIPTOR(itfnum, _strid, ep_out, ep_in, BULK_PACKET_SIZE)}; uint16_t const len = sizeof(desc); if (bufsize < len) { diff --git a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp index 278156b9..00e06921 100644 --- a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp +++ b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp @@ -128,6 +128,16 @@ void TinyUSB_Port_InitDevice(uint8_t rhport) { #endif #endif +#if CFG_TUD_WCH_USBIP_USBHS + // High speed USB: currently require 144MHz HSE, update later + RCC_USBCLK48MConfig(RCC_USBCLK48MCLKSource_USBPHY); + RCC_USBHSPLLCLKConfig(RCC_HSBHSPLLCLKSource_HSE); + RCC_USBHSConfig(RCC_USBPLL_Div2); + RCC_USBHSPLLCKREFCLKConfig(RCC_USBHSPLLCKREFCLK_4M); + RCC_USBHSPHYPLLALIVEcmd(ENABLE); + RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USBHS, ENABLE); +#endif + tud_init(rhport); } diff --git a/src/arduino/ports/ch32/tusb_config_ch32.h b/src/arduino/ports/ch32/tusb_config_ch32.h index a0ae7c49..3bb0eb6b 100644 --- a/src/arduino/ports/ch32/tusb_config_ch32.h +++ b/src/arduino/ports/ch32/tusb_config_ch32.h @@ -34,8 +34,10 @@ extern "C" { //-------------------------------------------------------------------- #if defined(CH32V20x) #define CFG_TUSB_MCU OPT_MCU_CH32V20X + #elif defined(CH32V30x) #define CFG_TUSB_MCU OPT_MCU_CH32V307 + #endif #define CFG_TUSB_OS OPT_OS_NONE @@ -105,8 +107,8 @@ extern "C" { #define CFG_TUD_VIDEO_STREAMING_EP_BUFSIZE 256 // CDC FIFO size of TX and RX -#define CFG_TUD_CDC_RX_BUFSIZE 256 -#define CFG_TUD_CDC_TX_BUFSIZE 256 +#define CFG_TUD_CDC_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 256) +#define CFG_TUD_CDC_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 256) // MSC Buffer size of Device Mass storage #define CFG_TUD_MSC_EP_BUFSIZE 512 @@ -120,17 +122,17 @@ extern "C" { // Vendor FIFO size of TX and RX #ifndef CFG_TUD_VENDOR_RX_BUFSIZE -#define CFG_TUD_VENDOR_RX_BUFSIZE 64 +#define CFG_TUD_VENDOR_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) #endif #ifndef CFG_TUD_VENDOR_TX_BUFSIZE -#define CFG_TUD_VENDOR_TX_BUFSIZE 64 +#define CFG_TUD_VENDOR_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) #endif //-------------------------------------------------------------------- // Host Configuration //-------------------------------------------------------------------- - +#if 0 // Size of buffer to hold descriptors and other data used for enumeration #define CFG_TUH_ENUMERATION_BUFSIZE 256 @@ -158,8 +160,8 @@ extern "C" { #define CFG_TUH_CDC_CH34X 1 // RX & TX fifo size -#define CFG_TUH_CDC_RX_BUFSIZE 64 -#define CFG_TUH_CDC_TX_BUFSIZE 64 +#define CFG_TUH_CDC_RX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) +#define CFG_TUH_CDC_TX_BUFSIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) // Set Line Control state on enumeration/mounted: // DTR ( bit 0), RTS (bit 1) @@ -170,6 +172,7 @@ extern "C" { // This need Pico-PIO-USB at least 0.5.1 #define CFG_TUH_CDC_LINE_CODING_ON_ENUM \ { 115200, CDC_LINE_CONDING_STOP_BITS_1, CDC_LINE_CODING_PARITY_NONE, 8 } +#endif #ifdef __cplusplus } diff --git a/src/arduino/video/Adafruit_USBD_Video.cpp b/src/arduino/video/Adafruit_USBD_Video.cpp index 7f4f156c..34727f4c 100644 --- a/src/arduino/video/Adafruit_USBD_Video.cpp +++ b/src/arduino/video/Adafruit_USBD_Video.cpp @@ -30,6 +30,8 @@ #include "Adafruit_USBD_Video.h" +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) + Adafruit_USBD_Video::Adafruit_USBD_Video(void) { _vc_id = 0; memset(&_camera_terminal, 0, sizeof(_camera_terminal)); @@ -231,7 +233,7 @@ uint16_t Adafruit_USBD_Video::getInterfaceDescriptor(uint8_t itfnum_deprecated, .bEndpointAddress = ep_in, .bmAttributes = {.xfer = TUSB_XFER_BULK, .sync = 0, .usage = 0}, - .wMaxPacketSize = 64, + .wMaxPacketSize = BULK_PACKET_SIZE, .bInterval = 1}}; uint16_t const len_iad = sizeof(desc_iad); diff --git a/src/arduino/webusb/Adafruit_USBD_WebUSB.cpp b/src/arduino/webusb/Adafruit_USBD_WebUSB.cpp index f0635040..593fd2e2 100644 --- a/src/arduino/webusb/Adafruit_USBD_WebUSB.cpp +++ b/src/arduino/webusb/Adafruit_USBD_WebUSB.cpp @@ -36,7 +36,7 @@ //--------------------------------------------------------------------+ // MACRO TYPEDEF CONSTANT ENUM DECLARATION //--------------------------------------------------------------------+ -#define EPSIZE 64 +#define BULK_PACKET_SIZE (TUD_OPT_HIGH_SPEED ? 512 : 64) enum { VENDOR_REQUEST_WEBUSB = 1, VENDOR_REQUEST_MICROSOFT = 2 }; @@ -163,7 +163,7 @@ uint16_t Adafruit_USBD_WebUSB::getInterfaceDescriptor(uint8_t itfnum_deprecated, uint8_t const ep_out = TinyUSBDevice.allocEndpoint(TUSB_DIR_OUT); uint8_t desc[] = { - TUD_VENDOR_DESCRIPTOR(itfnum, _strid, ep_out, ep_in, EPSIZE)}; + TUD_VENDOR_DESCRIPTOR(itfnum, _strid, ep_out, ep_in, BULK_PACKET_SIZE)}; uint16_t const len = sizeof(desc); // null buffer for length only From 8cb40327f112850d179b8f5e948705ed90ddb6a8 Mon Sep 17 00:00:00 2001 From: hathach Date: Fri, 14 Jun 2024 17:01:00 +0700 Subject: [PATCH 6/6] update tinyusb core for better ch32v103 support, but not working with v103 just yet --- .../ports/ch32/Adafruit_TinyUSB_ch32.cpp | 43 ++++++++--- src/arduino/ports/ch32/tusb_config_ch32.h | 7 +- src/common/tusb_mcu.h | 9 +++ src/portable/st/stm32_fsdev/fsdev_ch32.h | 16 +++- src/portable/wch/ch32_usbfs_reg.h | 74 +++++++++++++++++-- src/portable/wch/ch32_usbhs_reg.h | 12 +++ src/tusb_option.h | 2 +- 7 files changed, 142 insertions(+), 21 deletions(-) diff --git a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp index 00e06921..8fd9bea1 100644 --- a/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp +++ b/src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp @@ -60,7 +60,12 @@ USBWakeUp_IRQHandler(void) { // USBFS #if CFG_TUD_WCH_USBIP_USBFS -#ifdef CH32V20x +#if defined(CH32V10x) || defined(CH32V20x) + +#if defined(CH32V10x) +#define USBHDWakeUp_IRQHandler USBWakeUp_IRQHandler +#endif + __attribute__((interrupt("WCH-Interrupt-fast"))) void USBHD_IRQHandler(void) { tud_int_handler(0); } @@ -101,23 +106,43 @@ void yield(void) { void TinyUSB_Port_InitDevice(uint8_t rhport) { #if CFG_TUD_WCH_USBIP_FSDEV || CFG_TUD_WCH_USBIP_USBFS // Full speed OTG or FSDev + +#if defined(CH32V10x) + EXTEN->EXTEN_CTR |= EXTEN_USBHD_IO_EN; + EXTEN->EXTEN_CTR &= ~EXTEN_USB_5V_SEL; + +#define RCC_AHBPeriph_OTG_FS RCC_AHBPeriph_USBHD +#endif + uint8_t usb_div; switch (SystemCoreClock) { +#if defined(CH32V20x) || defined(CH32V30x) case 48000000: - usb_div = 0; // div1 - break; + usb_div = 0; + break; // div1 case 96000000: - usb_div = 1; // div2 - break; + usb_div = 1; + break; // div2 case 144000000: - usb_div = 2; // div3 + usb_div = 2; + break; // div3 +#elif defined(CH32V10x) + case 48000000: + usb_div = RCC_USBCLKSource_PLLCLK_Div1; + break; + case 72000000: + usb_div = RCC_USBCLKSource_PLLCLK_1Div5; break; +#endif default: return; // unsupported } - // RCC_USBCLKConfig(usb_div) or RCC_OTGFSCLKConfig(usb_div) - RCC->CFGR0 &= ~(3 << 22); - RCC->CFGR0 |= usb_div << 22; + +#if defined(CH32V30x) + RCC_OTGFSCLKConfig(usb_div); +#else + RCC_USBCLKConfig(usb_div); +#endif #if CFG_TUD_WCH_USBIP_FSDEV RCC_APB1PeriphClockCmd(RCC_APB1Periph_USB, ENABLE); diff --git a/src/arduino/ports/ch32/tusb_config_ch32.h b/src/arduino/ports/ch32/tusb_config_ch32.h index 3bb0eb6b..f8e2ef90 100644 --- a/src/arduino/ports/ch32/tusb_config_ch32.h +++ b/src/arduino/ports/ch32/tusb_config_ch32.h @@ -32,12 +32,13 @@ extern "C" { //-------------------------------------------------------------------- // COMMON CONFIGURATION //-------------------------------------------------------------------- -#if defined(CH32V20x) +#if defined(CH32V10x) +#define CFG_TUSB_MCU OPT_MCU_CH32V103 +#warnning "CH32v103 is not working yet" +#elif defined(CH32V20x) #define CFG_TUSB_MCU OPT_MCU_CH32V20X - #elif defined(CH32V30x) #define CFG_TUSB_MCU OPT_MCU_CH32V307 - #endif #define CFG_TUSB_OS OPT_OS_NONE diff --git a/src/common/tusb_mcu.h b/src/common/tusb_mcu.h index ba04f460..eb49eddf 100644 --- a/src/common/tusb_mcu.h +++ b/src/common/tusb_mcu.h @@ -420,6 +420,15 @@ #define TUP_RHPORT_HIGHSPEED CFG_TUD_WCH_USBIP_USBHS #define TUP_DCD_ENDPOINT_MAX (CFG_TUD_WCH_USBIP_USBHS ? 16 : 8) +#elif TU_CHECK_MCU(OPT_MCU_CH32V103) + #define TUP_USBIP_WCH_USBFS + + #if !defined(CFG_TUD_WCH_USBIP_USBFS) + #define CFG_TUD_WCH_USBIP_USBFS 1 + #endif + + #define TUP_DCD_ENDPOINT_MAX 8 + #elif TU_CHECK_MCU(OPT_MCU_CH32V20X) // v20x support both FSDEV (USBD) and USBFS, default to FSDEV #define TUP_USBIP_WCH_USBFS diff --git a/src/portable/st/stm32_fsdev/fsdev_ch32.h b/src/portable/st/stm32_fsdev/fsdev_ch32.h index 85fe3266..f63a80d5 100644 --- a/src/portable/st/stm32_fsdev/fsdev_ch32.h +++ b/src/portable/st/stm32_fsdev/fsdev_ch32.h @@ -36,11 +36,21 @@ #include "common/tusb_compiler.h" -#if CFG_TUSB_MCU == OPT_MCU_CH32V20X - #include +// https://github.com/openwch/ch32v307/pull/90 +// https://github.com/openwch/ch32v20x/pull/12 +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#endif -#elif CFG_TUSB_MCU == OPT_MCU_CH32F20X +#if CFG_TUSB_MCU == OPT_MCU_CH32F20X #include +#elif CFG_TUSB_MCU == OPT_MCU_CH32V20X + #include +#endif + +#ifdef __GNUC__ +#pragma GCC diagnostic pop #endif #define FSDEV_PMA_SIZE (512u) diff --git a/src/portable/wch/ch32_usbfs_reg.h b/src/portable/wch/ch32_usbfs_reg.h index 0a50a616..68be64f5 100644 --- a/src/portable/wch/ch32_usbfs_reg.h +++ b/src/portable/wch/ch32_usbfs_reg.h @@ -28,15 +28,79 @@ #ifndef USB_CH32_USBFS_REG_H #define USB_CH32_USBFS_REG_H -#if CFG_TUSB_MCU == OPT_MCU_CH32V307 - #include - #define USBHD_IRQn OTG_FS_IRQn +// https://github.com/openwch/ch32v307/pull/90 +// https://github.com/openwch/ch32v20x/pull/12 +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#endif + +#if CFG_TUSB_MCU == OPT_MCU_CH32F20X + #include +#elif CFG_TUSB_MCU == OPT_MCU_CH32V103 + #include + typedef struct + { + __IO uint8_t BASE_CTRL; + __IO uint8_t UDEV_CTRL; + __IO uint8_t INT_EN; + __IO uint8_t DEV_ADDR; + __IO uint8_t Reserve0; + __IO uint8_t MIS_ST; + __IO uint8_t INT_FG; + __IO uint8_t INT_ST; + __IO uint32_t RX_LEN; + __IO uint8_t UEP4_1_MOD; + __IO uint8_t UEP2_3_MOD; + __IO uint8_t UEP5_6_MOD; + __IO uint8_t UEP7_MOD; + __IO uint32_t UEP0_DMA; + __IO uint32_t UEP1_DMA; + __IO uint32_t UEP2_DMA; + __IO uint32_t UEP3_DMA; + __IO uint32_t UEP4_DMA; + __IO uint32_t UEP5_DMA; + __IO uint32_t UEP6_DMA; + __IO uint32_t UEP7_DMA; + __IO uint16_t UEP0_TX_LEN; + __IO uint8_t UEP0_TX_CTRL; + __IO uint8_t UEP0_RX_CTRL; + __IO uint16_t UEP1_TX_LEN; + __IO uint8_t UEP1_TX_CTRL; + __IO uint8_t UEP1_RX_CTRL; + __IO uint16_t UEP2_TX_LEN; + __IO uint8_t UEP2_TX_CTRL; + __IO uint8_t UEP2_RX_CTRL; + __IO uint16_t UEP3_TX_LEN; + __IO uint8_t UEP3_TX_CTRL; + __IO uint8_t UEP3_RX_CTRL; + __IO uint16_t UEP4_TX_LEN; + __IO uint8_t UEP4_TX_CTRL; + __IO uint8_t UEP4_RX_CTRL; + __IO uint16_t UEP5_TX_LEN; + __IO uint8_t UEP5_TX_CTRL; + __IO uint8_t UEP5_RX_CTRL; + __IO uint16_t UEP6_TX_LEN; + __IO uint8_t UEP6_TX_CTRL; + __IO uint8_t UEP6_RX_CTRL; + __IO uint16_t UEP7_TX_LEN; + __IO uint8_t UEP7_TX_CTRL; + __IO uint8_t UEP7_RX_CTRL; + __IO uint32_t Reserve1; + __IO uint32_t OTG_CR; + __IO uint32_t OTG_SR; + } USBOTG_FS_TypeDef; + #define USBOTG_FS ((USBOTG_FS_TypeDef *) 0x40023400) #elif CFG_TUSB_MCU == OPT_MCU_CH32V20X #include +#elif CFG_TUSB_MCU == OPT_MCU_CH32V307 + #include + #define USBHD_IRQn OTG_FS_IRQn +#endif -#elif CFG_TUSB_MCU == OPT_MCU_CH32F20X - #include +#ifdef __GNUC__ +#pragma GCC diagnostic pop #endif // CTRL diff --git a/src/portable/wch/ch32_usbhs_reg.h b/src/portable/wch/ch32_usbhs_reg.h index 130e4f22..87300b49 100644 --- a/src/portable/wch/ch32_usbhs_reg.h +++ b/src/portable/wch/ch32_usbhs_reg.h @@ -28,12 +28,24 @@ #ifndef USB_CH32_USBHS_REG_H #define USB_CH32_USBHS_REG_H +// https://github.com/openwch/ch32v307/pull/90 +// https://github.com/openwch/ch32v20x/pull/12 +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstrict-prototypes" +#endif + #if CFG_TUSB_MCU == OPT_MCU_CH32V307 #include #elif CFG_TUSB_MCU == OPT_MCU_CH32F20X #include #endif +#ifdef __GNUC__ +#pragma GCC diagnostic pop +#endif + + /******************* GLOBAL ******************/ // USB CONTROL diff --git a/src/tusb_option.h b/src/tusb_option.h index b6f27b5d..611aaca3 100644 --- a/src/tusb_option.h +++ b/src/tusb_option.h @@ -182,7 +182,7 @@ #define OPT_MCU_CH32V307 2200 ///< WCH CH32V307 #define OPT_MCU_CH32F20X 2210 ///< WCH CH32F20x #define OPT_MCU_CH32V20X 2220 ///< WCH CH32V20X - +#define OPT_MCU_CH32V103 2230 ///< WCH CH32V103 // NXP LPC MCX #define OPT_MCU_MCXN9 2300 ///< NXP MCX N9 Series