Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support CH32X035 and CH32L103 #486

Open
wants to merge 31 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
d0fda78
add ch32x035 and ch32l103 support
21km43 Sep 9, 2024
9c842c5
typo fix Adafruit_TinyUSB_ch32.cpp
21km43 Sep 10, 2024
e8e501f
typo fix in Adafruit_TinyUSB_ch32.cpp
21km43 Sep 10, 2024
be6aed7
add macro for ch32l103
21km43 Sep 10, 2024
84e21e8
remove ch32x035
21km43 Sep 10, 2024
5ae850b
remove unused macro
21km43 Sep 10, 2024
173e452
clang format
21km43 Sep 11, 2024
9c10fe8
define fix
21km43 Sep 12, 2024
7fb912f
usb_div size fix
21km43 Sep 12, 2024
e73bcf4
add pragma warning
21km43 Sep 15, 2024
05c213e
Typo tusb_config_ch32.h
21km43 Sep 15, 2024
5360d17
add ch32x035 and ch32l103 support
21km43 Sep 9, 2024
6184ae1
Merge branch 'master' of https://github.com/21km43/Adafruit_TinyUSB_A…
21km43 Sep 21, 2024
143eb3b
Merge branch 'adafruit:master' into master
21km43 Sep 21, 2024
ddf059a
ch32x035
21km43 Sep 25, 2024
f54331b
clang
21km43 Sep 25, 2024
ddfd21d
typo fix
21km43 Sep 26, 2024
0432a33
Merge branch 'adafruit:master' into master
21km43 Jan 10, 2025
a6f34ca
rename macros for update sdk
21km43 Jan 11, 2025
12dbc7a
function name fix
21km43 Jan 11, 2025
b4535cd
name fix
21km43 Jan 11, 2025
bb1b430
define ch32x035 endpoint
21km43 Jan 11, 2025
23c00ee
add boards to tusb_config.h
21km43 Jan 11, 2025
8bc54a0
no change
21km43 Jan 11, 2025
47ec196
Update githubci.yml
21km43 Jan 11, 2025
654a7c6
fix build_all.py
21km43 Jan 11, 2025
d4bce0c
add .skip
21km43 Jan 11, 2025
51100cc
fix
21km43 Jan 11, 2025
65ce280
delete
21km43 Jan 11, 2025
e1c7a9d
fix
21km43 Jan 11, 2025
e39e57e
warning
21km43 Jan 11, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 28 additions & 19 deletions src/arduino/ports/ch32/Adafruit_TinyUSB_ch32.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@
#include "tusb_option.h"

#if CFG_TUD_ENABLED && \
(defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x))
(defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x) || \
defined(CH32X035) || defined(CH32L10x))

#include "Arduino.h"
#include "arduino/Adafruit_USBD_Device.h"
Expand Down Expand Up @@ -60,24 +61,18 @@ USBWakeUp_IRQHandler(void) {
// USBFS
#if CFG_TUD_WCH_USBIP_USBFS

#if defined(CH32V10x) || defined(CH32V20x)
#if defined(CH32V10x) || defined(CH32V20x) || defined(CH32X035) || \
defined(CH32L10x)

#if defined(CH32V10x)
#define USBHDWakeUp_IRQHandler USBWakeUp_IRQHandler
#define USBFSWakeUp_IRQHandler USBWakeUp_IRQHandler
#endif

__attribute__((interrupt("WCH-Interrupt-fast"))) void USBHD_IRQHandler(void) {
__attribute__((interrupt("WCH-Interrupt-fast"))) void USBFS_IRQHandler(void) {
tud_int_handler(0);
}

__attribute__((interrupt("WCH-Interrupt-fast"))) void
USBHDWakeUp_IRQHandler(void) {
tud_int_handler(0);
}
#endif

#ifdef CH32V30x
__attribute__((interrupt("WCH-Interrupt-fast"))) void OTG_FS_IRQHandler(void) {
USBFSWakeUp_IRQHandler(void) {
tud_int_handler(0);
}
#endif
Expand Down Expand Up @@ -108,13 +103,14 @@ void TinyUSB_Port_InitDevice(uint8_t rhport) {
// Full speed OTG or FSDev

#if defined(CH32V10x)
EXTEN->EXTEN_CTR |= EXTEN_USBHD_IO_EN;
EXTEN->EXTEN_CTR |= EXTEN_USBFS_IO_EN;
EXTEN->EXTEN_CTR &= ~EXTEN_USB_5V_SEL;

#define RCC_AHBPeriph_OTG_FS RCC_AHBPeriph_USBHD
#elif defined(CH32L10x)
#define RCC_AHBPeriph_USBFS RCC_HBPeriph_USBFS
#define RCC_AHBPeriphClockCmd RCC_HBPeriphClockCmd
#endif

uint8_t usb_div;
uint32_t usb_div;
switch (SystemCoreClock) {
#if defined(CH32V20x) || defined(CH32V30x)
case 48000000:
Expand All @@ -133,14 +129,27 @@ void TinyUSB_Port_InitDevice(uint8_t rhport) {
case 72000000:
usb_div = RCC_USBCLKSource_PLLCLK_1Div5;
break;
#elif defined(CH32X035)
case 48000000:
break;
#elif defined(CH32L10x)
case 48000000:
usb_div = RCC_USBCLKSource_PLLCLK_Div1;
break;
case 72000000:
usb_div = RCC_USBCLKSource_PLLCLK_Div1_5;
break;
case 96000000:
usb_div = RCC_USBCLKSource_PLLCLK_Div2;
break;
#endif
default:
return; // unsupported
}

#if defined(CH32V30x)
RCC_OTGFSCLKConfig(usb_div);
#else
RCC_USBFSCLKConfig(usb_div);
#elif !defined(CH32X035)
RCC_USBCLKConfig(usb_div);
#endif

Expand All @@ -149,7 +158,7 @@ void TinyUSB_Port_InitDevice(uint8_t rhport) {
#endif

#if CFG_TUD_WCH_USBIP_USBFS
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_OTG_FS, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_USBFS, ENABLE);
#endif
#endif

Expand Down
8 changes: 7 additions & 1 deletion src/arduino/ports/ch32/tusb_config_ch32.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,11 +34,17 @@ extern "C" {
//--------------------------------------------------------------------
#if defined(CH32V10x)
#define CFG_TUSB_MCU OPT_MCU_CH32V103
#warnning "CH32v103 is not working yet"
#warning "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
#elif defined(CH32X035)
#define CFG_TUSB_MCU OPT_MCU_CH32X035
#warning "CH32X035 is not working yet"
#elif defined(CH32L10x)
#define CFG_TUSB_MCU OPT_MCU_CH32L10X
#warning "CH32L103 is not working yet"
#endif

#define CFG_TUSB_OS OPT_OS_NONE
Expand Down
10 changes: 10 additions & 0 deletions src/common/tusb_mcu.h
Original file line number Diff line number Diff line change
Expand Up @@ -484,6 +484,16 @@
#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_CH32X035) || TU_CHECK_MCU(OPT_MCU_CH32L10X)
// x035 and l103 support USBFS only
#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

//--------------------------------------------------------------------+
// Analog Devices
//--------------------------------------------------------------------+
Expand Down
31 changes: 28 additions & 3 deletions src/portable/wch/ch32_usbfs_reg.h
Original file line number Diff line number Diff line change
Expand Up @@ -89,14 +89,17 @@
__IO uint32_t Reserve1;
__IO uint32_t OTG_CR;
__IO uint32_t OTG_SR;
} USBOTG_FS_TypeDef;
} USBFSD_TypeDef;

#define USBOTG_FS ((USBOTG_FS_TypeDef *) 0x40023400)
#define USBFSD ((USBFSD_TypeDef *) 0x40023400)
#elif CFG_TUSB_MCU == OPT_MCU_CH32V20X
#include <ch32v20x.h>
#elif CFG_TUSB_MCU == OPT_MCU_CH32V307
#include <ch32v30x.h>
#define USBHD_IRQn OTG_FS_IRQn
#elif CFG_TUSB_MCU == OPT_MCU_CH32X035
#include <ch32x035.h>
#elif CFG_TUSB_MCU == OPT_MCU_CH32L10X
#include <ch32l103.h>
#endif

#ifdef __GNUC__
Expand Down Expand Up @@ -146,6 +149,27 @@
#define USBFS_UDEV_CTRL_DP_PIN (1 << 5)
#define USBFS_UDEV_CTRL_PD_DIS (1 << 7)

#if defined(CH32X035)
// TX_CTRL
#define USBFS_EP_T_RES_MASK (3 << 0)
#define USBFS_EP_T_TOG (1 << 6)
#define USBFS_EP_T_AUTO_TOG (1 << 4)

#define USBFS_EP_T_RES_ACK (0 << 0)
#define USBFS_EP_T_RES_NYET (1 << 0)
#define USBFS_EP_T_RES_NAK (2 << 0)
#define USBFS_EP_T_RES_STALL (3 << 0)

// RX_CTRL
#define USBFS_EP_R_RES_MASK (3 << 2)
#define USBFS_EP_R_TOG (1 << 7)
#define USBFS_EP_R_AUTO_TOG (1 << 4)

#define USBFS_EP_R_RES_ACK (0 << 0)
#define USBFS_EP_R_RES_NYET (1 << 0)
#define USBFS_EP_R_RES_NAK (2 << 0)
#define USBFS_EP_R_RES_STALL (3 << 0)
#else
// TX_CTRL
#define USBFS_EP_T_RES_MASK (3 << 0)
#define USBFS_EP_T_TOG (1 << 2)
Expand All @@ -165,6 +189,7 @@
#define USBFS_EP_R_RES_NYET (1 << 0)
#define USBFS_EP_R_RES_NAK (2 << 0)
#define USBFS_EP_R_RES_STALL (3 << 0)
#endif

// token PID
#define PID_OUT 0
Expand Down
69 changes: 43 additions & 26 deletions src/portable/wch/dcd_ch32_usbfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,17 @@
/* private defines */
#define EP_MAX (8)

#define EP_DMA(ep) ((&USBOTG_FS->UEP0_DMA)[ep])
#define EP_TX_LEN(ep) ((&USBOTG_FS->UEP0_TX_LEN)[2 * ep])
#define EP_TX_CTRL(ep) ((&USBOTG_FS->UEP0_TX_CTRL)[4 * ep])
#define EP_RX_CTRL(ep) ((&USBOTG_FS->UEP0_RX_CTRL)[4 * ep])
#if defined(CH32X035)
#define EP_DMA(ep) ((&USBFSD->UEP0_DMA)[ep + (ep > 4 ? 12 : 0)])
#define EP_TX_LEN(ep) ((&USBFSD->UEP0_TX_LEN)[2 * ep + (ep > 4 ? 24 : 0)])
#define EP_TX_CTRL(ep) ((&USBFSD->UEP0_CTRL_H)[2 * ep + (ep > 4 ? 24 : 0)])
#define EP_RX_CTRL(ep) ((&USBFSD->UEP0_CTRL_H)[2 * ep + (ep > 4 ? 24 : 0)])
#else
#define EP_DMA(ep) ((&USBFSD->UEP0_DMA)[ep])
#define EP_TX_LEN(ep) ((&USBFSD->UEP0_TX_LEN)[2 * ep])
#define EP_TX_CTRL(ep) ((&USBFSD->UEP0_TX_CTRL)[4 * ep])
#define EP_RX_CTRL(ep) ((&USBFSD->UEP0_RX_CTRL)[4 * ep])
#endif

/* private data */
struct usb_xfer {
Expand Down Expand Up @@ -126,12 +133,12 @@ static void update_out(uint8_t rhport, uint8_t ep, size_t rx_len) {
bool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {
(void) rh_init;
// init registers
USBOTG_FS->BASE_CTRL = USBFS_CTRL_SYS_CTRL | USBFS_CTRL_INT_BUSY | USBFS_CTRL_DMA_EN;
USBOTG_FS->UDEV_CTRL = USBFS_UDEV_CTRL_PD_DIS | USBFS_UDEV_CTRL_PORT_EN;
USBOTG_FS->DEV_ADDR = 0x00;
USBFSD->BASE_CTRL = USBFS_CTRL_SYS_CTRL | USBFS_CTRL_INT_BUSY | USBFS_CTRL_DMA_EN;
USBFSD->UDEV_CTRL = USBFS_UDEV_CTRL_PD_DIS | USBFS_UDEV_CTRL_PORT_EN;
USBFSD->DEV_ADDR = 0x00;

USBOTG_FS->INT_FG = 0xFF;
USBOTG_FS->INT_EN = USBFS_INT_EN_BUS_RST | USBFS_INT_EN_TRANSFER | USBFS_INT_EN_SUSPEND;
USBFSD->INT_FG = 0xFF;
USBFSD->INT_EN = USBFS_INT_EN_BUS_RST | USBFS_INT_EN_TRANSFER | USBFS_INT_EN_SUSPEND;

// setup endpoint 0
EP_DMA(0) = (uint32_t) &data.buffer[0][0];
Expand All @@ -140,13 +147,23 @@ bool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {
EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;

// enable other endpoints but NAK everything
USBOTG_FS->UEP4_1_MOD = 0xCC;
USBOTG_FS->UEP2_3_MOD = 0xCC;
USBOTG_FS->UEP5_6_MOD = 0xCC;
USBOTG_FS->UEP7_MOD = 0x0C;
USBFSD->UEP4_1_MOD = 0xCC;
USBFSD->UEP2_3_MOD = 0xCC;
#if defined(CH32X035)
USBFSD->UEP567_MOD = 0x3C;
#else
USBFSD->UEP5_6_MOD = 0xCC;
USBFSD->UEP7_MOD = 0x0C;
#endif

for (uint8_t ep = 1; ep < EP_MAX; ep++) {
#if defined(CH32X035)
if (ep != 4) {
EP_DMA(ep) = (uint32_t) &data.buffer[ep][0];
}
#else
EP_DMA(ep) = (uint32_t) &data.buffer[ep][0];
#endif
EP_TX_LEN(ep) = 0;
EP_TX_CTRL(ep) = USBFS_EP_T_AUTO_TOG | USBFS_EP_T_RES_NAK;
EP_RX_CTRL(ep) = USBFS_EP_R_AUTO_TOG | USBFS_EP_R_RES_NAK;
Expand All @@ -160,14 +177,14 @@ bool dcd_init(uint8_t rhport, const tusb_rhport_init_t* rh_init) {

void dcd_int_handler(uint8_t rhport) {
(void) rhport;
uint8_t status = USBOTG_FS->INT_FG;
uint8_t status = USBFSD->INT_FG;
if (status & USBFS_INT_FG_TRANSFER) {
uint8_t ep = USBFS_INT_ST_MASK_UIS_ENDP(USBOTG_FS->INT_ST);
uint8_t token = USBFS_INT_ST_MASK_UIS_TOKEN(USBOTG_FS->INT_ST);
uint8_t ep = USBFS_INT_ST_MASK_UIS_ENDP(USBFSD->INT_ST);
uint8_t token = USBFS_INT_ST_MASK_UIS_TOKEN(USBFSD->INT_ST);

switch (token) {
case PID_OUT: {
uint16_t rx_len = USBOTG_FS->RX_LEN;
uint16_t rx_len = USBFSD->RX_LEN;
update_out(rhport, ep, rx_len);
break;
}
Expand All @@ -186,33 +203,33 @@ void dcd_int_handler(uint8_t rhport) {
break;
}

USBOTG_FS->INT_FG = USBFS_INT_FG_TRANSFER;
USBFSD->INT_FG = USBFS_INT_FG_TRANSFER;
} else if (status & USBFS_INT_FG_BUS_RST) {
data.ep0_tog = true;
data.xfer[0][TUSB_DIR_OUT].max_size = 64;
data.xfer[0][TUSB_DIR_IN].max_size = 64;

dcd_event_bus_signal(rhport, DCD_EVENT_BUS_RESET, true);

USBOTG_FS->DEV_ADDR = 0x00;
USBFSD->DEV_ADDR = 0x00;
EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;

USBOTG_FS->INT_FG = USBFS_INT_FG_BUS_RST;
USBFSD->INT_FG = USBFS_INT_FG_BUS_RST;
} else if (status & USBFS_INT_FG_SUSPEND) {
dcd_event_t event = {.rhport = rhport, .event_id = DCD_EVENT_SUSPEND};
dcd_event_handler(&event, true);
USBOTG_FS->INT_FG = USBFS_INT_FG_SUSPEND;
USBFSD->INT_FG = USBFS_INT_FG_SUSPEND;
}
}

void dcd_int_enable(uint8_t rhport) {
(void) rhport;
NVIC_EnableIRQ(USBHD_IRQn);
NVIC_EnableIRQ(USBFS_IRQn);
}

void dcd_int_disable(uint8_t rhport) {
(void) rhport;
NVIC_DisableIRQ(USBHD_IRQn);
NVIC_DisableIRQ(USBFS_IRQn);
}

void dcd_set_address(uint8_t rhport, uint8_t dev_addr) {
Expand All @@ -227,12 +244,12 @@ void dcd_remote_wakeup(uint8_t rhport) {

void dcd_connect(uint8_t rhport) {
(void) rhport;
USBOTG_FS->BASE_CTRL |= USBFS_CTRL_DEV_PUEN;
USBFSD->BASE_CTRL |= USBFS_CTRL_DEV_PUEN;
}

void dcd_disconnect(uint8_t rhport) {
(void) rhport;
USBOTG_FS->BASE_CTRL &= ~USBFS_CTRL_DEV_PUEN;
USBFSD->BASE_CTRL &= ~USBFS_CTRL_DEV_PUEN;
}

void dcd_sof_enable(uint8_t rhport, bool en) {
Expand All @@ -247,7 +264,7 @@ void dcd_edpt0_status_complete(uint8_t rhport, tusb_control_request_t const* req
if (request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_DEVICE &&
request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD &&
request->bRequest == TUSB_REQ_SET_ADDRESS) {
USBOTG_FS->DEV_ADDR = (uint8_t) request->wValue;
USBFSD->DEV_ADDR = (uint8_t) request->wValue;
}
EP_TX_CTRL(0) = USBFS_EP_T_RES_NAK;
EP_RX_CTRL(0) = USBFS_EP_R_RES_ACK;
Expand Down
3 changes: 1 addition & 2 deletions src/tusb_config.h
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,7 @@
#endif

// Note: For platformio prioritize this file over the one in BSP in all cases

#elif defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x)
#elif defined(ARDUINO_ARCH_CH32) || defined(CH32V20x) || defined(CH32V30x) || defined(CH32X035) || defined(CH32L10x)
#include "arduino/ports/ch32/tusb_config_ch32.h"
#else
#error TinyUSB Arduino Library does not support your core yet
Expand Down
4 changes: 3 additions & 1 deletion src/tusb_option.h
Original file line number Diff line number Diff line change
Expand Up @@ -183,8 +183,10 @@
// WCH
#define OPT_MCU_CH32V307 2200 ///< WCH CH32V307
#define OPT_MCU_CH32F20X 2210 ///< WCH CH32F20x
#define OPT_MCU_CH32V20X 2220 ///< WCH CH32V20X
#define OPT_MCU_CH32V20X 2220 ///< WCH CH32V20x
#define OPT_MCU_CH32V103 2230 ///< WCH CH32V103
#define OPT_MCU_CH32X035 2240 ///< WCH CH32X035
#define OPT_MCU_CH32L10X 2250 ///< WCH CH32L10x

// NXP LPC MCX
#define OPT_MCU_MCXN9 2300 ///< NXP MCX N9 Series
Expand Down
Loading