summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorHiFiPhile <[email protected]>2026-06-23 23:12:51 +0200
committerHiFiPhile <[email protected]>2026-06-23 23:12:51 +0200
commit033dc6bb77e8a9e1c1172d74d47707848b5c5bf5 (patch)
treee7672f9bda54aa1a243b2a1c0f74a48055569c63 /hw
parentb5e63ca44c846813ece9ad9df684cae0d1d5b542 (diff)
parentcd3561bf158afd5a5718904b8139a338d1e3b67c (diff)
Merge remote-tracking branch 'tinyusb/master' into fix-stm32-usbc
Diffstat (limited to 'hw')
-rw-r--r--hw/bsp/BoardPresets.json48
-rw-r--r--hw/bsp/at32f402_405/family.c2
-rw-r--r--hw/bsp/at32f403a_407/family.c2
-rw-r--r--hw/bsp/at32f413/family.c2
-rw-r--r--hw/bsp/at32f415/family.c2
-rw-r--r--hw/bsp/at32f423/family.c2
-rw-r--r--hw/bsp/at32f425/family.c2
-rw-r--r--hw/bsp/at32f435_437/family.c2
-rw-r--r--hw/bsp/at32f45x/family.c2
-rw-r--r--hw/bsp/board.c6
-rw-r--r--hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.cmake8
-rw-r--r--hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.h27
-rw-r--r--hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.mk5
-rw-r--r--hw/bsp/ch32v10x/family.c22
-rw-r--r--hw/bsp/ch32v10x/linker/ch32v10x.ld23
-rw-r--r--hw/bsp/ch32v20x/family.c2
-rw-r--r--hw/bsp/ch32v20x/family.cmake3
-rw-r--r--hw/bsp/ch32v20x/linker/ch32v20x.ld23
-rw-r--r--hw/bsp/ch32v30x/linker/ch32v30x.ld24
-rw-r--r--hw/bsp/ch583/boards/ch582m_evt/board.cmake5
-rw-r--r--hw/bsp/ch583/boards/ch582m_evt/board.h61
-rw-r--r--hw/bsp/ch583/boards/ch582m_evt/board.mk3
-rw-r--r--hw/bsp/ch583/boards/yd-ch582m/board.cmake5
-rw-r--r--hw/bsp/ch583/boards/yd-ch582m/board.h61
-rw-r--r--hw/bsp/ch583/boards/yd-ch582m/board.mk3
-rw-r--r--hw/bsp/ch583/ch583_it.c37
-rw-r--r--hw/bsp/ch583/ch583_it.h46
-rw-r--r--hw/bsp/ch583/debug_uart.c86
-rw-r--r--hw/bsp/ch583/debug_uart.h44
-rw-r--r--hw/bsp/ch583/family.c194
-rw-r--r--hw/bsp/ch583/family.cmake108
-rw-r--r--hw/bsp/ch583/family.mk59
-rw-r--r--hw/bsp/ch583/linker/ch582.ld167
-rw-r--r--hw/bsp/ch583/system_ch583.c39
-rw-r--r--hw/bsp/ch583/system_ch583.h43
-rw-r--r--hw/bsp/ch583/wch-riscv.cfg17
-rw-r--r--hw/bsp/espressif/boards/family.c8
-rw-r--r--hw/bsp/espressif/family.cmake24
-rw-r--r--hw/bsp/family_support.cmake68
-rw-r--r--hw/bsp/ft9xx/family.c5
-rw-r--r--hw/bsp/gd32vf103/family.c2
-rw-r--r--hw/bsp/imxrt/boards/metro_m7_1011/board.cmake1
-rw-r--r--hw/bsp/imxrt/boards/metro_m7_1011/board.mk2
-rw-r--r--hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake1
-rw-r--r--hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk2
-rw-r--r--hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake1
-rw-r--r--hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk2
-rw-r--r--hw/bsp/kinetis_k/family.c2
-rw-r--r--hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake1
-rw-r--r--hw/bsp/mm32/family.c8
-rw-r--r--hw/bsp/nrf/boards/nrf54h20dk/board.cmake3
-rw-r--r--hw/bsp/nrf/boards/nrf54h20dk/board.mk5
-rw-r--r--hw/bsp/nrf/boards/nrf54lm20dk/board.cmake5
-rw-r--r--hw/bsp/pic32mz/family.c4
-rw-r--r--hw/bsp/rp2040/family.c2
-rw-r--r--hw/bsp/rp2040/family.cmake3
-rw-r--r--hw/bsp/samd11/family.c4
-rw-r--r--hw/bsp/samd2x_l2x/family.c2
-rw-r--r--hw/bsp/samg/family.c4
-rw-r--r--hw/bsp/stm32c0/family.c2
-rw-r--r--hw/bsp/stm32c5/FreeRTOSConfig/FreeRTOSConfig.h165
-rw-r--r--hw/bsp/stm32c5/boards/stm32c542nucleo/board.cmake13
-rw-r--r--hw/bsp/stm32c5/boards/stm32c542nucleo/board.h83
-rw-r--r--hw/bsp/stm32c5/boards/stm32c542nucleo/board.mk13
-rw-r--r--hw/bsp/stm32c5/family.c250
-rw-r--r--hw/bsp/stm32c5/family.cmake111
-rw-r--r--hw/bsp/stm32c5/family.mk52
-rw-r--r--hw/bsp/stm32c5/linker/stm32c542xc_flash.icf46
-rw-r--r--hw/bsp/stm32c5/linker/stm32c542xc_flash.ld185
-rw-r--r--hw/bsp/stm32c5/stm32c5xx_hal_conf.h684
-rw-r--r--hw/bsp/stm32f0/family.c2
-rw-r--r--hw/bsp/stm32f1/family.c12
-rw-r--r--hw/bsp/stm32f2/family.c2
-rw-r--r--hw/bsp/stm32f3/family.c9
-rw-r--r--hw/bsp/stm32f4/family.c7
-rw-r--r--hw/bsp/stm32f7/boards/stm32f746disco/board.cmake2
-rw-r--r--hw/bsp/stm32f7/boards/stm32f769disco/board.cmake1
-rw-r--r--hw/bsp/stm32f7/family.c23
-rw-r--r--hw/bsp/stm32g0/family.c2
-rw-r--r--hw/bsp/stm32g4/family.c12
-rw-r--r--hw/bsp/stm32h5/boards/stm32h573i_dk/board.h5
-rw-r--r--hw/bsp/stm32h5/family.c2
-rw-r--r--hw/bsp/stm32h7/family.c2
-rw-r--r--hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h5
-rw-r--r--hw/bsp/stm32h7rs/family.c2
-rw-r--r--hw/bsp/stm32l0/family.c2
-rw-r--r--hw/bsp/stm32l4/family.c2
-rw-r--r--hw/bsp/stm32n6/boards/stm32n6570dk/board.h5
-rw-r--r--hw/bsp/stm32n6/boards/stm32n657nucleo/board.h5
-rw-r--r--hw/bsp/stm32n6/family.c2
-rw-r--r--hw/bsp/stm32u0/family.c15
-rw-r--r--hw/bsp/stm32u5/family.c2
-rw-r--r--hw/bsp/stm32wb/family.c2
-rw-r--r--hw/bsp/tm4c/family.c10
-rw-r--r--hw/bsp/tm4c/family.cmake4
-rw-r--r--hw/bsp/xmc4000/family.c2
96 files changed, 2945 insertions, 142 deletions
diff --git a/hw/bsp/BoardPresets.json b/hw/bsp/BoardPresets.json
index 86609d075..2ad940caf 100644
--- a/hw/bsp/BoardPresets.json
+++ b/hw/bsp/BoardPresets.json
@@ -6,7 +6,7 @@
"hidden": true,
"description": "Configure preset for the ${presetName} board",
"generator": "Ninja Multi-Config",
- "binaryDir": "${sourceDir}/build/${presetName}",
+ "binaryDir": "${sourceDir}/cmake-build-${presetName}",
"cacheVariables": {
"CMAKE_DEFAULT_BUILD_TYPE": "RelWithDebInfo",
"BOARD": "${presetName}"
@@ -17,7 +17,7 @@
"hidden": true,
"description": "Configure preset for the ${presetName} board",
"generator": "Ninja",
- "binaryDir": "${sourceDir}/build/${presetName}",
+ "binaryDir": "${sourceDir}/cmake-build-${presetName}",
"cacheVariables": {
"BOARD": "${presetName}"
}
@@ -123,6 +123,10 @@
"inherits": "default"
},
{
+ "name": "ch32v103c_bluepill",
+ "inherits": "default"
+ },
+ {
"name": "ch32v103r_r1_1v0",
"inherits": "default"
},
@@ -627,6 +631,10 @@
"inherits": "default"
},
{
+ "name": "stm32c542nucleo",
+ "inherits": "default"
+ },
+ {
"name": "stm32f070rbnucleo",
"inherits": "default"
},
@@ -1088,6 +1096,11 @@
"configurePreset": "ch32f205r-r0"
},
{
+ "name": "ch32v103c_bluepill",
+ "description": "Build preset for the ch32v103c_bluepill board",
+ "configurePreset": "ch32v103c_bluepill"
+ },
+ {
"name": "ch32v103r_r1_1v0",
"description": "Build preset for the ch32v103r_r1_1v0 board",
"configurePreset": "ch32v103r_r1_1v0"
@@ -1763,6 +1776,11 @@
"configurePreset": "stm32c071nucleo"
},
{
+ "name": "stm32c542nucleo",
+ "description": "Build preset for the stm32c542nucleo board",
+ "configurePreset": "stm32c542nucleo"
+ },
+ {
"name": "stm32f070rbnucleo",
"description": "Build preset for the stm32f070rbnucleo board",
"configurePreset": "stm32f070rbnucleo"
@@ -2473,6 +2491,19 @@
]
},
{
+ "name": "ch32v103c_bluepill",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "ch32v103c_bluepill"
+ },
+ {
+ "type": "build",
+ "name": "ch32v103c_bluepill"
+ }
+ ]
+ },
+ {
"name": "ch32v103r_r1_1v0",
"steps": [
{
@@ -4228,6 +4259,19 @@
]
},
{
+ "name": "stm32c542nucleo",
+ "steps": [
+ {
+ "type": "configure",
+ "name": "stm32c542nucleo"
+ },
+ {
+ "type": "build",
+ "name": "stm32c542nucleo"
+ }
+ ]
+ },
+ {
"name": "stm32f070rbnucleo",
"steps": [
{
diff --git a/hw/bsp/at32f402_405/family.c b/hw/bsp/at32f402_405/family.c
index 56d4a7bea..aa1a5b484 100644
--- a/hw/bsp/at32f402_405/family.c
+++ b/hw/bsp/at32f402_405/family.c
@@ -220,7 +220,7 @@ int board_uart_write(void const *buf, int len)
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f403a_407/family.c b/hw/bsp/at32f403a_407/family.c
index 942e15872..cf15ba83a 100644
--- a/hw/bsp/at32f403a_407/family.c
+++ b/hw/bsp/at32f403a_407/family.c
@@ -238,7 +238,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f413/family.c b/hw/bsp/at32f413/family.c
index d9af0ae4d..69591b2ba 100644
--- a/hw/bsp/at32f413/family.c
+++ b/hw/bsp/at32f413/family.c
@@ -238,7 +238,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f415/family.c b/hw/bsp/at32f415/family.c
index ca205d480..132e0db31 100644
--- a/hw/bsp/at32f415/family.c
+++ b/hw/bsp/at32f415/family.c
@@ -212,7 +212,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f423/family.c b/hw/bsp/at32f423/family.c
index 9f13dba07..79ac3fcca 100644
--- a/hw/bsp/at32f423/family.c
+++ b/hw/bsp/at32f423/family.c
@@ -239,7 +239,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f425/family.c b/hw/bsp/at32f425/family.c
index 1629ad7c0..75e53b1f7 100644
--- a/hw/bsp/at32f425/family.c
+++ b/hw/bsp/at32f425/family.c
@@ -220,7 +220,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f435_437/family.c b/hw/bsp/at32f435_437/family.c
index 59a4fe120..80e200363 100644
--- a/hw/bsp/at32f435_437/family.c
+++ b/hw/bsp/at32f435_437/family.c
@@ -265,7 +265,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/at32f45x/family.c b/hw/bsp/at32f45x/family.c
index 27eae861f..42b688b87 100644
--- a/hw/bsp/at32f45x/family.c
+++ b/hw/bsp/at32f45x/family.c
@@ -216,7 +216,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/board.c b/hw/bsp/board.c
index ae58bb5fc..5093382d9 100644
--- a/hw/bsp/board.c
+++ b/hw/bsp/board.c
@@ -51,12 +51,12 @@ int sys_read(int fhdl, char *buf, size_t count) TU_ATTR_USED;
int sys_write(int fhdl, const char *buf, size_t count) {
(void) fhdl;
- return (int) SEGGER_RTT_Write(0, buf, (int) count);
+ return (int) SEGGER_RTT_Write(0, buf, (unsigned) count);
}
int sys_read(int fhdl, char *buf, size_t count) {
(void) fhdl;
- int rd = (int) SEGGER_RTT_Read(0, buf, count);
+ int rd = (int) SEGGER_RTT_Read(0, buf, (unsigned) count);
return (rd > 0) ? rd : -1;
}
#endif
@@ -171,7 +171,7 @@ int board_getchar(void) {
}
int board_putchar(int c) {
- if (board_uart_write((const char *)&c, 1)) {
+ if (board_uart_write((const char *)&c, 1) > 0) {
return c;
} else {
return -1;
diff --git a/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.cmake b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.cmake
new file mode 100644
index 000000000..f6e47ba30
--- /dev/null
+++ b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.cmake
@@ -0,0 +1,8 @@
+set(LD_FLASH_SIZE 64K)
+set(LD_RAM_SIZE 20K)
+
+function(update_board TARGET)
+ target_compile_definitions(${TARGET} PUBLIC
+ CFG_EXAMPLE_MSC_DUAL_READONLY
+ )
+endfunction()
diff --git a/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.h b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.h
new file mode 100644
index 000000000..3a97b44d6
--- /dev/null
+++ b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.h
@@ -0,0 +1,27 @@
+/* Some Chinese manufacturers use CH32V103C8T6 to make Bluepill boards
+ */
+/* metadata:
+ name: CH32V103C8T6-Bluepill
+ url: https://stm32-base.org/boards/STM32F103C8T6-Blue-Pill
+*/
+
+#ifndef BOARD_H_
+#define BOARD_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define LED_PORT GPIOC
+#define LED_PIN GPIO_Pin_13
+#define LED_STATE_ON 0
+
+#define BUTTON_PORT GPIOA
+#define BUTTON_PIN GPIO_Pin_1
+#define BUTTON_STATE_ACTIVE 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.mk b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.mk
new file mode 100644
index 000000000..e594f42a7
--- /dev/null
+++ b/hw/bsp/ch32v10x/boards/ch32v103c_bluepill/board.mk
@@ -0,0 +1,5 @@
+CFLAGS += -DCFG_EXAMPLE_MSC_DUAL_READONLY
+
+LDFLAGS += \
+ -Wl,--defsym=__FLASH_SIZE=64K \
+ -Wl,--defsym=__RAM_SIZE=20K \
diff --git a/hw/bsp/ch32v10x/family.c b/hw/bsp/ch32v10x/family.c
index 72dae7086..aa709b0d8 100644
--- a/hw/bsp/ch32v10x/family.c
+++ b/hw/bsp/ch32v10x/family.c
@@ -67,13 +67,20 @@ uint32_t tusb_time_millis_api(void) {
#endif
void board_init(void) {
- __disable_irq();
+ /* Do NOT toggle the global interrupt enable here.
+ * CH32V103 startup enters U-mode (mret with mstatus.MPP=0), so:
+ * - the SDK __disable_irq()/__enable_irq() write mstatus, which faults in U-mode;
+ * - writing CSR 0x800 (INTSYSCR) corrupts the QingKe V3 interrupt-mode config,
+ * which made the USB interrupt vector to a bad address (PC=0) and hang.
+ * The startup already leaves interrupts correctly configured, and machine-mode
+ * interrupts are globally enabled while running in U-mode regardless of mstatus.MIE. */
#if CFG_TUSB_OS == OPT_OS_NONE
SysTick_Config(SystemCoreClock / 1000);
#endif
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
+ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
EXTEN->EXTEN_CTR |= EXTEN_USBFS_IO_EN;
uint8_t usb_div;
@@ -123,8 +130,6 @@ void board_init(void) {
USART_Init(USART1, &usart);
USART_Cmd(USART1, ENABLE);
- __enable_irq();
-
board_led_write(true);
}
@@ -136,6 +141,17 @@ uint32_t board_button_read(void) {
return BUTTON_STATE_ACTIVE == GPIO_ReadInputDataBit(BUTTON_PORT, BUTTON_PIN);
}
+size_t board_get_unique_id(uint8_t id[], size_t max_len) {
+ (void) max_len;
+ volatile uint32_t* ch32_uuid = ((volatile uint32_t*) 0x1FFFF7E8UL);
+ uint32_t* serial_32 = (uint32_t*) (uintptr_t) id;
+ serial_32[0] = ch32_uuid[0];
+ serial_32[1] = ch32_uuid[1];
+ serial_32[2] = ch32_uuid[2];
+
+ return 12;
+}
+
int board_uart_read(uint8_t *buf, int len) {
(void) buf;
(void) len;
diff --git a/hw/bsp/ch32v10x/linker/ch32v10x.ld b/hw/bsp/ch32v10x/linker/ch32v10x.ld
index cd5c8dc17..a2de3c25f 100644
--- a/hw/bsp/ch32v10x/linker/ch32v10x.ld
+++ b/hw/bsp/ch32v10x/linker/ch32v10x.ld
@@ -13,6 +13,7 @@ ENTRY( _start )
__stack_size = 2048;
PROVIDE( _stack_size = __stack_size );
+_estack = ORIGIN(RAM) + LENGTH(RAM);
SECTIONS
{
@@ -150,16 +151,16 @@ SECTIONS
PROVIDE( _ebss = .);
} >RAM AT>FLASH
- PROVIDE( _end = _ebss);
- PROVIDE( end = . );
-
- .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
- {
- PROVIDE( _heap_end = . );
- . = ALIGN(4);
- PROVIDE(_susrstack = . );
- . = . + __stack_size;
- PROVIDE( _eusrstack = .);
- } >RAM
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE( end = . );
+ PROVIDE( _end = . );
+ . = . + __stack_size;
+ . = ALIGN(8);
+ } >RAM
+ PROVIDE( _heap_end = ORIGIN(RAM) + LENGTH(RAM) - __stack_size );
+ PROVIDE( _susrstack = _heap_end );
+ PROVIDE( _eusrstack = ORIGIN(RAM) + LENGTH(RAM) );
}
diff --git a/hw/bsp/ch32v20x/family.c b/hw/bsp/ch32v20x/family.c
index 221f62107..76024cfde 100644
--- a/hw/bsp/ch32v20x/family.c
+++ b/hw/bsp/ch32v20x/family.c
@@ -220,6 +220,6 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/ch32v20x/family.cmake b/hw/bsp/ch32v20x/family.cmake
index 59a96f70d..785f5ee35 100644
--- a/hw/bsp/ch32v20x/family.cmake
+++ b/hw/bsp/ch32v20x/family.cmake
@@ -61,8 +61,9 @@ function(family_add_board BOARD_TARGET)
if (RHPORT_DEVICE EQUAL 0)
target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUD_WCH_USBIP_FSDEV=1)
+ target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUH_WCH_USBIP_FSDEV=1)
elseif (RHPORT_DEVICE EQUAL 1)
- target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUH_WCH_USBIP_USBFS=1)
+ target_compile_definitions(${BOARD_TARGET} PUBLIC CFG_TUD_WCH_USBIP_USBFS=1)
else()
message(FATAL_ERROR "Invalid RHPORT_DEVICE ${RHPORT_DEVICE}")
endif()
diff --git a/hw/bsp/ch32v20x/linker/ch32v20x.ld b/hw/bsp/ch32v20x/linker/ch32v20x.ld
index f84808b0d..bfa9a8436 100644
--- a/hw/bsp/ch32v20x/linker/ch32v20x.ld
+++ b/hw/bsp/ch32v20x/linker/ch32v20x.ld
@@ -12,6 +12,7 @@ MEMORY
ENTRY( _start )
PROVIDE( _stack_size = __stack_size );
+_estack = ORIGIN(RAM) + LENGTH(RAM);
SECTIONS
{
@@ -149,16 +150,16 @@ SECTIONS
PROVIDE( _ebss = .);
} >RAM AT>FLASH
- PROVIDE( _end = _ebss);
- PROVIDE( end = . );
-
- .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
- {
- PROVIDE( _heap_end = . );
- . = ALIGN(4);
- PROVIDE(_susrstack = . );
- . = . + __stack_size;
- PROVIDE( _eusrstack = .);
- } >RAM
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE( end = . );
+ PROVIDE( _end = . );
+ . = . + __stack_size;
+ . = ALIGN(8);
+ } >RAM
+ PROVIDE( _heap_end = ORIGIN(RAM) + LENGTH(RAM) - __stack_size );
+ PROVIDE( _susrstack = _heap_end );
+ PROVIDE( _eusrstack = ORIGIN(RAM) + LENGTH(RAM) );
}
diff --git a/hw/bsp/ch32v30x/linker/ch32v30x.ld b/hw/bsp/ch32v30x/linker/ch32v30x.ld
index 6dd5d344a..2941c41a0 100644
--- a/hw/bsp/ch32v30x/linker/ch32v30x.ld
+++ b/hw/bsp/ch32v30x/linker/ch32v30x.ld
@@ -12,6 +12,7 @@ MEMORY
ENTRY( _start )
PROVIDE( _stack_size = __stack_size );
+_estack = ORIGIN(RAM) + LENGTH(RAM);
SECTIONS
{
@@ -151,17 +152,16 @@ SECTIONS
PROVIDE( _ebss = .);
} >RAM AT>FLASH
- PROVIDE( _end = _ebss);
- PROVIDE( end = . );
-
- .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
- {
- PROVIDE( _heap_end = . );
- . = ALIGN(4);
- PROVIDE(_susrstack = . );
- . = . + __stack_size;
- PROVIDE( _eusrstack = .);
- __freertos_irq_stack_top = .;
- } >RAM
+ ._user_heap_stack :
+ {
+ . = ALIGN(8);
+ PROVIDE( end = . );
+ PROVIDE( _end = . );
+ . = . + __stack_size;
+ . = ALIGN(8);
+ } >RAM
+ PROVIDE( _heap_end = ORIGIN(RAM) + LENGTH(RAM) - __stack_size );
+ PROVIDE( _susrstack = _heap_end );
+ PROVIDE( _eusrstack = ORIGIN(RAM) + LENGTH(RAM) );
}
diff --git a/hw/bsp/ch583/boards/ch582m_evt/board.cmake b/hw/bsp/ch583/boards/ch582m_evt/board.cmake
new file mode 100644
index 000000000..4129c4550
--- /dev/null
+++ b/hw/bsp/ch583/boards/ch582m_evt/board.cmake
@@ -0,0 +1,5 @@
+set(LD_FLASH_SIZE 448K)
+set(LD_RAM_SIZE 32K)
+
+function(update_board TARGET)
+endfunction()
diff --git a/hw/bsp/ch583/boards/ch582m_evt/board.h b/hw/bsp/ch583/boards/ch582m_evt/board.h
new file mode 100644
index 000000000..c3483bf17
--- /dev/null
+++ b/hw/bsp/ch583/boards/ch582m_evt/board.h
@@ -0,0 +1,61 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* metadata:
+ name: CH582M-EVT evaluation board
+ url: https://www.wch-ic.com/products/CH582.html
+*/
+
+#ifndef BOARD_H_
+#define BOARD_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// LED: PB4 on CH582M-EVT
+#define LED_PIN GPIO_Pin_4
+#define LED_STATE_ON 0
+
+// Directly reuse BOOT pin as user button
+#define BUTTON_PIN GPIO_Pin_22
+#define BUTTON_STATE_ACTIVE 0
+
+// UART: UART1 TX=PA9, RX=PA8
+#define CFG_BOARD_UART_BAUDRATE 115200
+
+// Device only on USB1 (rhport 0). CH58x host / USB2 is not supported by the shared usbfs dcd;
+// BOARD_TUH_RHPORT is kept commented out to ease re-adding host later.
+#ifndef BOARD_TUD_RHPORT
+#define BOARD_TUD_RHPORT 0
+#endif
+// #ifndef BOARD_TUH_RHPORT
+// #define BOARD_TUH_RHPORT 1
+// #endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hw/bsp/ch583/boards/ch582m_evt/board.mk b/hw/bsp/ch583/boards/ch582m_evt/board.mk
new file mode 100644
index 000000000..a13979799
--- /dev/null
+++ b/hw/bsp/ch583/boards/ch582m_evt/board.mk
@@ -0,0 +1,3 @@
+LDFLAGS += \
+ -Wl,--defsym=__FLASH_SIZE=448K \
+ -Wl,--defsym=__RAM_SIZE=32K \
diff --git a/hw/bsp/ch583/boards/yd-ch582m/board.cmake b/hw/bsp/ch583/boards/yd-ch582m/board.cmake
new file mode 100644
index 000000000..4129c4550
--- /dev/null
+++ b/hw/bsp/ch583/boards/yd-ch582m/board.cmake
@@ -0,0 +1,5 @@
+set(LD_FLASH_SIZE 448K)
+set(LD_RAM_SIZE 32K)
+
+function(update_board TARGET)
+endfunction()
diff --git a/hw/bsp/ch583/boards/yd-ch582m/board.h b/hw/bsp/ch583/boards/yd-ch582m/board.h
new file mode 100644
index 000000000..0da5747bc
--- /dev/null
+++ b/hw/bsp/ch583/boards/yd-ch582m/board.h
@@ -0,0 +1,61 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ */
+
+/* metadata:
+ name: yd-ch582m from vcc-gnd studio
+ url: http://vcc-gnd.com/
+*/
+
+#ifndef BOARD_H_
+#define BOARD_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+// LED: PB4 on yd-ch582m board
+#define LED_PIN GPIO_Pin_4
+#define LED_STATE_ON 0
+
+// Directly reuse BOOT pin as user button
+#define BUTTON_PIN GPIO_Pin_22
+#define BUTTON_STATE_ACTIVE 0
+
+// UART: UART1 TX=PA9, RX=PA8
+#define CFG_BOARD_UART_BAUDRATE 115200
+
+// Device only on USB1 (rhport 0). CH58x host / USB2 is not supported by the shared usbfs dcd;
+// BOARD_TUH_RHPORT is kept commented out to ease re-adding host later.
+#ifndef BOARD_TUD_RHPORT
+#define BOARD_TUD_RHPORT 0
+#endif
+// #ifndef BOARD_TUH_RHPORT
+// #define BOARD_TUH_RHPORT 1
+// #endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/hw/bsp/ch583/boards/yd-ch582m/board.mk b/hw/bsp/ch583/boards/yd-ch582m/board.mk
new file mode 100644
index 000000000..a13979799
--- /dev/null
+++ b/hw/bsp/ch583/boards/yd-ch582m/board.mk
@@ -0,0 +1,3 @@
+LDFLAGS += \
+ -Wl,--defsym=__FLASH_SIZE=448K \
+ -Wl,--defsym=__RAM_SIZE=32K \
diff --git a/hw/bsp/ch583/ch583_it.c b/hw/bsp/ch583/ch583_it.c
new file mode 100644
index 000000000..8479c537a
--- /dev/null
+++ b/hw/bsp/ch583/ch583_it.c
@@ -0,0 +1,37 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "ch583_it.h"
+
+// NMI exception handler
+__INTERRUPT __HIGH_CODE void NMI_Handler(void) {
+ while (1) {}
+}
+
+// Hard Fault exception handler
+__INTERRUPT __HIGH_CODE void HardFault_Handler(void) {
+ while (1) {}
+}
diff --git a/hw/bsp/ch583/ch583_it.h b/hw/bsp/ch583/ch583_it.h
new file mode 100644
index 000000000..29d175403
--- /dev/null
+++ b/hw/bsp/ch583/ch583_it.h
@@ -0,0 +1,46 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef CH583_IT_H_
+#define CH583_IT_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "CH58x_common.h"
+
+void NMI_Handler(void);
+void HardFault_Handler(void);
+void USB_IRQHandler(void);
+// void USB2_IRQHandler(void); // host on USB2 (rhport 1) — re-add together with the host driver
+void SysTick_Handler(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* CH583_IT_H_ */
diff --git a/hw/bsp/ch583/debug_uart.c b/hw/bsp/ch583/debug_uart.c
new file mode 100644
index 000000000..850e40718
--- /dev/null
+++ b/hw/bsp/ch583/debug_uart.c
@@ -0,0 +1,86 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "debug_uart.h"
+#include "CH58x_common.h"
+
+//--------------------------------------------------------------------+
+// Ring buffer based UART TX for non-blocking writes
+//--------------------------------------------------------------------+
+
+#define UART_RINGBUFFER_SIZE_TX 128
+#define UART_RINGBUFFER_MASK_TX (UART_RINGBUFFER_SIZE_TX - 1)
+
+static char tx_buf[UART_RINGBUFFER_SIZE_TX];
+static uint32_t tx_produce;
+static volatile uint32_t tx_consume;
+
+void uart_write(char c) {
+ uint32_t tx_produce_next = (tx_produce + 1) & UART_RINGBUFFER_MASK_TX;
+
+ // If the ring buffer is full, drain it here as the FIFO frees up: nothing else advances
+ // tx_consume between uart_write() calls, so a plain spin would deadlock on a >buffer-size burst.
+ while (tx_produce_next == tx_consume) {
+ if (R8_UART1_LSR & RB_LSR_TX_FIFO_EMP) {
+ R8_UART1_THR = tx_buf[tx_consume];
+ tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
+ }
+ }
+
+ // If UART TX FIFO is empty and no pending data, send directly
+ if ((tx_consume == tx_produce) && (R8_UART1_LSR & RB_LSR_TX_FIFO_EMP)) {
+ R8_UART1_THR = c;
+ } else {
+ tx_buf[tx_produce] = c;
+ tx_produce = tx_produce_next;
+ }
+}
+
+void uart_sync(void) {
+ // Wait for ring buffer to drain
+ while (tx_consume != tx_produce) {
+ if (R8_UART1_LSR & RB_LSR_TX_FIFO_EMP) {
+ R8_UART1_THR = tx_buf[tx_consume];
+ tx_consume = (tx_consume + 1) & UART_RINGBUFFER_MASK_TX;
+ }
+ }
+ // Wait for last byte to finish transmitting
+ while (!(R8_UART1_LSR & RB_LSR_TX_ALL_EMP)) {}
+}
+
+void usart_printf_init(uint32_t baudrate) {
+ tx_produce = 0;
+ tx_consume = 0;
+
+ // Configure UART1 pins: TX=PA9, RX=PA8
+ GPIOA_SetBits(GPIO_Pin_9);
+ GPIOA_ModeCfg(GPIO_Pin_9, GPIO_ModeOut_PP_5mA);
+ GPIOA_ModeCfg(GPIO_Pin_8, GPIO_ModeIN_PU);
+
+ // Init UART1 with specified baud rate
+ UART1_DefInit();
+ UART1_BaudRateCfg(baudrate);
+}
diff --git a/hw/bsp/ch583/debug_uart.h b/hw/bsp/ch583/debug_uart.h
new file mode 100644
index 000000000..44c3e7948
--- /dev/null
+++ b/hw/bsp/ch583/debug_uart.h
@@ -0,0 +1,44 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef DEBUG_UART_H_
+#define DEBUG_UART_H_
+
+#include <stdint.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void uart_write(char c);
+void uart_sync(void);
+void usart_printf_init(uint32_t baudrate);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* DEBUG_UART_H_ */
diff --git a/hw/bsp/ch583/family.c b/hw/bsp/ch583/family.c
new file mode 100644
index 000000000..716e2b76b
--- /dev/null
+++ b/hw/bsp/ch583/family.c
@@ -0,0 +1,194 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ manufacturer: WCH
+*/
+
+// WCH SDK's DEBUG macro enables a _write() that conflicts with TinyUSB's.
+// TinyUSB uses UART1 for printf via debug_uart.c, so DEBUG is not needed.
+// If you need a different UART or want to keep SDK's DEBUG, modify
+// debug_uart.c (TinyUSB side) or CH58x_sys.c (SDK side) to remove one _write().
+// If done, remove this #error to continue.
+#ifdef DEBUG
+ #error "Remove the DEBUG macro from preprocessor defines to avoid " \
+ "duplicate _write() between WCH SDK and TinyUSB. " \
+ "TinyUSB uses UART1 by default (see debug_uart.c)."
+#endif
+
+#include "debug_uart.h"
+#include "CH58x_common.h"
+#include "ch583_it.h"
+
+#include "bsp/board_api.h"
+#include "board.h"
+
+//--------------------------------------------------------------------+
+// Forward USB interrupt events to TinyUSB IRQ Handler
+//--------------------------------------------------------------------+
+
+// Device only: the shared dcd_ch32_usbfs.c drives USB0 (rhport 0). CH58x's second controller
+// (USB2 / rhport 1) was driven by the now-removed ch58x host driver; its handler is kept
+// commented out below to ease re-adding host support.
+__INTERRUPT __HIGH_CODE void USB_IRQHandler(void) {
+ tusb_int_handler(0, true);
+}
+
+// __INTERRUPT __HIGH_CODE void USB2_IRQHandler(void) {
+// tusb_int_handler(1, true);
+// }
+
+//--------------------------------------------------------------------+
+// SysTick
+//--------------------------------------------------------------------+
+
+#if CFG_TUSB_OS == OPT_OS_NONE
+volatile uint32_t system_ticks = 0;
+
+__INTERRUPT __HIGH_CODE void SysTick_Handler(void) {
+ SysTick->SR = 0;
+ system_ticks++;
+}
+
+uint32_t tusb_time_millis_api(void) {
+ return system_ticks;
+}
+#endif
+
+//--------------------------------------------------------------------+
+// Board Init
+//--------------------------------------------------------------------+
+
+void board_init(void) {
+ // Disable interrupts during init
+ PFIC_DisableAllIRQ();
+
+ // Set system clock to PLL 60MHz (default for CH582)
+ SetSysClock(CLK_SOURCE_PLL_60MHz);
+
+#if CFG_TUSB_OS == OPT_OS_NONE
+ SysTick_Config(GetSysClock() / 1000);
+#endif
+
+ // UART1 init for debug output
+#ifdef CFG_BOARD_UART_BAUDRATE
+ usart_printf_init(CFG_BOARD_UART_BAUDRATE);
+#endif
+
+ // LED
+#ifdef LED_PORT_IS_A
+ GPIOA_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA);
+#else
+ GPIOB_ModeCfg(LED_PIN, GPIO_ModeOut_PP_5mA);
+#endif
+
+ // Button
+#ifdef BUTTON_PIN
+ #ifdef BUTTON_PORT_IS_A
+ GPIOA_ModeCfg(BUTTON_PIN, GPIO_ModeIN_PU);
+ #else
+ GPIOB_ModeCfg(BUTTON_PIN, GPIO_ModeIN_PU);
+ #endif
+#endif
+
+ // Device only on USB0 (rhport 0): enable analog function for USB1 D+/D- and assert its D+
+ // pull-up. The shared dcd_ch32_usbfs.c drives USB0; CH58x host / USB2 (rhport 1) is unsupported
+ // here — to re-add host, also OR in RB_PIN_USB2_IE below.
+ R16_PIN_ANALOG_IE |= RB_PIN_USB_IE; // | RB_PIN_USB2_IE (re-add for host on USB2)
+#if CFG_TUD_ENABLED
+ R16_PIN_ANALOG_IE |= RB_PIN_USB_DP_PU;
+#endif
+
+ // Keep USB clock active during sleep
+ R8_SLP_CLK_OFF1 &= ~RB_SLP_CLK_USB;
+
+ // Enable interrupts globally
+ PFIC_EnableAllIRQ();
+
+ board_delay(2);
+}
+
+//--------------------------------------------------------------------+
+// Board porting API
+//--------------------------------------------------------------------+
+
+void board_led_write(bool state) {
+#ifdef LED_PORT_IS_A
+ if (state ^ LED_STATE_ON) {
+ GPIOA_ResetBits(LED_PIN);
+ } else {
+ GPIOA_SetBits(LED_PIN);
+ }
+#else
+ if (state ^ LED_STATE_ON) {
+ GPIOB_ResetBits(LED_PIN);
+ } else {
+ GPIOB_SetBits(LED_PIN);
+ }
+#endif
+}
+
+uint32_t board_button_read(void) {
+#ifdef BUTTON_PIN
+ #ifdef BUTTON_PORT_IS_A
+ return BUTTON_STATE_ACTIVE == (GPIOA_ReadPortPin(BUTTON_PIN) ? 1 : 0);
+ #else
+ return BUTTON_STATE_ACTIVE == (GPIOB_ReadPortPin(BUTTON_PIN) ? 1 : 0);
+ #endif
+#else
+ return 0;
+#endif
+}
+
+// CH58x has no memory-mapped unique-ID register (unlike ch32v10x/v20x at 0x1FFFF7E8), but the
+// factory programs a unique 6-byte MAC address into FlashROM (it is a BLE part). GetMACAddress()
+// reads it via the ISP ROM command FLASH_EEPROM_CMD, which is provided by libISP583.a.
+size_t board_get_unique_id(uint8_t id[], size_t max_len) {
+ // FLASH_EEPROM_CMD writes word-granular and requires a 4-byte-aligned buffer (CH58x_flash.c);
+ // size 8 matches the SDK's GET_UNIQUE_ID buffer (6 MAC bytes + 2 it pads), so the read can't
+ // run past the end whether it returns 6 or a full 8.
+ TU_ATTR_ALIGNED(4) uint8_t mac[8];
+ GetMACAddress(mac);
+ size_t len = TU_MIN(max_len, (size_t) 6); // the 6-byte MAC is the unique part
+ memcpy(id, mac, len);
+ return len;
+}
+
+int board_uart_read(uint8_t* buf, int len) {
+ (void) buf;
+ (void) len;
+ return 0;
+}
+
+int board_uart_write(void const* buf, int len) {
+ int txsize = len;
+ const char* bufc = (const char*) buf;
+ while (txsize--) {
+ uart_write(*bufc++);
+ }
+ uart_sync();
+ return len;
+}
diff --git a/hw/bsp/ch583/family.cmake b/hw/bsp/ch583/family.cmake
new file mode 100644
index 000000000..a379298e5
--- /dev/null
+++ b/hw/bsp/ch583/family.cmake
@@ -0,0 +1,108 @@
+include_guard()
+
+set(SDK_DIR ${TOP}/hw/mcu/wch/ch583)
+set(SDK_SRC_DIR ${SDK_DIR}/EVT/EXAM/SRC)
+
+# include board specific
+include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+
+# toolchain set up
+set(CMAKE_SYSTEM_CPU rv32imac-ilp32 CACHE INTERNAL "System Processor")
+set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/riscv_${TOOLCHAIN}.cmake)
+
+set(FAMILY_MCUS CH583 CACHE INTERNAL "")
+set(OPENOCD_OPTION "-f ${CMAKE_CURRENT_LIST_DIR}/wch-riscv.cfg")
+
+#------------------------------------
+# Startup & Linker script
+#------------------------------------
+if (NOT DEFINED LD_FILE_GNU)
+ set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/linker/ch582.ld)
+endif ()
+set(LD_FILE_Clang ${LD_FILE_GNU})
+if (NOT DEFINED STARTUP_FILE_GNU)
+ set(STARTUP_FILE_GNU ${SDK_SRC_DIR}/Startup/startup_CH583.S)
+endif ()
+set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})
+
+#------------------------------------
+# Board Target
+#------------------------------------
+function(family_add_board BOARD_TARGET)
+ add_library(${BOARD_TARGET} STATIC
+ ${SDK_SRC_DIR}/StdPeriphDriver/CH58x_gpio.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/CH58x_clk.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/CH58x_uart1.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/CH58x_sys.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/ch583_it.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_ch583.c
+ )
+ target_include_directories(${BOARD_TARGET} PUBLIC
+ ${SDK_SRC_DIR}/RVMSIS
+ ${SDK_SRC_DIR}/StdPeriphDriver/inc
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ )
+ target_link_libraries(${BOARD_TARGET} PUBLIC
+ ${SDK_SRC_DIR}/StdPeriphDriver/libISP583.a
+ )
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ CFG_TUD_WCH_USBIP_USBFS=1
+ FREQ_SYS=60000000
+ DISK_LIB_ENABLE=0
+ INT_SOFT
+ )
+
+ update_board(${BOARD_TARGET})
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ target_compile_options(${BOARD_TARGET} PUBLIC
+ -flto
+ -msmall-data-limit=16
+ -mno-save-restore
+ -fmessage-length=0
+ -fsigned-char
+ -Wno-error=strict-prototypes
+ )
+ endif ()
+endfunction()
+
+#------------------------------------
+# Functions
+#------------------------------------
+function(family_configure_example TARGET RTOS)
+ family_configure_common(${TARGET} ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_CH583)
+
+ target_sources(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/debug_uart.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
+ ${TOP}/src/portable/wch/dcd_ch32_usbfs.c
+ ${STARTUP_FILE_${CMAKE_C_COMPILER_ID}}
+ )
+ target_include_directories(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
+ )
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ target_link_options(${TARGET} PUBLIC
+ -nostartfiles
+ --specs=nosys.specs --specs=nano.specs
+ -Wl,--defsym=__FLASH_SIZE=${LD_FLASH_SIZE}
+ -Wl,--defsym=__RAM_SIZE=${LD_RAM_SIZE}
+ "LINKER:--script=${LD_FILE_GNU}"
+ )
+ elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ message(FATAL_ERROR "Clang is not supported for CH58x")
+ endif ()
+
+ set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES
+ SKIP_LINTING ON
+ COMPILE_OPTIONS -w)
+
+ # Flashing
+ family_add_bin_hex(${TARGET})
+ family_flash_openocd_wch(${TARGET})
+endfunction()
diff --git a/hw/bsp/ch583/family.mk b/hw/bsp/ch583/family.mk
new file mode 100644
index 000000000..98d0f9337
--- /dev/null
+++ b/hw/bsp/ch583/family.mk
@@ -0,0 +1,59 @@
+# https://www.embecosm.com/resources/tool-chain-downloads/#riscv-stable
+#CROSS_COMPILE ?= riscv32-unknown-elf-
+
+# Toolchain from https://nucleisys.com/download.php
+#CROSS_COMPILE ?= riscv-nuclei-elf-
+
+# Toolchain from https://github.com/xpack-dev-tools/riscv-none-elf-gcc-xpack
+CROSS_COMPILE ?= riscv-none-elf-
+
+SDK_DIR = hw/mcu/wch/ch583
+SDK_SRC_DIR = $(SDK_DIR)/EVT/EXAM/SRC
+
+include $(TOP)/$(BOARD_PATH)/board.mk
+CPU_CORE ?= rv32imac-ilp32
+
+CFLAGS += \
+ -flto \
+ -msmall-data-limit=16 \
+ -mno-save-restore \
+ -fmessage-length=0 \
+ -fsigned-char \
+ -DCFG_TUSB_MCU=OPT_MCU_CH583 \
+ -DCFG_TUD_WCH_USBIP_USBFS=1 \
+ -DFREQ_SYS=60000000 \
+ -DDISK_LIB_ENABLE=0 \
+ -DINT_SOFT \
+ -Wno-error=strict-prototypes
+
+LDFLAGS += \
+ -nostartfiles \
+ --specs=nosys.specs --specs=nano.specs
+
+LIBS += $(TOP)/$(SDK_SRC_DIR)/StdPeriphDriver/libISP583.a
+
+SRC_C += \
+ src/portable/wch/dcd_ch32_usbfs.c \
+ $(SDK_SRC_DIR)/StdPeriphDriver/CH58x_gpio.c \
+ $(SDK_SRC_DIR)/StdPeriphDriver/CH58x_clk.c \
+ $(SDK_SRC_DIR)/StdPeriphDriver/CH58x_uart1.c \
+ $(SDK_SRC_DIR)/StdPeriphDriver/CH58x_sys.c \
+ $(FAMILY_PATH)/debug_uart.c \
+ $(FAMILY_PATH)/ch583_it.c \
+ $(FAMILY_PATH)/system_ch583.c
+
+SRC_S += \
+ $(SDK_SRC_DIR)/Startup/startup_CH583.S
+
+INC += \
+ $(TOP)/$(BOARD_PATH) \
+ $(TOP)/$(SDK_SRC_DIR)/RVMSIS \
+ $(TOP)/$(SDK_SRC_DIR)/StdPeriphDriver/inc
+
+LD_FILE ?= $(FAMILY_PATH)/linker/ch582.ld
+
+OPENOCD_WCH_OPTION=-f $(TOP)/$(FAMILY_PATH)/wch-riscv.cfg
+flash: flash-openocd-wch
+
+# For freeRTOS port source
+FREERTOS_PORTABLE_SRC = $(FREERTOS_PORTABLE_PATH)/RISC-V
diff --git a/hw/bsp/ch583/linker/ch582.ld b/hw/bsp/ch583/linker/ch582.ld
new file mode 100644
index 000000000..821998a49
--- /dev/null
+++ b/hw/bsp/ch583/linker/ch582.ld
@@ -0,0 +1,167 @@
+/* CH582 Linker Script for TinyUSB
+ * Based on WCH CH583 SDK Link.ld
+ * Supports parameterized flash/ram sizes via --defsym
+ */
+
+/* Default sizes if not provided via --defsym */
+__flash_size = DEFINED(__FLASH_SIZE) ? __FLASH_SIZE : 448K;
+__ram_size = DEFINED(__RAM_SIZE) ? __RAM_SIZE : 32K;
+__stack_size = DEFINED(__STACK_SIZE) ? __STACK_SIZE : 2048;
+
+ENTRY( _start )
+
+PROVIDE( _stack_size = __stack_size );
+
+MEMORY
+{
+ FLASH (rx) : ORIGIN = 0x00000000, LENGTH = __flash_size
+ RAM (xrw) : ORIGIN = 0x20000000, LENGTH = __ram_size
+}
+
+SECTIONS
+{
+ .init :
+ {
+ _sinit = .;
+ . = ALIGN(4);
+ KEEP(*(SORT_NONE(.init)))
+ . = ALIGN(4);
+ _einit = .;
+ } >FLASH AT>FLASH
+
+ .highcodelalign :
+ {
+ . = ALIGN(4);
+ PROVIDE(_highcode_lma = .);
+ } >FLASH AT>FLASH
+
+ .highcode :
+ {
+ . = ALIGN(4);
+ PROVIDE(_highcode_vma_start = .);
+ *(.vector);
+ KEEP(*(SORT_NONE(.vector_handler)))
+ *(.highcode);
+ *(.highcode.*);
+ . = ALIGN(4);
+ PROVIDE(_highcode_vma_end = .);
+ } >RAM AT>FLASH
+
+ .text :
+ {
+ . = ALIGN(4);
+ KEEP(*(SORT_NONE(.handle_reset)))
+ *(.text)
+ *(.text.*)
+ *(.rodata)
+ *(.rodata*)
+ *(.sdata2.*)
+ *(.glue_7)
+ *(.glue_7t)
+ *(.gnu.linkonce.t.*)
+ . = ALIGN(4);
+ } >FLASH AT>FLASH
+
+ .fini :
+ {
+ KEEP(*(SORT_NONE(.fini)))
+ . = ALIGN(4);
+ } >FLASH AT>FLASH
+
+ PROVIDE( _etext = . );
+ PROVIDE( _eitcm = . );
+
+ .preinit_array :
+ {
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array))
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ } >FLASH AT>FLASH
+
+ .init_array :
+ {
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*)))
+ KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors))
+ PROVIDE_HIDDEN (__init_array_end = .);
+ } >FLASH AT>FLASH
+
+ .fini_array :
+ {
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*)))
+ KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors))
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ } >FLASH AT>FLASH
+
+ .ctors :
+ {
+ KEEP (*crtbegin.o(.ctors))
+ KEEP (*crtbegin?.o(.ctors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors))
+ KEEP (*(SORT(.ctors.*)))
+ KEEP (*(.ctors))
+ } >FLASH AT>FLASH
+
+ .dtors :
+ {
+ KEEP (*crtbegin.o(.dtors))
+ KEEP (*crtbegin?.o(.dtors))
+ KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors))
+ KEEP (*(SORT(.dtors.*)))
+ KEEP (*(.dtors))
+ } >FLASH AT>FLASH
+
+ .dlalign :
+ {
+ . = ALIGN(4);
+ PROVIDE(_data_lma = .);
+ } >FLASH AT>FLASH
+
+ .data :
+ {
+ . = ALIGN(4);
+ PROVIDE(_data_vma = .);
+ *(.gnu.linkonce.r.*)
+ *(.data .data.*)
+ *(.gnu.linkonce.d.*)
+ . = ALIGN(8);
+ PROVIDE( __global_pointer$ = . + 0x800 );
+ *(.sdata .sdata.*)
+ *(.gnu.linkonce.s.*)
+ . = ALIGN(8);
+ *(.srodata.cst16)
+ *(.srodata.cst8)
+ *(.srodata.cst4)
+ *(.srodata.cst2)
+ *(.srodata .srodata.*)
+ . = ALIGN(4);
+ PROVIDE( _edata = .);
+ } >RAM AT>FLASH
+
+ .bss :
+ {
+ . = ALIGN(4);
+ PROVIDE( _sbss = .);
+ *(.sbss*)
+ *(.gnu.linkonce.sb.*)
+ *(.bss*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON*)
+ . = ALIGN(4);
+ PROVIDE( _ebss = .);
+ } >RAM AT>FLASH
+
+ PROVIDE( _end = _ebss);
+ PROVIDE( end = . );
+
+ .stack ORIGIN(RAM) + LENGTH(RAM) - __stack_size :
+ {
+ PROVIDE( _heap_end = . );
+ . = ALIGN(4);
+ PROVIDE(_susrstack = . );
+ . = . + __stack_size;
+ PROVIDE( _eusrstack = .);
+ __freertos_irq_stack_top = .;
+ } >RAM
+}
diff --git a/hw/bsp/ch583/system_ch583.c b/hw/bsp/ch583/system_ch583.c
new file mode 100644
index 000000000..d3724f0ce
--- /dev/null
+++ b/hw/bsp/ch583/system_ch583.c
@@ -0,0 +1,39 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#include "CH58x_common.h"
+#include "system_ch583.h"
+
+uint32_t SystemCoreClock = FREQ_SYS;
+
+void SystemInit(void) {
+ SetSysClock(CLK_SOURCE_PLL_60MHz);
+ SystemCoreClock = GetSysClock();
+}
+
+void SystemCoreClockUpdate(void) {
+ SystemCoreClock = GetSysClock();
+}
diff --git a/hw/bsp/ch583/system_ch583.h b/hw/bsp/ch583/system_ch583.h
new file mode 100644
index 000000000..c174c9f5e
--- /dev/null
+++ b/hw/bsp/ch583/system_ch583.h
@@ -0,0 +1,43 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2024 TinyUSB contributors
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+#ifndef SYSTEM_CH583_H_
+#define SYSTEM_CH583_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern uint32_t SystemCoreClock; // System Clock Frequency (Core Clock)
+
+extern void SystemInit(void);
+extern void SystemCoreClockUpdate(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* SYSTEM_CH583_H_ */
diff --git a/hw/bsp/ch583/wch-riscv.cfg b/hw/bsp/ch583/wch-riscv.cfg
new file mode 100644
index 000000000..64d595d8e
--- /dev/null
+++ b/hw/bsp/ch583/wch-riscv.cfg
@@ -0,0 +1,17 @@
+adapter driver wlinke
+adapter speed 6000
+transport select sdi
+
+wlink_set_address 0x00000000
+set _CHIPNAME wch_riscv
+sdi newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x00001
+
+set _TARGETNAME $_CHIPNAME.cpu
+
+target create $_TARGETNAME.0 wch_riscv -chain-position $_TARGETNAME
+$_TARGETNAME.0 configure -work-area-phys 0x20000000 -work-area-size 0x8000 -work-area-backup 1
+set _FLASHNAME $_CHIPNAME.flash
+
+flash bank $_FLASHNAME wch_riscv 0x00000000 0 0 0 $_TARGETNAME.0
+
+echo "Ready for Remote Connections"
diff --git a/hw/bsp/espressif/boards/family.c b/hw/bsp/espressif/boards/family.c
index 48b1253b6..4b28cecf2 100644
--- a/hw/bsp/espressif/boards/family.c
+++ b/hw/bsp/espressif/boards/family.c
@@ -49,7 +49,7 @@ static led_strip_handle_t led_strip;
static void max3421_init(void);
#endif
-#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4)
+#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4, OPT_MCU_ESP32S31)
static bool usb_init(uint8_t rhport, bool is_host);
#endif
@@ -111,10 +111,6 @@ void board_init(void) {
#endif
}
-#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4)
-
-#endif
-
//--------------------------------------------------------------------+
// Board porting API
//--------------------------------------------------------------------+
@@ -178,7 +174,7 @@ void board_reset_to_bootloader(void) {
// PHY Init
//--------------------------------------------------------------------
-#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4)
+#if TU_CHECK_MCU(OPT_MCU_ESP32S2, OPT_MCU_ESP32S3, OPT_MCU_ESP32H4, OPT_MCU_ESP32P4, OPT_MCU_ESP32S31)
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 3, 0)
#include "esp_private/usb_phy.h"
diff --git a/hw/bsp/espressif/family.cmake b/hw/bsp/espressif/family.cmake
index ca9eadaf6..b3bda4ad8 100644
--- a/hw/bsp/espressif/family.cmake
+++ b/hw/bsp/espressif/family.cmake
@@ -2,7 +2,10 @@
include("${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake")
string(TOUPPER ${IDF_TARGET} FAMILY_MCUS)
-# Device port default to Port1 for P4 (highspeed), Port0 for others (fullspeed)
+# Device/host port defaults:
+# - ESP32-P4 uses Port1 (highspeed)
+# - ESP32-S31 uses Port0 (highspeed)
+# - Other targets use Port0 and derive the default speed from RHPORT_SPEED
set(RHPORT_SPEED OPT_MODE_FULL_SPEED OPT_MODE_HIGH_SPEED)
if (NOT DEFINED RHPORT_DEVICE)
@@ -22,10 +25,18 @@ if (NOT DEFINED RHPORT_HOST)
endif()
if (NOT DEFINED RHPORT_DEVICE_SPEED)
- list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)
+ if (IDF_TARGET STREQUAL "esp32s31")
+ set(RHPORT_DEVICE_SPEED OPT_MODE_HIGH_SPEED)
+ else ()
+ list(GET RHPORT_SPEED ${RHPORT_DEVICE} RHPORT_DEVICE_SPEED)
+ endif ()
endif ()
if (NOT DEFINED RHPORT_HOST_SPEED)
- list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)
+ if (IDF_TARGET STREQUAL "esp32s31")
+ set(RHPORT_HOST_SPEED OPT_MODE_HIGH_SPEED)
+ else ()
+ list(GET RHPORT_SPEED ${RHPORT_HOST} RHPORT_HOST_SPEED)
+ endif ()
endif ()
# Add example src and bsp directories
@@ -33,3 +44,10 @@ set(EXTRA_COMPONENT_DIRS "src" "${CMAKE_CURRENT_LIST_DIR}/boards" "${CMAKE_CURRE
set(SDKCONFIG ${CMAKE_BINARY_DIR}/sdkconfig)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
+
+# CI_BUILD marks firmware built in CI (GitHub Actions sets CI). Mirrors the
+# non-espressif define added in family_configure_common(); applied build-wide
+# here since espressif examples return before that function runs.
+if(DEFINED ENV{CI})
+ idf_build_set_property(COMPILE_DEFINITIONS "CI_BUILD=1" APPEND)
+endif()
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index cb8ec6cf8..1f3952205 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -244,7 +244,7 @@ function(family_add_bloaty TARGET)
COMMAND ${BLOATY_EXE} ${OPTION_LIST} $<TARGET_FILE:${TARGET}>
VERBATIM)
- set_property(TARGET ${TARGET}-bloaty PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-bloaty PROPERTY FOLDER ${TARGET}-group)
# post build
# add_custom_command(TARGET ${TARGET} POST_BUILD
# COMMAND ${BLOATY_EXE} --csv ${OPTION_LIST} $<TARGET_FILE:${TARGET}> > ${CMAKE_CURRENT_BINARY_DIR}/${TARGET}_bloaty.csv
@@ -265,7 +265,7 @@ function(family_add_linkermap TARGET)
VERBATIM
)
- set_property(TARGET ${TARGET}-linkermap PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-linkermap PROPERTY FOLDER ${TARGET}-group)
# post build
add_custom_command(TARGET ${TARGET} POST_BUILD
@@ -326,10 +326,12 @@ ld_defs=\"$(echo \"$ld_defs\" | xargs)\"")
"if [ -f \"${TARGET_ELF_PATH}\" ]; then \
${MEMBROWSE_LD_SCRIPTS_CMD}; \
${MEMBROWSE_LD_DEFS_CMD}; \
+ map_arg=\"\"; \
+ if [ -f \"${TARGET_ELF_PATH}.map\" ]; then map_arg=\"--map-file \\\"${TARGET_ELF_PATH}.map\\\"\"; fi; \
if [ \"$MEMBROWSE_UPLOAD\" = \"1\" ]; then \
- MEMBROWSE_CMD=\"${MEMBROWSE_EXE} report ${OPTION} \\\"${TARGET_ELF_PATH}\\\" \\\"$ld_scripts\\\" $ld_defs --upload --github --target-name ${BOARD}/${TARGET} --api-key $ENV{MEMBROWSE_API_KEY}\"; \
+ MEMBROWSE_CMD=\"${MEMBROWSE_EXE} report ${OPTION} \\\"${TARGET_ELF_PATH}\\\" \\\"$ld_scripts\\\" $ld_defs $map_arg --upload --github --target-name ${BOARD}/${TARGET} --api-key $ENV{MEMBROWSE_API_KEY}\"; \
else \
- MEMBROWSE_CMD=\"${MEMBROWSE_EXE} report ${OPTION} \\\"${TARGET_ELF_PATH}\\\" \\\"$ld_scripts\\\" $ld_defs\"; \
+ MEMBROWSE_CMD=\"${MEMBROWSE_EXE} report ${OPTION} \\\"${TARGET_ELF_PATH}\\\" \\\"$ld_scripts\\\" $ld_defs $map_arg\"; \
fi; \
else \
if [ \"$MEMBROWSE_UPLOAD\" = \"1\" ]; then \
@@ -345,7 +347,7 @@ echo \"$MEMBROWSE_CMD\"")
COMMAND ${CMAKE_COMMAND} -E env MEMBROWSE_UPLOAD=0 bash -lc "${MEMBROWSE_PREPARE_CMD}; eval \"$MEMBROWSE_CMD\""
VERBATIM
)
- set_property(TARGET ${TARGET}-membrowse PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-membrowse PROPERTY FOLDER ${TARGET}-group)
add_custom_target(${TARGET}-membrowse-upload
COMMAND ${CMAKE_COMMAND} -E env MEMBROWSE_UPLOAD=1 bash -lc "${MEMBROWSE_PREPARE_CMD}; eval \"$MEMBROWSE_CMD\""
@@ -357,7 +359,7 @@ echo \"$MEMBROWSE_CMD\"")
endif ()
add_dependencies(examples-membrowse-upload ${TARGET}-membrowse-upload)
- set_property(TARGET ${TARGET}-membrowse-upload PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-membrowse-upload PROPERTY FOLDER ${TARGET}-group)
endif ()
endfunction()
@@ -452,6 +454,12 @@ function(family_configure_common TARGET RTOS)
BOARD_${BOARD_UPPER}
)
+ # CI_BUILD marks firmware built in CI (GitHub Actions sets CI). Examples can use
+ # it to alter behavior under test, e.g. board_test idles to park HIL boards.
+ if(DEFINED ENV{CI})
+ target_compile_definitions(${TARGET} PUBLIC CI_BUILD=1)
+ endif()
+
# compile define from command line
if(DEFINED CFLAGS_CLI)
separate_arguments(CFLAGS_CLI)
@@ -646,7 +654,7 @@ exit"
VERBATIM
)
- set_property(TARGET ${NAME_TARGET}-jlink PROPERTY FOLDER ${TARGET}-group)
+# set_property(TARGET ${NAME_TARGET}-jlink PROPERTY FOLDER ${NAME_TARGET}-group)
endfunction()
@@ -661,7 +669,7 @@ function(family_flash_stlink TARGET)
COMMAND ${STM32_PROGRAMMER_CLI} --connect port=swd --write $<TARGET_FILE:${TARGET}> --go
)
- set_property(TARGET ${TARGET}-stlink PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-stlink PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -676,7 +684,7 @@ function(family_flash_stflash TARGET)
COMMAND ${ST_FLASH} write $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin 0x8000000
)
- set_property(TARGET ${TARGET}-stflash PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-stflash PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -704,7 +712,7 @@ function(family_flash_openocd TARGET)
VERBATIM
)
- set_property(TARGET ${TARGET}-openocd PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-openocd PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -767,7 +775,7 @@ function(family_flash_wlink_rs TARGET)
COMMAND ${WLINK_RS} flash $<TARGET_FILE:${TARGET}>
)
- set_property(TARGET ${TARGET}-wlink-rs PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-wlink-rs PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -782,7 +790,7 @@ function(family_flash_pyocd TARGET)
COMMAND ${PYOCD} flash -t ${PYOCD_TARGET} $<TARGET_FILE:${TARGET}>
)
- set_property(TARGET ${TARGET}-pyocd PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-pyocd PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -792,7 +800,7 @@ function(family_flash_uf2 TARGET FAMILY_ID)
DEPENDS ${TARGET}
COMMAND python ${UF2CONV_PY} -f ${FAMILY_ID} --deploy $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.uf2
)
- set_property(TARGET ${TARGET}-uf2 PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-uf2 PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -808,7 +816,7 @@ function(family_flash_teensy TARGET)
COMMAND ${TEENSY_CLI} --mcu=${TEENSY_MCU} -w -s $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex
)
- set_property(TARGET ${TARGET}-teensy PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-teensy PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -828,7 +836,7 @@ function(family_flash_nxplink TARGET)
COMMAND ${LINKSERVER_PATH} flash ${NXPLINK_DEVICE} load $<TARGET_FILE:${TARGET}>
)
- set_property(TARGET ${TARGET}-nxplink PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-nxplink PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -843,7 +851,7 @@ function(family_flash_dfu_util TARGET OPTION)
VERBATIM
)
- set_property(TARGET ${TARGET}-dfu-util PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-dfu-util PROPERTY FOLDER ${TARGET}-group)
endfunction()
function(family_flash_msp430flasher TARGET)
@@ -860,7 +868,7 @@ function(family_flash_msp430flasher TARGET)
${MSP430FLASHER} -w $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.hex -z [VCC]
)
- set_property(TARGET ${TARGET}-msp430flasher PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-msp430flasher PROPERTY FOLDER ${TARGET}-group)
endfunction()
function(family_flash_rfp TARGET)
@@ -878,7 +886,7 @@ function(family_flash_rfp TARGET)
VERBATIM
)
- set_property(TARGET ${TARGET}-rfp PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-rfp PROPERTY FOLDER ${TARGET}-group)
endfunction()
@@ -895,7 +903,27 @@ function(family_flash_uniflash TARGET)
VERBATIM
)
- set_property(TARGET ${TARGET}-uniflash PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-uniflash PROPERTY FOLDER ${TARGET}-group)
+endfunction()
+
+# Add flash lm4flash target (lightweight flasher for TI Tiva-C/Stellaris ICDI boards)
+function(family_flash_lm4flash TARGET)
+ if (NOT DEFINED LM4FLASH)
+ set(LM4FLASH lm4flash)
+ endif ()
+
+ if (NOT DEFINED LM4FLASH_OPTION)
+ set(LM4FLASH_OPTION "")
+ endif ()
+ separate_arguments(OPTION_LIST UNIX_COMMAND ${LM4FLASH_OPTION})
+
+ add_custom_target(${TARGET}-lm4flash
+ DEPENDS ${TARGET}
+ COMMAND ${LM4FLASH} ${OPTION_LIST} $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin
+ VERBATIM
+ )
+
+ #set_property(TARGET ${TARGET}-lm4flash PROPERTY FOLDER ${TARGET}-group)
endfunction()
# Add flash ft9xx target need to remove kernal's ftdi_sio and bind D2XX drivers
@@ -910,7 +938,7 @@ function(family_flash_ft9xx TARGET)
COMMAND ${FT9XXPROG} -f $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin
)
- set_property(TARGET ${TARGET}-ft9xx PROPERTY FOLDER ${TARGET}-group)
+ #set_property(TARGET ${TARGET}-ft9xx PROPERTY FOLDER ${TARGET}-group)
endfunction()
#----------------------------------
diff --git a/hw/bsp/ft9xx/family.c b/hw/bsp/ft9xx/family.c
index 5ee134eb0..0ca2663ac 100644
--- a/hw/bsp/ft9xx/family.c
+++ b/hw/bsp/ft9xx/family.c
@@ -221,8 +221,8 @@ int board_uart_read(uint8_t *buf, int len)
// Send characters to UART
int board_uart_write(void const *buf, int len)
{
- int count = 0;
#ifdef BOARD_UART
+ int count = 0;
uint8_t const *p = (uint8_t const *) buf;
while (count < len) {
if (BOARD_UART->LSR_ICR_XON2 & MASK_UART_LSR_THRE) {
@@ -232,10 +232,11 @@ int board_uart_write(void const *buf, int len)
break;
}
}
+ return count;
#else
(void) buf; (void) len;
+ return -1;
#endif
- return count;
}
// Get current milliseconds
diff --git a/hw/bsp/gd32vf103/family.c b/hw/bsp/gd32vf103/family.c
index c1dc82bda..8f82b3ada 100644
--- a/hw/bsp/gd32vf103/family.c
+++ b/hw/bsp/gd32vf103/family.c
@@ -174,7 +174,7 @@ int board_uart_write(void const* buf, int len) {
#else
(void)buf;
(void)len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/imxrt/boards/metro_m7_1011/board.cmake b/hw/bsp/imxrt/boards/metro_m7_1011/board.cmake
index 63b2a120a..5edf6cc91 100644
--- a/hw/bsp/imxrt/boards/metro_m7_1011/board.cmake
+++ b/hw/bsp/imxrt/boards/metro_m7_1011/board.cmake
@@ -12,5 +12,6 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_MIMXRT1011DAE5A
CFG_EXAMPLE_VIDEO_READONLY
+ LWIP_HIGH_THROUGHPUT=0
)
endfunction()
diff --git a/hw/bsp/imxrt/boards/metro_m7_1011/board.mk b/hw/bsp/imxrt/boards/metro_m7_1011/board.mk
index 229b5c18c..fadb760b3 100644
--- a/hw/bsp/imxrt/boards/metro_m7_1011/board.mk
+++ b/hw/bsp/imxrt/boards/metro_m7_1011/board.mk
@@ -1,4 +1,4 @@
-CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY
+CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY -DLWIP_HIGH_THROUGHPUT=0
MCU_FAMILY = RT1010
MCU_VARIANT = MIMXRT1011
diff --git a/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake
index 63b2a120a..5edf6cc91 100644
--- a/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake
+++ b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.cmake
@@ -12,5 +12,6 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_MIMXRT1011DAE5A
CFG_EXAMPLE_VIDEO_READONLY
+ LWIP_HIGH_THROUGHPUT=0
)
endfunction()
diff --git a/hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk
index c5521faf5..81ec74d70 100644
--- a/hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk
+++ b/hw/bsp/imxrt/boards/mimxrt1010_evk/board.mk
@@ -1,4 +1,4 @@
-CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY
+CFLAGS += -DCPU_MIMXRT1011DAE5A -DCFG_EXAMPLE_VIDEO_READONLY -DLWIP_HIGH_THROUGHPUT=0
MCU_FAMILY = RT1010
MCU_VARIANT = MIMXRT1011
diff --git a/hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake b/hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake
index 5661bb3e6..fe74b8d33 100644
--- a/hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake
+++ b/hw/bsp/imxrt/boards/mimxrt1015_evk/board.cmake
@@ -12,5 +12,6 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_MIMXRT1015DAF5A
CFG_EXAMPLE_VIDEO_READONLY
+ LWIP_HIGH_THROUGHPUT=0
)
endfunction()
diff --git a/hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk b/hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk
index 062929902..a84263a81 100644
--- a/hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk
+++ b/hw/bsp/imxrt/boards/mimxrt1015_evk/board.mk
@@ -1,4 +1,4 @@
-CFLAGS += -DCPU_MIMXRT1015DAF5A -DCFG_EXAMPLE_VIDEO_READONLY
+CFLAGS += -DCPU_MIMXRT1015DAF5A -DCFG_EXAMPLE_VIDEO_READONLY -DLWIP_HIGH_THROUGHPUT=0
MCU_FAMILY = RT1015
MCU_VARIANT = MIMXRT1015
diff --git a/hw/bsp/kinetis_k/family.c b/hw/bsp/kinetis_k/family.c
index 8efab2762..a5af83931 100644
--- a/hw/bsp/kinetis_k/family.c
+++ b/hw/bsp/kinetis_k/family.c
@@ -140,7 +140,7 @@ int board_uart_write(void const *buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake
index 59f7d6329..ef20d7601 100644
--- a/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake
+++ b/hw/bsp/lpc55/boards/lpcxpresso55s69/board.cmake
@@ -2,7 +2,6 @@ set(MCU_VARIANT LPC55S69)
set(MCU_CORE LPC55S69_cm33_core0)
set(JLINK_DEVICE LPC55S69_M33_0)
-set(JLINK_OPTION "-USB 000727648789")
set(PYOCD_TARGET LPC55S69)
set(NXPLINK_DEVICE LPC55S69:LPCXpresso55S69)
diff --git a/hw/bsp/mm32/family.c b/hw/bsp/mm32/family.c
index 651c9496e..1538181dc 100644
--- a/hw/bsp/mm32/family.c
+++ b/hw/bsp/mm32/family.c
@@ -59,11 +59,11 @@ void OTG_FS_IRQHandler(void) {
void USB_DeviceClockInit(void) {
/* Select USBCLK source */
// RCC_USBCLKConfig(RCC_USBCLKSource_PLLCLK_Div1);
- RCC->CFGR &= ~(0x3 << 22);
- RCC->CFGR |= (0x1 << 22);
+ RCC->CFGR &= ~(0x3U << 22);
+ RCC->CFGR |= (0x1U << 22);
/* Enable USB clock */
- RCC->AHB2ENR |= 0x1 << 7;
+ RCC->AHB2ENR |= 0x1U << 7;
}
void board_init(void) {
@@ -167,7 +167,7 @@ int board_uart_write(void const* buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/nrf/boards/nrf54h20dk/board.cmake b/hw/bsp/nrf/boards/nrf54h20dk/board.cmake
index fca7a56d2..8095b59fe 100644
--- a/hw/bsp/nrf/boards/nrf54h20dk/board.cmake
+++ b/hw/bsp/nrf/boards/nrf54h20dk/board.cmake
@@ -1,7 +1,8 @@
set(MCU_VARIANT nrf54h20)
function(update_board TARGET)
- # temporarily, 54h20 has multiple sram sections
+ # 32 KB primary RAM is too tight for memory-heavy examples (e.g. video YUY2
+ # framebuf). TODO: route static .bss to RAM00 (512 KB) and drop this.
target_compile_definitions(${TARGET} PUBLIC
CFG_EXAMPLE_VIDEO_READONLY
)
diff --git a/hw/bsp/nrf/boards/nrf54h20dk/board.mk b/hw/bsp/nrf/boards/nrf54h20dk/board.mk
index c49b605e8..3333a76f1 100644
--- a/hw/bsp/nrf/boards/nrf54h20dk/board.mk
+++ b/hw/bsp/nrf/boards/nrf54h20dk/board.mk
@@ -1,6 +1,11 @@
MCU_VARIANT = nrf54h20
CFLAGS += -DNRF54H20_XXAA
+# 32 KB primary RAM is too tight for memory-heavy examples (e.g. video YUY2
+# framebuf). Match the CMake build (board.cmake) — TODO: route static .bss to
+# RAM00 (512 KB) and drop this.
+CFLAGS += -DCFG_EXAMPLE_VIDEO_READONLY
+
# enable max3421 host driver for this board
MAX3421_HOST = 1
diff --git a/hw/bsp/nrf/boards/nrf54lm20dk/board.cmake b/hw/bsp/nrf/boards/nrf54lm20dk/board.cmake
index 8c2b83346..e97b8822c 100644
--- a/hw/bsp/nrf/boards/nrf54lm20dk/board.cmake
+++ b/hw/bsp/nrf/boards/nrf54lm20dk/board.cmake
@@ -2,7 +2,6 @@ set(MCU_VARIANT nrf54lm20a_enga)
set(JLINK_DEVICE NRF54LM20A_M33)
function(update_board TARGET)
- target_compile_definitions(${TARGET} PUBLIC
- CFG_EXAMPLE_VIDEO_READONLY
- )
+ # No board-specific overrides needed — primary 256 KB RAM is plenty for
+ # memory-heavy examples (video YUY2 framebuf etc.).
endfunction()
diff --git a/hw/bsp/pic32mz/family.c b/hw/bsp/pic32mz/family.c
index 5805e653f..98038b4f7 100644
--- a/hw/bsp/pic32mz/family.c
+++ b/hw/bsp/pic32mz/family.c
@@ -102,7 +102,9 @@ TU_ATTR_WEAK int board_uart_read(uint8_t * buf, int len)
TU_ATTR_WEAK int board_uart_write(void const * buf, int len)
{
(void) buf;
- return len;
+ (void) len;
+
+ return -1;
}
#if CFG_TUSB_OS == OPT_OS_NONE
diff --git a/hw/bsp/rp2040/family.c b/hw/bsp/rp2040/family.c
index a4642face..55feec159 100644
--- a/hw/bsp/rp2040/family.c
+++ b/hw/bsp/rp2040/family.c
@@ -282,7 +282,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/rp2040/family.cmake b/hw/bsp/rp2040/family.cmake
index 6e88b9fa1..aab9a4fae 100644
--- a/hw/bsp/rp2040/family.cmake
+++ b/hw/bsp/rp2040/family.cmake
@@ -93,13 +93,13 @@ target_sources(tinyusb_device_base INTERFACE
${TOP}/src/portable/raspberrypi/rp2040/dcd_rp2040.c
${TOP}/src/portable/raspberrypi/rp2040/rp2040_usb.c
${TOP}/src/device/usbd.c
- ${TOP}/src/device/usbd_control.c
${TOP}/src/class/audio/audio_device.c
${TOP}/src/class/cdc/cdc_device.c
${TOP}/src/class/dfu/dfu_device.c
${TOP}/src/class/dfu/dfu_rt_device.c
${TOP}/src/class/hid/hid_device.c
${TOP}/src/class/midi/midi_device.c
+ ${TOP}/src/class/midi/midi2_device.c
${TOP}/src/class/msc/msc_device.c
${TOP}/src/class/mtp/mtp_device.c
${TOP}/src/class/net/ecm_rndis_device.c
@@ -122,6 +122,7 @@ target_sources(tinyusb_host_base INTERFACE
${TOP}/src/class/cdc/cdc_host.c
${TOP}/src/class/hid/hid_host.c
${TOP}/src/class/midi/midi_host.c
+ ${TOP}/src/class/midi/midi2_host.c
${TOP}/src/class/msc/msc_host.c
${TOP}/src/class/vendor/vendor_host.c
)
diff --git a/hw/bsp/samd11/family.c b/hw/bsp/samd11/family.c
index 0c987b85a..0864aa3dd 100644
--- a/hw/bsp/samd11/family.c
+++ b/hw/bsp/samd11/family.c
@@ -34,6 +34,8 @@
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
#endif
#include "hal/include/hal_gpio.h"
@@ -66,7 +68,7 @@ void USB_Handler(void)
//--------------------------------------------------------------------+
/* Referenced GCLKs, should be initialized firstly */
-#define _GCLK_INIT_1ST (1 << 0 | 1 << 1)
+#define _GCLK_INIT_1ST (1u << 0 | 1u << 1)
/* Not referenced GCLKs, initialized last */
#define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)
diff --git a/hw/bsp/samd2x_l2x/family.c b/hw/bsp/samd2x_l2x/family.c
index 11b6343cd..306ea2308 100644
--- a/hw/bsp/samd2x_l2x/family.c
+++ b/hw/bsp/samd2x_l2x/family.c
@@ -79,7 +79,7 @@
#ifdef SAMD21_FAMILY
/* Referenced GCLKs, should be initialized firstly */
-#define _GCLK_INIT_1ST (1 << 0 | 1 << 1)
+#define _GCLK_INIT_1ST (1u << 0 | 1u << 1)
/* Not referenced GCLKs, initialized last */
#define _GCLK_INIT_LAST (~_GCLK_INIT_1ST)
#endif
diff --git a/hw/bsp/samg/family.c b/hw/bsp/samg/family.c
index 519068986..9edc43b51 100644
--- a/hw/bsp/samg/family.c
+++ b/hw/bsp/samg/family.c
@@ -27,15 +27,17 @@
manufacturer: Microchip
*/
-#include "sam.h"
// Suppress warning caused by mcu driver
#ifdef __GNUC__
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wcast-qual"
#pragma GCC diagnostic ignored "-Wredundant-decls"
+#pragma GCC diagnostic ignored "-Wconversion"
+#pragma GCC diagnostic ignored "-Wsign-conversion"
#endif
+#include "sam.h"
#include "peripheral_clk_config.h"
#include "hal/include/hal_init.h"
#include "hal/include/hpl_usart_sync.h"
diff --git a/hw/bsp/stm32c0/family.c b/hw/bsp/stm32c0/family.c
index 72af3ce7f..ac37045fb 100644
--- a/hw/bsp/stm32c0/family.c
+++ b/hw/bsp/stm32c0/family.c
@@ -193,7 +193,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32c5/FreeRTOSConfig/FreeRTOSConfig.h b/hw/bsp/stm32c5/FreeRTOSConfig/FreeRTOSConfig.h
new file mode 100644
index 000000000..732d9a5cf
--- /dev/null
+++ b/hw/bsp/stm32c5/FreeRTOSConfig/FreeRTOSConfig.h
@@ -0,0 +1,165 @@
+/*
+ * FreeRTOS Kernel V10.0.0
+ * Copyright (C) 2017 Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
+ * the Software, and to permit persons to whom the Software is furnished to do so,
+ * subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software. If you wish to use our Amazon
+ * FreeRTOS name, please do so in a fair use way that does not cause confusion.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ *
+ * http://www.FreeRTOS.org
+ * http://aws.amazon.com/freertos
+ *
+ * 1 tab == 4 spaces!
+ */
+
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+// skip if included from IAR assembler
+#ifndef __IASMARM__
+ #include "stm32c5xx.h"
+#endif
+
+/* Cortex M23/M33 port configuration. */
+#define configENABLE_MPU 0
+#define configENABLE_FPU 1
+#define configENABLE_TRUSTZONE 0
+#define configMINIMAL_SECURE_STACK_SIZE (1024)
+
+#define configUSE_PREEMPTION 1
+#define configUSE_PORT_OPTIMISED_TASK_SELECTION 0
+#define configCPU_CLOCK_HZ SystemCoreClock
+#define configTICK_RATE_HZ ( 1000 )
+#define configMAX_PRIORITIES ( 5 )
+#define configMINIMAL_STACK_SIZE ( 200 )
+#define configTOTAL_HEAP_SIZE ( configSUPPORT_DYNAMIC_ALLOCATION*4*1024 )
+#define configMAX_TASK_NAME_LEN 16
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 1
+#define configUSE_MUTEXES 1
+#define configUSE_RECURSIVE_MUTEXES 1
+#define configUSE_COUNTING_SEMAPHORES 1
+#define configQUEUE_REGISTRY_SIZE 4
+#define configUSE_QUEUE_SETS 0
+#define configUSE_TIME_SLICING 0
+#define configUSE_NEWLIB_REENTRANT 0
+#define configENABLE_BACKWARD_COMPATIBILITY 1
+#define configSTACK_ALLOCATION_FROM_SEPARATE_HEAP 0
+
+#define configSUPPORT_STATIC_ALLOCATION 1
+#define configSUPPORT_DYNAMIC_ALLOCATION 0
+
+/* Hook function related definitions. */
+#define configUSE_IDLE_HOOK 0
+#define configUSE_TICK_HOOK 0
+#define configUSE_MALLOC_FAILED_HOOK 0 // cause nested extern warning
+#define configCHECK_FOR_STACK_OVERFLOW 2
+#define configCHECK_HANDLER_INSTALLATION 0
+
+/* Run time and task stats gathering related definitions. */
+#define configGENERATE_RUN_TIME_STATS 0
+#define configRECORD_STACK_HIGH_ADDRESS 1
+#define configUSE_TRACE_FACILITY 1 // legacy trace
+#define configUSE_STATS_FORMATTING_FUNCTIONS 0
+
+/* Co-routine definitions. */
+#define configUSE_CO_ROUTINES 0
+#define configMAX_CO_ROUTINE_PRIORITIES 2
+
+/* Software timer related definitions. */
+#define configUSE_TIMERS 1
+#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES-2)
+#define configTIMER_QUEUE_LENGTH 32
+#define configTIMER_TASK_STACK_DEPTH configMINIMAL_STACK_SIZE
+
+/* Optional functions - most linkers will remove unused functions anyway. */
+#define INCLUDE_vTaskPrioritySet 0
+#define INCLUDE_uxTaskPriorityGet 0
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskSuspend 1 // required for queue, semaphore, mutex to be blocked indefinitely with portMAX_DELAY
+#define INCLUDE_xResumeFromISR 0
+#define INCLUDE_vTaskDelayUntil 1
+#define INCLUDE_vTaskDelay 1
+#define INCLUDE_xTaskGetSchedulerState 0
+#define INCLUDE_xTaskGetCurrentTaskHandle 1
+#define INCLUDE_uxTaskGetStackHighWaterMark 0
+#define INCLUDE_xTaskGetIdleTaskHandle 0
+#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
+#define INCLUDE_pcTaskGetTaskName 0
+#define INCLUDE_eTaskGetState 0
+#define INCLUDE_xEventGroupSetBitFromISR 0
+#define INCLUDE_xTimerPendFunctionCall 0
+
+/* Define to trap errors during development. */
+// Halt CPU (breakpoint) when hitting error, only apply for Cortex M3, M4, M7
+#if defined(__ARM_ARCH_7M__) || defined (__ARM_ARCH_7EM__) || defined(__ARM_ARCH_8M_MAIN__) || defined(__ARM_ARCH_8_1M_MAIN__) || \
+ defined(__ARM7M__) || defined (__ARM7EM__) || defined(__ARM8M_MAINLINE__) || defined(__ARM8EM_MAINLINE__)
+ #define configASSERT(_exp) \
+ do {\
+ if ( !(_exp) ) { \
+ volatile uint32_t* ARM_CM_DHCSR = ((volatile uint32_t*) 0xE000EDF0UL); /* Cortex M CoreDebug->DHCSR */ \
+ if ( (*ARM_CM_DHCSR) & 1UL ) { /* Only halt mcu if debugger is attached */ \
+ taskDISABLE_INTERRUPTS(); \
+ __asm("BKPT #0\n"); \
+ }\
+ }\
+ } while(0)
+#endif
+
+/* FreeRTOS hooks to NVIC vectors */
+#define xPortPendSVHandler PendSV_Handler
+#define xPortSysTickHandler SysTick_Handler
+#define vPortSVCHandler SVC_Handler
+
+//--------------------------------------------------------------------+
+// Interrupt nesting behavior configuration.
+//--------------------------------------------------------------------+
+
+// For Cortex-M specific: __NVIC_PRIO_BITS is defined in mcu header
+#define configPRIO_BITS 4
+
+/* The lowest interrupt priority that can be used in a call to a "set priority" function. */
+#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY ((1<<configPRIO_BITS) - 1)
+
+/* The highest interrupt priority that can be used by any interrupt service
+routine that makes calls to interrupt safe FreeRTOS API functions. DO NOT CALL
+INTERRUPT SAFE FREERTOS API FUNCTIONS FROM ANY INTERRUPT THAT HAS A HIGHER
+PRIORITY THAN THIS! (higher priorities are lower numeric values. */
+#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 2
+
+/* Interrupt priorities used by the kernel port layer itself. These are generic
+to all Cortex-M ports, and do not rely on any particular library functions. */
+#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+
+/* !!!! configMAX_SYSCALL_INTERRUPT_PRIORITY must not be set to zero !!!!
+See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )
+
+#endif
diff --git a/hw/bsp/stm32c5/boards/stm32c542nucleo/board.cmake b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.cmake
new file mode 100644
index 000000000..563a47ba2
--- /dev/null
+++ b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.cmake
@@ -0,0 +1,13 @@
+set(MCU_VARIANT stm32c542xx)
+set(JLINK_DEVICE stm32c542rc)
+
+set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/../../linker/stm32c542xc_flash.ld)
+set(LD_FILE_IAR ${CMAKE_CURRENT_LIST_DIR}/../../linker/stm32c542xc_flash.icf)
+
+function(update_board TARGET)
+ target_compile_definitions(${TARGET} PUBLIC
+ STM32C542xx
+ HSE_VALUE=24000000
+ HSE_STARTUP_TIMEOUT=100
+ )
+endfunction()
diff --git a/hw/bsp/stm32c5/boards/stm32c542nucleo/board.h b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.h
new file mode 100644
index 000000000..b64fad243
--- /dev/null
+++ b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.h
@@ -0,0 +1,83 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2026, HiFiPhile
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ name: STM32C542 Nucleo
+ url: https://www.st.com/en/evaluation-tools/nucleo-c542rc.html
+*/
+
+#ifndef BOARD_H_
+#define BOARD_H_
+
+// LED
+#define LED_PORT HAL_GPIOA
+#define LED_PIN HAL_GPIO_PIN_5
+
+// Button
+#define BUTTON_PORT HAL_GPIOC
+#define BUTTON_PIN HAL_GPIO_PIN_13
+#define BUTTON_STATE_ACTIVE 1
+
+// Enable UART serial communication with the ST-Link
+#define UART_ID 2
+#define UART_GPIO_PORT HAL_GPIOA
+#define UART_GPIO_AF HAL_GPIO_AF_7
+#define UART_TX_PIN HAL_GPIO_PIN_2
+#define UART_RX_PIN HAL_GPIO_PIN_3
+
+static inline void board_clock_init(void) {
+ HAL_RCC_HSE_Enable(HAL_RCC_HSE_ON);
+
+ hal_rcc_psi_config_t config_psi;
+ config_psi.psi_source = HAL_RCC_PSI_SRC_HSE;
+ config_psi.psi_ref = HAL_RCC_PSI_REF_24MHZ;
+ config_psi.psi_out = HAL_RCC_PSI_OUT_144MHZ;
+ HAL_RCC_PSI_SetConfig(&config_psi);
+ HAL_RCC_PSIS_Enable();
+
+ /** Initializes the CPU, AHB and APB busses clocks */
+ hal_rcc_bus_clk_config_t config_bus;
+ config_bus.hclk_prescaler = HAL_RCC_HCLK_PRESCALER1;
+ config_bus.pclk1_prescaler = HAL_RCC_PCLK_PRESCALER1;
+ config_bus.pclk2_prescaler = HAL_RCC_PCLK_PRESCALER1;
+ config_bus.pclk3_prescaler = HAL_RCC_PCLK_PRESCALER1;
+ HAL_RCC_SetBusClockConfig(&config_bus);
+
+ /** Frequency will be increased */
+ HAL_FLASH_ITF_SetLatency(HAL_FLASH, HAL_FLASH_ITF_LATENCY_4);
+
+ HAL_RCC_SetSYSCLKSource(HAL_RCC_SYSCLK_SRC_PSIS);
+
+ HAL_FLASH_ITF_SetProgrammingDelay(HAL_FLASH, HAL_FLASH_ITF_PROGRAM_DELAY_2);
+
+ HAL_UpdateCoreClock();
+
+ HAL_RCC_USART2_SetKernelClkSource(HAL_RCC_USART2_CLK_SRC_PCLK1);
+
+ HAL_RCC_PSIDIV3_Enable();
+ HAL_RCC_CK48_SetKernelClkSource(HAL_RCC_CK48_CLK_SRC_PSIDIV3);
+}
+#endif /* BOARD_H_ */
diff --git a/hw/bsp/stm32c5/boards/stm32c542nucleo/board.mk b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.mk
new file mode 100644
index 000000000..b3da64713
--- /dev/null
+++ b/hw/bsp/stm32c5/boards/stm32c542nucleo/board.mk
@@ -0,0 +1,13 @@
+MCU_VARIANT = stm32c542xx
+
+CFLAGS += \
+ -DSTM32C542xx \
+ -DHSE_VALUE=24000000 \
+ -DHSE_STARTUP_TIMEOUT=100
+
+# GCC
+LD_FILE = $(FAMILY_PATH)/linker/stm32c542xc_flash.ld
+
+
+# For flash-jlink target
+JLINK_DEVICE = stm32c542rc
diff --git a/hw/bsp/stm32c5/family.c b/hw/bsp/stm32c5/family.c
new file mode 100644
index 000000000..40b86fc55
--- /dev/null
+++ b/hw/bsp/stm32c5/family.c
@@ -0,0 +1,250 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2019 Ha Thach (tinyusb.org)
+ * Copyright (c) 2023 HiFiPhile
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ * THE SOFTWARE.
+ *
+ * This file is part of the TinyUSB stack.
+ */
+
+/* metadata:
+ manufacturer: STMicroelectronics
+*/
+
+#include "stm32_hal.h"
+#include "bsp/board_api.h"
+#include "board.h"
+
+#ifdef UART_ID
+ #if UART_ID == 1
+ #define UARTn USART1
+ #define UARTn_CLK_ENABLE HAL_RCC_USART1_EnableClock
+ #elif UART_ID == 2
+ #define UARTn USART2
+ #define UARTn_CLK_ENABLE HAL_RCC_USART2_EnableClock
+ #endif
+#endif
+
+//--------------------------------------------------------------------+
+// Forward USB interrupt events to TinyUSB IRQ Handler
+//--------------------------------------------------------------------+
+void USB_DRD_FS_IRQHandler(void) {
+ tusb_int_handler(0, true);
+}
+
+//--------------------------------------------------------------------+
+// MACRO TYPEDEF CONSTANT ENUM
+//--------------------------------------------------------------------+
+static void mpu_init(void);
+
+void board_init(void) {
+ mpu_init();
+ LL_ICACHE_Enable(ICACHE);
+
+ HAL_Init();
+ board_clock_init();
+
+ // Enable peripheral clocks.
+ HAL_RCC_GPIOA_EnableClock();
+ HAL_RCC_GPIOB_EnableClock();
+ HAL_RCC_GPIOC_EnableClock();
+ HAL_RCC_GPIOD_EnableClock();
+ HAL_RCC_USB_EnableClock();
+
+#if CFG_TUSB_OS == OPT_OS_NONE
+ // 1ms tick timer
+ SysTick_Config(SystemCoreClock / 1000);
+#elif CFG_TUSB_OS == OPT_OS_FREERTOS
+ // Explicitly disable systick to prevent its ISR from running before scheduler start
+ SysTick->CTRL &= ~1U;
+
+ // If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
+ NVIC_SetPriority(USB_DRD_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
+#endif
+
+ // LED
+ {
+ hal_gpio_config_t gpio_config;
+ gpio_config.mode = HAL_GPIO_MODE_OUTPUT;
+ gpio_config.speed = HAL_GPIO_SPEED_FREQ_LOW;
+ gpio_config.pull = HAL_GPIO_PULL_NO;
+ gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
+ gpio_config.init_state = HAL_GPIO_PIN_RESET;
+
+ HAL_GPIO_Init(LED_PORT, LED_PIN, &gpio_config);
+ }
+
+ // Button
+ {
+ hal_gpio_config_t gpio_config;
+ gpio_config.mode = HAL_GPIO_MODE_INPUT;
+ gpio_config.speed = HAL_GPIO_SPEED_FREQ_LOW;
+ gpio_config.pull = BUTTON_STATE_ACTIVE ? HAL_GPIO_PULL_DOWN : HAL_GPIO_PULL_UP;
+ HAL_GPIO_Init(BUTTON_PORT, BUTTON_PIN, &gpio_config);
+ }
+
+#ifdef UART_ID
+ UARTn_CLK_ENABLE();
+ // UART
+ {
+ hal_gpio_config_t gpio_config;
+ gpio_config.mode = HAL_GPIO_MODE_ALTERNATE;
+ gpio_config.output_type = HAL_GPIO_OUTPUT_PUSHPULL;
+ gpio_config.pull = HAL_GPIO_PULL_NO;
+ gpio_config.speed = HAL_GPIO_SPEED_FREQ_LOW;
+ gpio_config.alternate = UART_GPIO_AF;
+ HAL_GPIO_Init(UART_GPIO_PORT, UART_TX_PIN | UART_RX_PIN, &gpio_config);
+ }
+
+ LL_USART_ConfigAsyncMode(UARTn);
+ uint32_t reg_temp = (LL_USART_DATAWIDTH_8_BIT | LL_USART_PARITY_NONE
+ | LL_USART_DIRECTION_TX_RX | LL_USART_OVERSAMPLING_16);
+ LL_USART_ConfigXfer(UARTn, reg_temp, LL_USART_STOP_BIT_1);
+ LL_USART_SetBaudRate(UARTn, SystemCoreClock, LL_USART_PRESCALER_DIV1, LL_USART_OVERSAMPLING_16,
+ 115200);
+ LL_USART_EnableFIFO(UARTn);
+ LL_USART_Enable(UARTn);
+#endif
+}
+
+static void mpu_init(void)
+{
+ /* Disables the MPU */
+ HAL_CORTEX_MPU_Disable();
+
+ /*
+ Initializes and configures the MPU attributes
+ */
+ HAL_CORTEX_MPU_SetCacheMemAttr(HAL_CORTEX_MPU_MEM_ATTR_0, HAL_CORTEX_MPU_NORMAL_MEM_NCACHEABLE);
+
+ /*
+ Initializes and configures the MPU Region
+ */
+ hal_cortex_mpu_region_config_t p_region_config = {0};
+
+ p_region_config.base_addr = 0x8FFE000;
+ p_region_config.limit_addr = 0x8FFFFFF;
+ p_region_config.access_attr = HAL_CORTEX_MPU_REGION_ALL_RO;
+ p_region_config.exec_attr = HAL_CORTEX_MPU_EXECUTION_ATTR_DISABLE;
+ p_region_config.attr_idx = HAL_CORTEX_MPU_MEM_ATTR_0;
+ HAL_CORTEX_MPU_SetConfigRegion(HAL_CORTEX_MPU_REGION_0, &p_region_config);
+
+ HAL_CORTEX_MPU_EnableRegion(HAL_CORTEX_MPU_REGION_0);
+
+ /* Enables the MPU */
+ HAL_CORTEX_MPU_Enable(HAL_CORTEX_MPU_HARDFAULT_NMI_DISABLE, HAL_CORTEX_MPU_ACCESS_FAULT_ONLY_PRIV);
+}
+
+//--------------------------------------------------------------------+
+// Board porting API
+//--------------------------------------------------------------------+
+
+void board_led_write(bool state) {
+ hal_gpio_pin_state_t pin_state = state ? HAL_GPIO_PIN_SET : HAL_GPIO_PIN_RESET;
+ HAL_GPIO_WritePin(LED_PORT, LED_PIN, pin_state);
+}
+
+uint32_t board_button_read(void) {
+ return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);
+}
+
+size_t board_get_unique_id(uint8_t id[], size_t max_len) {
+ (void) max_len;
+ volatile uint32_t * stm32_uuid = (volatile uint32_t *) UID_BASE;
+ uint32_t* id32 = (uint32_t*) (uintptr_t) id;
+ uint8_t const len = 12;
+
+ id32[0] = stm32_uuid[0];
+ id32[1] = stm32_uuid[1];
+ id32[2] = stm32_uuid[2];
+
+ return len;
+}
+
+int board_uart_read(uint8_t *buf, int len) {
+#ifdef UART_ID
+ int count = 0;
+ while (count < len) {
+ if (LL_USART_IsActiveFlag_RXNE_RXFNE(UARTn)) {
+ buf[count] = LL_USART_ReceiveData8(UARTn);
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
+#else
+ (void) buf; (void) len;
+ return -1;
+#endif
+}
+
+int board_uart_write(void const *buf, int len) {
+#ifdef UART_ID
+ const uint8_t *p = (const uint8_t *) buf;
+ int count = 0;
+ while (count < len) {
+ if (LL_USART_IsActiveFlag_TXE_TXFNF(UARTn)) {
+ LL_USART_TransmitData8(UARTn, p[count]);
+ count++;
+ } else {
+ break;
+ }
+ }
+ return count;
+#else
+ (void) buf; (void) len;
+ return 0;
+#endif
+}
+
+#if CFG_TUSB_OS == OPT_OS_NONE
+volatile uint32_t system_ticks = 0;
+
+void SysTick_Handler(void) {
+ system_ticks++;
+ HAL_IncTick();
+}
+
+uint32_t tusb_time_millis_api(void) {
+ return system_ticks;
+}
+#endif
+
+void HardFault_Handler(void) {
+ __asm("BKPT #0\n");
+}
+
+#ifndef __ICCARM__
+// Implement _start() since we use linker flag '-nostartfiles'.
+extern int main(void);
+TU_ATTR_UNUSED void _start(void) {
+ // called by startup code
+ main();
+ while (1) {}
+}
+#endif
+
+// Required by __libc_init_array in startup code if we are compiling using
+// -nostdlib/-nostartfiles.
+void _init(void) {
+
+}
diff --git a/hw/bsp/stm32c5/family.cmake b/hw/bsp/stm32c5/family.cmake
new file mode 100644
index 000000000..5b63b1ce4
--- /dev/null
+++ b/hw/bsp/stm32c5/family.cmake
@@ -0,0 +1,111 @@
+include_guard()
+
+set(ST_FAMILY c5)
+set(ST_PREFIX stm32${ST_FAMILY}xx)
+
+set(ST_DRIVER ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx-drivers)
+set(ST_CMSIS ${TOP}/hw/mcu/st/stm32${ST_FAMILY}xx-dfp)
+set(CMSIS_6 ${TOP}/lib/CMSIS_6)
+
+# include board specific
+include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+
+# toolchain set up
+set(CMAKE_SYSTEM_CPU cortex-m33 CACHE INTERNAL "System Processor")
+set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
+
+set(FAMILY_MCUS STM32C5 CACHE INTERNAL "")
+set(OPENOCD_OPTION "-f interface/stlink.cfg -f target/stm32c5x.cfg")
+
+#------------------------------------
+# Startup & Linker script
+#------------------------------------
+set(STARTUP_FILE ${ST_CMSIS}/Source/startup_${MCU_VARIANT}.c)
+set(LD_FILE_Clang ${LD_FILE_GNU})
+
+#------------------------------------
+# BOARD_TARGET
+#------------------------------------
+function(family_add_board BOARD_TARGET)
+ add_library(${BOARD_TARGET} STATIC
+ ${ST_CMSIS}/Source/Templates/system_${ST_PREFIX}.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_cortex.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_flash_itf.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_pwr.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_rcc.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_gpio.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_uart.c
+ ${ST_DRIVER}/hal/${ST_PREFIX}_hal_dma.c
+ )
+ target_include_directories(${BOARD_TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${CMSIS_6}/CMSIS/Core/Include
+ ${ST_CMSIS}/Include
+ ${ST_DRIVER}/hal
+ ${ST_DRIVER}/ll
+ )
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ )
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ target_compile_options(${BOARD_TARGET} PUBLIC -Wno-redundant-decls)
+ endif ()
+
+ if(CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ __STACK_LIMIT=__StackLimit
+ __INITIAL_SP=__StackTop
+ )
+ endif ()
+
+ update_board(${BOARD_TARGET})
+endfunction()
+
+#------------------------------------
+# Functions
+#------------------------------------
+function(family_configure_example TARGET RTOS)
+ family_configure_common(${TARGET} ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_STM32C5)
+
+ target_sources(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
+ ${TOP}/src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c
+ ${TOP}/src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c
+ ${TOP}/src/portable/st/stm32_fsdev/fsdev_common.c
+ ${STARTUP_FILE}
+ )
+ target_include_directories(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
+ )
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ target_link_options(${TARGET} PUBLIC
+ "LINKER:--script=${LD_FILE_GNU}"
+ -nostartfiles
+ --specs=nosys.specs --specs=nano.specs
+ )
+ elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ target_link_options(${TARGET} PUBLIC
+ "LINKER:--script=${LD_FILE_Clang}"
+ )
+ elseif (CMAKE_C_COMPILER_ID STREQUAL "IAR")
+ target_link_options(${TARGET} PUBLIC
+ "LINKER:--config=${LD_FILE_IAR}"
+ )
+ endif ()
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR CMAKE_C_COMPILER_ID STREQUAL "Clang")
+ set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes")
+ endif ()
+
+ # Flashing
+ family_add_bin_hex(${TARGET})
+ family_flash_jlink(${TARGET})
+ family_flash_stlink(${TARGET})
+ #family_flash_openocd(${TARGET})
+endfunction()
diff --git a/hw/bsp/stm32c5/family.mk b/hw/bsp/stm32c5/family.mk
new file mode 100644
index 000000000..165ad4ad5
--- /dev/null
+++ b/hw/bsp/stm32c5/family.mk
@@ -0,0 +1,52 @@
+ST_FAMILY = c5
+ST_CMSIS = hw/mcu/st/stm32$(ST_FAMILY)xx-dfp
+ST_DRIVER = hw/mcu/st/stm32$(ST_FAMILY)xx-drivers
+
+include $(TOP)/$(BOARD_PATH)/board.mk
+CPU_CORE ?= cortex-m33
+
+# --------------
+# Compiler Flags
+# --------------
+CFLAGS += \
+ -DCFG_TUSB_MCU=OPT_MCU_STM32C5 \
+
+# GCC Flags
+CFLAGS += \
+ -flto \
+
+# suppress warnings caused by vendor mcu driver
+CFLAGS += -Wno-error=cast-align -Wno-error=unused-parameter -Wno-error=redundant-decls
+
+LDFLAGS += \
+ -nostdlib -nostartfiles \
+ --specs=nosys.specs --specs=nano.specs
+
+# -----------------
+# Sources & Include
+# -----------------
+
+SRC_C += \
+ src/portable/st/stm32_fsdev/dcd_stm32_fsdev.c \
+ src/portable/st/stm32_fsdev/hcd_stm32_fsdev.c \
+ src/portable/st/stm32_fsdev/fsdev_common.c \
+ $(ST_CMSIS)/Source/Templates/system_stm32$(ST_FAMILY)xx.c \
+ $(ST_CMSIS)/Source/startup_$(MCU_VARIANT).c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_cortex.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_flash_itf.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_pwr.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_rcc.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_gpio.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_uart.c \
+ $(ST_DRIVER)/hal/stm32$(ST_FAMILY)xx_hal_dma.c
+
+INC += \
+ $(TOP)/$(BOARD_PATH) \
+ $(TOP)/lib/CMSIS_6/CMSIS/Core/Include \
+ $(TOP)/$(ST_CMSIS)/Include \
+ $(TOP)/$(ST_DRIVER)/hal \
+ $(TOP)/$(ST_DRIVER)/ll
+
+# flash target using on-board stlink
+flash: flash-stlink
diff --git a/hw/bsp/stm32c5/linker/stm32c542xc_flash.icf b/hw/bsp/stm32c5/linker/stm32c542xc_flash.icf
new file mode 100644
index 000000000..ea826ba8e
--- /dev/null
+++ b/hw/bsp/stm32c5/linker/stm32c542xc_flash.icf
@@ -0,0 +1,46 @@
+/**
+******************************************************************************
+* @file stm32c542xc_flash.icf
+* @brief Linker File
+******************************************************************************
+* @attention
+*
+* Copyright (c) 2026 STMicroelectronics.
+* All rights reserved.
+*
+* This software is licensed under terms that can be found in the LICENSE file
+* in the root directory of this software component.
+* If no LICENSE file comes with this software, it is provided AS-IS.
+*
+******************************************************************************
+*/
+
+define memory mem with size = 4G;
+define region ROM = mem:[from 0x8000000 size 0x40000];
+define region RAM = mem:[from 0x20000000 size 0x10000];
+
+/* define blocks */
+define block HEAP with alignment = 8, size = 0x200 { };
+define block CSTACK with alignment = 8, size = 0x1000 { };
+
+/* setup initialization strategies */
+initialize by copy {
+ readwrite
+};
+
+do not initialize {
+ section .noinit
+};
+
+place at start of ROM { readonly section .intvec } ;
+
+/* sections placements */
+place in ROM {
+ readonly
+};
+
+place in RAM {
+ readwrite,
+ block HEAP,
+ block CSTACK
+};
diff --git a/hw/bsp/stm32c5/linker/stm32c542xc_flash.ld b/hw/bsp/stm32c5/linker/stm32c542xc_flash.ld
new file mode 100644
index 000000000..34e2bf660
--- /dev/null
+++ b/hw/bsp/stm32c5/linker/stm32c542xc_flash.ld
@@ -0,0 +1,185 @@
+/**
+******************************************************************************
+* @file stm32c542xc_flash.ld
+* @brief Linker File
+******************************************************************************
+* @attention
+*
+* Copyright (c) 2026 STMicroelectronics.
+* All rights reserved.
+*
+* This software is licensed under terms that can be found in the LICENSE file
+* in the root directory of this software component.
+* If no LICENSE file comes with this software, it is provided AS-IS.
+*
+******************************************************************************
+*/
+
+/* Entry Point */
+ENTRY(Reset_Handler)
+
+HEAP_SIZE = 0x200;
+STACK_SIZE = 0x1000;
+
+
+MEMORY
+{
+ ROM (rx) : org = 0x8000000, len = 0x40000
+ RAM (xrw) : org = 0x20000000, len = 0x10000
+}
+
+SECTIONS
+{
+ .vectors :
+ {
+ . = ALIGN(8);
+ KEEP(*(.vectors));
+ . = ALIGN(8);
+ } > ROM
+
+ .text :
+ {
+ . = ALIGN(8);
+ *(.text);
+ *(.text*);
+ *(.glue_7);
+ *(.glue_7t);
+ *(.eh_frame);
+ KEEP (*(.init));
+ KEEP (*(.fini));
+ . = ALIGN(8);
+ _etext = .;
+ } > ROM
+
+ .rodata :
+ {
+ . = ALIGN(8);
+ *(.rodata);
+ *(.rodata*);
+ . = ALIGN(8);
+ } > ROM
+
+ .ARM.extab : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ *(.ARM.extab* .gnu.linkonce.armextab.*)
+ . = ALIGN(8);
+ } > ROM
+
+ .ARM : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ __exidx_start = .;
+ *(.ARM.exidx*);
+ __exidx_end = .;
+ . = ALIGN(8);
+ } > ROM
+
+ .preinit_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ PROVIDE_HIDDEN (__preinit_array_start = .);
+ KEEP (*(.preinit_array*));
+ PROVIDE_HIDDEN (__preinit_array_end = .);
+ . = ALIGN(8);
+ } > ROM
+
+ .init_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ PROVIDE_HIDDEN (__init_array_start = .);
+ KEEP (*(SORT(.init_array.*)));
+ KEEP (*(.init_array*));
+ PROVIDE_HIDDEN (__init_array_end = .);
+ . = ALIGN(8);
+ } > ROM
+
+ .fini_array : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ PROVIDE_HIDDEN (__fini_array_start = .);
+ KEEP (*(SORT(.fini_array.*)));
+ KEEP (*(.fini_array*));
+ PROVIDE_HIDDEN (__fini_array_end = .);
+ . = ALIGN(8);
+ } > ROM
+
+ .copy.table : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ __copy_table_start__ = .;
+ LONG(LOADADDR(.data));
+ LONG (ADDR(.data));
+ LONG (SIZEOF(.data) / 4);
+ __copy_table_end__ = .;
+ } > ROM
+
+ .zero.table : /* The READONLY keyword is only supported in GCC11 and later, remove it if using GCC10 or earlier. */
+ {
+ . = ALIGN(8);
+ __zero_table_start__ = .;
+ LONG (ADDR(.bss));
+ LONG (SIZEOF(.bss) / 4);
+ __zero_table_end__ = .;
+ } > ROM
+
+ .data :
+ {
+ . = ALIGN(8);
+ _sidata = LOADADDR(.data);
+ __data_start__ = .;
+ _sdata = .;
+ *(.data);
+ *(.data*);
+ . = ALIGN(8);
+ _edata = .;
+ } > RAM AT> ROM
+
+ .bss :
+ {
+ . = ALIGN(8);
+ _sbss = .;
+ __bss_start__ = _sbss;
+ *(.bss);
+ *(.bss*);
+ *(COMMON);
+ . = ALIGN(8);
+ _ebss = .;
+ __bss_end__ = _ebss;
+ } > RAM
+
+ .heap (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __end__ = .;
+ PROVIDE (end = .);
+ _heap_start = .;
+ . += HEAP_SIZE;
+ . = ALIGN(8);
+ _heap_end = .;
+ __HeapLimit = .;
+ } > RAM
+
+ .stack (NOLOAD) :
+ {
+ . = ALIGN(8);
+ __StackLimit = .;
+ . += STACK_SIZE;
+ . = ALIGN(8);
+ __StackTop = .;
+ _estack = .;
+ __stack = .;
+ } > RAM
+
+ /DISCARD/ :
+ {
+ libc.a ( * )
+ libm.a ( * )
+ libgcc.a ( * )
+ }
+
+ .ARM.attributes 0 :
+ {
+ *(.ARM.attributes)
+ }
+}
diff --git a/hw/bsp/stm32c5/stm32c5xx_hal_conf.h b/hw/bsp/stm32c5/stm32c5xx_hal_conf.h
new file mode 100644
index 000000000..0833fa3dd
--- /dev/null
+++ b/hw/bsp/stm32c5/stm32c5xx_hal_conf.h
@@ -0,0 +1,684 @@
+/**
+ ******************************************************************************
+ * @file stm32c5xx_hal_conf.h
+ * @brief HAL configuration file.
+ ******************************************************************************
+ * @attention
+ *
+ * Copyright (c) 2026 STMicroelectronics.
+ * All rights reserved.
+ *
+ * This software is licensed under terms that can be found in the mx_stm32c5xx_hal_drivers_license.md file
+ * in the same directory as the generated code.
+ * If no mx_stm32c5xx_hal_drivers_license.md file comes with this software, it is provided AS-IS.
+ *
+ ******************************************************************************
+ */
+
+/* Define to prevent recursive inclusion -------------------------------------*/
+#ifndef STM32C5XX_HAL_CONF_H
+#define STM32C5XX_HAL_CONF_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* __cplusplus */
+
+/* Exported types ------------------------------------------------------------*/
+/* Exported constants --------------------------------------------------------*/
+
+/** @defgroup HAL_Conf_How_To_Use HAL Conf How to Use
+ * @{
+ - The STM32 HAL configuration file, stm32tnxx_hal_conf.h, is designed to customize the behaviour of the HAL modules.
+ - The users can utilize the provided file as-is, where all HAL modules are enabled with their default settings.
+ - Alternatively, users have the flexibility to customize the file based on their application's requirements.
+ - For example, they can enable only the necessary HAL modules or modify the predefined settings to achieve
+ the desired functionality.
+ */
+
+/**
+ * @}
+ */
+
+/** @defgroup HAL_Conf_Exported_Constants HAL Conf Constants
+ * @{
+ */
+
+/** @defgroup HAL_System_Configuration HAL System Configuration
+ * @{
+ */
+
+/* ########################### System Configuration ############################# */
+/**
+ * @brief This is the HAL system configuration section
+ */
+#define USE_HAL_TICK_INT_PRIORITY 15U /*!< tick interrupt priority */
+#define USE_HAL_FLASH_PREFETCH 1U /*!< Enable FLASH prefetch */
+/**
+ * @}
+ */
+
+/** @defgroup HAL_MUTEX_Usage_Activation HAL MUTEX Usage Activation
+ * @{
+ */
+/* ########################## HAL MUTEX usage activation ####################### */
+/**
+ * @brief Used by the HAL PPP Acquire/Release APIs when the define USE_HAL_MUTEX is set to 1
+ */
+#define USE_HAL_MUTEX 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_API_Parameters_Check HAL API Parameters Check
+ * @{
+ */
+/* ########################## HAL API parameters check ##################### */
+/**
+ * @brief Run time parameter check activation
+ */
+#define USE_HAL_CHECK_PARAM 0U
+#define USE_HAL_SECURE_CHECK_PARAM 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_State_Transition HAL State Transition
+ * @{
+ */
+/* ########################## State transition ################################ */
+/**
+ * @brief Enable protection of state transition in thread safe
+ */
+#define USE_HAL_CHECK_PROCESS_STATE 0U
+/**
+ * @}
+ */
+
+/* ########################## Peripheral configuration ######################### */
+
+/** @defgroup HAL_ADC_Config HAL ADC Configuration
+ * @{
+ */
+/* ########################## HAL_ADC Config #################################### */
+#define USE_HAL_ADC_MODULE 0U
+#define USE_HAL_ADC_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_ADC_REGISTER_CALLBACKS 0U
+#define USE_HAL_ADC_USER_DATA 0U
+#define USE_HAL_ADC_GET_LAST_ERRORS 0U
+#define USE_HAL_ADC_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_AES_Config HAL AES Configuration
+ * @{
+ */
+/* ########################## HAL_AES Config #################################### */
+#define USE_HAL_AES_MODULE 0U
+#define USE_HAL_AES_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_AES_REGISTER_CALLBACKS 0U
+#define USE_HAL_AES_USER_DATA 0U
+#define USE_HAL_AES_GET_LAST_ERRORS 0U
+#define USE_HAL_AES_DMA 0U
+#define USE_HAL_AES_ECB_CBC_ALGO 0U
+#define USE_HAL_AES_CTR_ALGO 0U
+#define USE_HAL_AES_GCM_GMAC_ALGO 0U
+#define USE_HAL_AES_CCM_ALGO 0U
+#define USE_HAL_AES_SUSPEND_RESUME 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_CCB_Config HAL CCB Configuration
+ * @{
+ */
+/* ########################## HAL_CCB Config #################################### */
+#define USE_HAL_CCB_MODULE 0U
+#define USE_HAL_CCB_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_CCB_USER_DATA 0U
+#define USE_HAL_CCB_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_COMP_Config HAL COMP Configuration
+ * @{
+ */
+/* ########################## HAL_COMP Config ################################### */
+#define USE_HAL_COMP_MODULE 0U
+#define USE_HAL_COMP_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_COMP_REGISTER_CALLBACKS 0U
+#define USE_HAL_COMP_USER_DATA 0U
+/* Use comparator with EXTI (needed to generate system wake-up event and CPU event) */
+#define USE_HAL_COMP_EXTI 0U
+/* Use comparators window mode feature */
+#define USE_HAL_COMP_WINDOW_MODE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_CORDIC_Config HAL CORDIC Configuration
+ * @{
+ */
+/* ########################## HAL_CORDIC Config ################################# */
+#define USE_HAL_CORDIC_MODULE 0U
+#define USE_HAL_CORDIC_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_CORDIC_REGISTER_CALLBACKS 0U
+#define USE_HAL_CORDIC_USER_DATA 0U
+#define USE_HAL_CORDIC_GET_LAST_ERRORS 0U
+#define USE_HAL_CORDIC_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_CORTEX_Config HAL CORTEX Configuration
+ * @{
+ */
+/* ########################## HAL_CORTEX Config ################################# */
+#define USE_HAL_CORTEX_MODULE 1U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_CRC_Config HAL CRC Configuration
+ * @{
+ */
+/* ########################## HAL_CRC Config #################################### */
+#define USE_HAL_CRC_MODULE 0U
+#define USE_HAL_CRC_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_CRC_USER_DATA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_CRS_Config HAL CRS Configuration
+ * @{
+ */
+/* ########################## HAL_CRS Config #################################### */
+#define USE_HAL_CRS_MODULE 0U
+#define USE_HAL_CRS_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_CRS_REGISTER_CALLBACKS 0U
+#define USE_HAL_CRS_USER_DATA 0U
+#define USE_HAL_CRS_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_DAC_Config HAL DAC Configuration
+ * @{
+ */
+/* ########################## HAL_DAC Config #################################### */
+#define USE_HAL_DAC_MODULE 0U
+#define USE_HAL_DAC_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_DAC_REGISTER_CALLBACKS 0U
+#define USE_HAL_DAC_USER_DATA 0U
+#define USE_HAL_DAC_GET_LAST_ERRORS 0U
+#define USE_HAL_DAC_DMA 0U
+#define USE_HAL_DAC_DUAL_CHANNEL 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_DBGMCU_Config HAL DBGMCU Configuration
+ * @{
+ */
+/* ########################## HAL_DBGMCU Config ################################# */
+#define USE_HAL_DBGMCU_MODULE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_DMA_Config HAL DMA Configuration
+ * @{
+ */
+/* ########################## HAL_DMA Config #################################### */
+#define USE_HAL_DMA_MODULE 1U
+#define USE_HAL_DMA_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_DMA_USER_DATA 0U
+#define USE_HAL_DMA_GET_LAST_ERRORS 0U
+#define USE_HAL_DMA_LINKEDLIST 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_ETH_Config HAL ETH Configuration
+ * @{
+ */
+/* ########################## HAL_ETH Config #################################### */
+#define USE_HAL_ETH_MODULE 0U
+#define USE_HAL_ETH_REGISTER_CALLBACKS 0U
+#define USE_HAL_ETH_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_ETH_USER_DATA 0U
+#define USE_HAL_ETH_GET_LAST_ERRORS 0U
+#define USE_HAL_ETH_ATOMIC_CHANNEL_LOCK 0U
+#define USE_HAL_ETH_MAX_TX_CH_NB 1U
+#define USE_HAL_ETH_MAX_RX_CH_NB 1U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_EXTI_Config HAL EXTI Configuration
+ * @{
+ */
+/* ########################## HAL_EXTI Config ################################### */
+#define USE_HAL_EXTI_MODULE 0U
+#define USE_HAL_EXTI_REGISTER_CALLBACKS 0U
+#define USE_HAL_EXTI_USER_DATA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_FDCAN_Config HAL FDCAN Configuration
+ * @{
+ */
+/* ########################## HAL_FDCAN Config ################################## */
+#define USE_HAL_FDCAN_MODULE 0U
+#define USE_HAL_FDCAN_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_FDCAN_REGISTER_CALLBACKS 0U
+#define USE_HAL_FDCAN_USER_DATA 0U
+#define USE_HAL_FDCAN_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_FLASH_Config HAL FLASH Configuration
+ * @{
+ */
+/* ########################## HAL_FLASH Config ################################## */
+#define USE_HAL_FLASH_MODULE 1U
+#define USE_HAL_FLASH_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_FLASH_REGISTER_CALLBACKS 0U
+#define USE_HAL_FLASH_USER_DATA 0U
+#define USE_HAL_FLASH_GET_LAST_ERRORS 0U
+/* Use the FLASH program by address feature */
+#define USE_HAL_FLASH_PROGRAM_BY_ADDR 0U
+/* Use the FLASH erase by address feature */
+#define USE_HAL_FLASH_ERASE_BY_ADDR 0U
+/* Use the FLASH erase by PAGE feature */
+#define USE_HAL_FLASH_ERASE_PAGE 0U
+/* Use the FLASH bank erase feature */
+#define USE_HAL_FLASH_ERASE_BANK 0U
+/* Use the FLASH mass erase feature */
+#define USE_HAL_FLASH_MASS_ERASE 0U
+/* Use ECC errors handling APIs */
+#define USE_HAL_FLASH_ECC 0U
+/* Use FLASH HAL API for EDATA */
+#define USE_HAL_FLASH_OB_EDATA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_GPIO_Config HAL GPIO Configuration
+ * @{
+ */
+/* ########################## HAL_GPIO Config ################################### */
+#define USE_HAL_GPIO_MODULE 1U
+#define USE_HAL_GPIO_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+/**
+ * @}
+ */
+
+/** @defgroup HAL_HASH_Config HAL HASH Configuration
+ * @{
+ */
+/* ########################## HAL_HASH Config ################################### */
+#define USE_HAL_HASH_MODULE 0U
+#define USE_HAL_HASH_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_HASH_REGISTER_CALLBACKS 0U
+#define USE_HAL_HASH_USER_DATA 0U
+#define USE_HAL_HASH_GET_LAST_ERRORS 0U
+#define USE_HAL_HASH_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_HCD_Config HAL HCD Configuration
+ * @{
+ */
+/* ########################## HAL_HCD Config #################################### */
+#define USE_HAL_HCD_MODULE 0U
+#define USE_HAL_HCD_REGISTER_CALLBACKS 0U
+#define USE_HAL_HCD_USER_DATA 0U
+#define USE_HAL_HCD_GET_LAST_ERRORS 0U
+#define USE_HAL_HCD_USB_DOUBLE_BUFFER 0U
+#define USE_HAL_HCD_USB_EP_TYPE_ISOC 0U
+#define USE_HAL_HCD_MAX_CHANNEL_NB 16U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_I2C_Config HAL I2C Configuration
+ * @{
+ */
+/* ########################## HAL_I2C Config #################################### */
+#define USE_HAL_I2C_MODULE 0U
+#define USE_HAL_I2C_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_I2C_REGISTER_CALLBACKS 0U
+#define USE_HAL_I2C_USER_DATA 0U
+#define USE_HAL_I2C_GET_LAST_ERRORS 0U
+#define USE_HAL_I2C_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_I3C_Config HAL I3C Configuration
+ * @{
+ */
+/* ########################## HAL_I3C Config #################################### */
+#define USE_HAL_I3C_MODULE 0U
+#define USE_HAL_I3C_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_I3C_REGISTER_CALLBACKS 0U
+#define USE_HAL_I3C_USER_DATA 0U
+#define USE_HAL_I3C_GET_LAST_ERRORS 0U
+#define USE_HAL_I3C_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_I2S_Config HAL I2S Configuration
+ * @{
+ */
+/* ########################## HAL_I2S Config #################################### */
+#define USE_HAL_I2S_MODULE 0U
+#define USE_HAL_I2S_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_I2S_REGISTER_CALLBACKS 0U
+#define USE_HAL_I2S_USER_DATA 0U
+#define USE_HAL_I2S_GET_LAST_ERRORS 0U
+#define USE_HAL_I2S_OVR_UDR_ERRORS 0U
+#define USE_HAL_I2S_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_ICACHE_Config HAL ICACHE Configuration
+ * @{
+ */
+/* ########################## HAL_ICACHE Config ################################# */
+#define USE_HAL_ICACHE_MODULE 1U
+#define USE_HAL_ICACHE_REGISTER_CALLBACKS 0U
+#define USE_HAL_ICACHE_USER_DATA 0U
+#define USE_HAL_ICACHE_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_IWDG_Config HAL IWDG Configuration
+ * @{
+ */
+/* ########################## HAL_IWDG Config ################################### */
+#define USE_HAL_IWDG_MODULE 0U
+#define USE_HAL_IWDG_REGISTER_CALLBACKS 0U
+#define USE_HAL_IWDG_USER_DATA 0U
+/* IWDG time unit configuration */
+#define USE_HAL_IWDG_TIME_UNIT HAL_IWDG_TIME_UNIT_MS
+/* IWDG hardware start configuration
+ warning: In case of starting IWDG in Hardware mode, make sure that
+ USE_HAL_IWDG_HARDWARE_START is aligned with OB activated set for IWDG */
+#define USE_HAL_IWDG_HARDWARE_START 0U
+/* User can choose the value of the LSI frequency with the USE_HAL_IWDG_LSI_FREQ define:
+ - 0U : Dynamic LSI to be computed and set by the user.
+ - LSI_VALUE : LSI value of 32KHz.
+ - (LSI_VALUE / 128U): LSI value of 250Hz */
+#define USE_HAL_IWDG_LSI_FREQ LSI_VALUE
+/**
+ * @}
+ */
+
+/** @defgroup HAL_LPTIM_Config HAL LPTIM Configuration
+ * @{
+ */
+/* ########################## HAL_LPTIM Config ################################## */
+#define USE_HAL_LPTIM_MODULE 0U
+#define USE_HAL_LPTIM_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_LPTIM_REGISTER_CALLBACKS 0U
+#define USE_HAL_LPTIM_USER_DATA 0U
+#define USE_HAL_LPTIM_GET_LAST_ERRORS 0U
+#define USE_HAL_LPTIM_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_OPAMP_Config HAL OPAMP Configuration
+ * @{
+ */
+/* ########################## HAL_OPAMP Config ################################## */
+#define USE_HAL_OPAMP_MODULE 0U
+#define USE_HAL_OPAMP_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_OPAMP_USER_DATA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_PCD_Config HAL PCD Configuration
+ * @{
+ */
+/* ########################## HAL_PCD Config #################################### */
+#define USE_HAL_PCD_MODULE 1U
+#define USE_HAL_PCD_REGISTER_CALLBACKS 0U
+#define USE_HAL_PCD_USER_DATA 0U
+#define USE_HAL_PCD_GET_LAST_ERRORS 0U
+#define USE_HAL_PCD_USB_DOUBLE_BUFFER 0U
+#define USE_HAL_PCD_USB_LPM 0U
+#define USE_HAL_PCD_USB_BCD 0U
+#define USE_HAL_PCD_USB_EP_TYPE_ISOC 0U
+#define USE_HAL_PCD_MAX_ENDPOINT_NB 8U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_PKA_Config HAL PKA Configuration
+ * @{
+ */
+/* ########################## HAL_PKA Config #################################### */
+#define USE_HAL_PKA_MODULE 0U
+#define USE_HAL_PKA_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_PKA_REGISTER_CALLBACKS 0U
+#define USE_HAL_PKA_USER_DATA 0U
+#define USE_HAL_PKA_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_PWR_Config HAL PWR Configuration
+ * @{
+ */
+/* ########################## HAL_PWR Config #################################### */
+#define USE_HAL_PWR_MODULE 1U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_RAMCFG_Config HAL RAMCFG Configuration
+ * @{
+ */
+/* ########################## HAL_RAMCFG Config ################################# */
+#define USE_HAL_RAMCFG_MODULE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_RCC_Config HAL RCC Configuration
+ * @{
+ */
+/* ########################## HAL_RCC Config #################################### */
+#define USE_HAL_RCC_MODULE 1U
+/* Use RCC HAL API for Reset function */
+#define USE_HAL_RCC_RESET_PERIPH_CLOCK_MANAGEMENT 0U
+#define USE_HAL_RCC_RESET_RTC_DOMAIN 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_RNG_Config HAL RNG Configuration
+ * @{
+ */
+/* ########################## HAL_RNG Config #################################### */
+#define USE_HAL_RNG_MODULE 0U
+#define USE_HAL_RNG_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_RNG_REGISTER_CALLBACKS 0U
+#define USE_HAL_RNG_USER_DATA 0U
+#define USE_HAL_RNG_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_RTC_Config HAL RTC Configuration
+ * @{
+ */
+/* ########################## HAL_RTC Config #################################### */
+#define USE_HAL_RTC_MODULE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_SBS_Config HAL SBS Configuration
+ * @{
+ */
+/* ########################## HAL_SBS Config #################################### */
+#define USE_HAL_SBS_MODULE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_SMARTCARD_Config HAL SMARTCARD Configuration
+ * @{
+ */
+/* ########################## HAL_SMARTCARD Config ############################## */
+#define USE_HAL_SMARTCARD_MODULE 0U
+#define USE_HAL_SMARTCARD_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_SMARTCARD_REGISTER_CALLBACKS 0U
+#define USE_HAL_SMARTCARD_USER_DATA 0U
+#define USE_HAL_SMARTCARD_GET_LAST_ERRORS 0U
+#define USE_HAL_SMARTCARD_DMA 0U
+/* #################### SMARTCARD FIFO configuration ######################## */
+#define USE_HAL_SMARTCARD_FIFO 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_SMBUS_Config HAL SMBUS Configuration
+ * @{
+ */
+/* ########################## HAL_SMBUS Config ################################## */
+#define USE_HAL_SMBUS_MODULE 0U
+#define USE_HAL_SMBUS_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_SMBUS_REGISTER_CALLBACKS 0U
+#define USE_HAL_SMBUS_USER_DATA 0U
+#define USE_HAL_SMBUS_GET_LAST_ERRORS 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_SPI_Config HAL SPI Configuration
+ * @{
+ */
+/* ########################## HAL_SPI Config #################################### */
+#define USE_HAL_SPI_MODULE 0U
+#define USE_HAL_SPI_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_SPI_REGISTER_CALLBACKS 0U
+#define USE_HAL_SPI_USER_DATA 0U
+#define USE_HAL_SPI_GET_LAST_ERRORS 0U
+#define USE_HAL_SPI_DMA 0U
+/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver
+ * Activated: CRC code is present inside driver
+ * Deactivated: CRC code cleaned from driver
+ */
+#define USE_HAL_SPI_CRC 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_TAMP_Config HAL TAMP Configuration
+ * @{
+ */
+/* ########################## HAL_TAMP Config ################################### */
+#define USE_HAL_TAMP_MODULE 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_TIM_Config HAL TIM Configuration
+ * @{
+ */
+/* ########################## HAL_TIM Config #################################### */
+#define USE_HAL_TIM_MODULE 0U
+#define USE_HAL_TIM_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_TIM_REGISTER_CALLBACKS 0U
+#define USE_HAL_TIM_USER_DATA 0U
+#define USE_HAL_TIM_GET_LAST_ERRORS 0U
+#define USE_HAL_TIM_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_UART_Config HAL UART Configuration
+ * @{
+ */
+/* ########################## HAL_UART Config ################################### */
+#define USE_HAL_UART_MODULE 1U
+#define USE_HAL_UART_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_UART_REGISTER_CALLBACKS 0U
+#define USE_HAL_UART_USER_DATA 0U
+#define USE_HAL_UART_GET_LAST_ERRORS 0U
+#define USE_HAL_UART_DMA 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_USART_Config HAL USART Configuration
+ * @{
+ */
+/* ########################## HAL_USART Config ################################## */
+#define USE_HAL_USART_MODULE 0U
+#define USE_HAL_USART_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_USART_REGISTER_CALLBACKS 0U
+#define USE_HAL_USART_USER_DATA 0U
+#define USE_HAL_USART_GET_LAST_ERRORS 0U
+#define USE_HAL_USART_DMA 0U
+#define USE_HAL_USART_FIFO 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_WWDG_Config HAL WWDG Configuration
+ * @{
+ */
+/* ########################## HAL_WWDG Config ################################### */
+#define USE_HAL_WWDG_MODULE 0U
+#define USE_HAL_WWDG_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_WWDG_REGISTER_CALLBACKS 0U
+#define USE_HAL_WWDG_USER_DATA 0U
+/* WWDG time unit configuration */
+#define USE_HAL_WWDG_TIME_UNIT HAL_WWDG_TIME_UNIT_MS
+/* WWDG hardware start configuration
+ warning: In case of starting WWDG in Hardware mode, make sure that
+ USE_HAL_WWDG_HARDWARE_START is aligned with OB activated set for WWDG */
+#define USE_HAL_WWDG_HARDWARE_START 0U
+/**
+ * @}
+ */
+
+/** @defgroup HAL_XSPI_Config HAL XSPI Configuration
+ * @{
+ */
+/* ########################## HAL_XSPI Config ################################### */
+#define USE_HAL_XSPI_MODULE 0U
+#define USE_HAL_XSPI_CLK_ENABLE_MODEL HAL_CLK_ENABLE_NO
+#define USE_HAL_XSPI_REGISTER_CALLBACKS 0U
+#define USE_HAL_XSPI_USER_DATA 0U
+#define USE_HAL_XSPI_GET_LAST_ERRORS 0U
+#define USE_HAL_XSPI_DMA 0U
+#define USE_HAL_XSPI_HYPERBUS 0U
+/**
+ * @}
+ */
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif /* __cplusplus */
+
+#endif /* STM32C5XX_HAL_CONF_H */
diff --git a/hw/bsp/stm32f0/family.c b/hw/bsp/stm32f0/family.c
index f413163e5..c77ef4008 100644
--- a/hw/bsp/stm32f0/family.c
+++ b/hw/bsp/stm32f0/family.c
@@ -206,7 +206,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32f1/family.c b/hw/bsp/stm32f1/family.c
index 74e0f53f2..67427da1f 100644
--- a/hw/bsp/stm32f1/family.c
+++ b/hw/bsp/stm32f1/family.c
@@ -63,9 +63,11 @@ void USB_LP_IRQHandler(void) {
tud_int_handler(0);
}
-void USBWakeUp_IRQHandler(void) {
- tud_int_handler(0);
-}
+// USB wakeup EXTI IRQ is not enabled by the fsdev driver (see fsdev_stm32.h);
+// restore when STOP-mode wakeup is implemented.
+//void USBWakeUp_IRQHandler(void) {
+// tud_int_handler(0);
+//}
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
@@ -128,7 +130,7 @@ void board_init(void) {
// If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
NVIC_SetPriority(USB_HP_CAN1_TX_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
NVIC_SetPriority(USB_LP_CAN1_RX0_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
- NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
+ //NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
#endif
// LED
@@ -246,7 +248,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32f2/family.c b/hw/bsp/stm32f2/family.c
index 051a026c5..260e5e067 100644
--- a/hw/bsp/stm32f2/family.c
+++ b/hw/bsp/stm32f2/family.c
@@ -210,7 +210,7 @@ int board_uart_write(void const* buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32f3/family.c b/hw/bsp/stm32f3/family.c
index 0864d0fad..bddf224d2 100644
--- a/hw/bsp/stm32f3/family.c
+++ b/hw/bsp/stm32f3/family.c
@@ -76,9 +76,10 @@ void USB_LP_IRQHandler(void) {
// USB wakeup interrupt (Channel 76): Triggered by the wakeup event from the USB
// Suspend mode.
-void USBWakeUp_RMP_IRQHandler(void) {
- tud_int_handler(0);
-}
+// Not enabled by the fsdev driver (see fsdev_stm32.h); restore for STOP-mode wakeup.
+//void USBWakeUp_RMP_IRQHandler(void) {
+// tud_int_handler(0);
+//}
//--------------------------------------------------------------------+
// MACRO TYPEDEF CONSTANT ENUM
@@ -222,7 +223,7 @@ int board_uart_write(void const* buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32f4/family.c b/hw/bsp/stm32f4/family.c
index f4ef99150..3a323e673 100644
--- a/hw/bsp/stm32f4/family.c
+++ b/hw/bsp/stm32f4/family.c
@@ -109,6 +109,11 @@ void USARTn_IRQHandler(void) {
void board_init(void) {
board_clock_init();
+
+ __HAL_FLASH_INSTRUCTION_CACHE_ENABLE();
+ __HAL_FLASH_DATA_CACHE_ENABLE();
+ __HAL_FLASH_PREFETCH_BUFFER_ENABLE();
+
//SystemCoreClockUpdate();
// Enable All GPIOs clocks
@@ -295,7 +300,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32f7/boards/stm32f746disco/board.cmake b/hw/bsp/stm32f7/boards/stm32f746disco/board.cmake
index bc26c6ef4..5f46365f4 100644
--- a/hw/bsp/stm32f7/boards/stm32f746disco/board.cmake
+++ b/hw/bsp/stm32f7/boards/stm32f746disco/board.cmake
@@ -1,5 +1,5 @@
set(MCU_VARIANT stm32f746xx)
-set(JLINK_DEVICE stm32f746xx)
+set(JLINK_DEVICE stm32f746ng)
set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F746ZGTx_FLASH.ld)
diff --git a/hw/bsp/stm32f7/boards/stm32f769disco/board.cmake b/hw/bsp/stm32f7/boards/stm32f769disco/board.cmake
index 2335b869e..dbdd07e4d 100644
--- a/hw/bsp/stm32f7/boards/stm32f769disco/board.cmake
+++ b/hw/bsp/stm32f7/boards/stm32f769disco/board.cmake
@@ -1,5 +1,6 @@
set(MCU_VARIANT stm32f769xx)
set(JLINK_DEVICE stm32f769ni)
+#set(JLINK_OPTION "-USB 000778170924")
set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/STM32F769ZITx_FLASH.ld)
diff --git a/hw/bsp/stm32f7/family.c b/hw/bsp/stm32f7/family.c
index 078e372d8..9427ac4a6 100644
--- a/hw/bsp/stm32f7/family.c
+++ b/hw/bsp/stm32f7/family.c
@@ -82,8 +82,9 @@ static UART_HandleTypeDef UartHandle = {.Instance = USARTn,
.OverSampling = UART_OVERSAMPLING_16,
}};
-// RX ring buffer via RXNE interrupt — no HAL IT functions used (avoid HAL state conflicts)
-static uint8_t uart_rx_ff_buf[32];
+// RX ring buffer via RXNE interrupt — no HAL IT functions used (avoid HAL state conflicts).
+// Sized to absorb a full host-forwarding burst (>64B) when the main loop briefly stalls.
+static uint8_t uart_rx_ff_buf[256];
static tu_fifo_t uart_rx_ff;
void USARTn_IRQHandler(void) {
@@ -142,13 +143,24 @@ void board_init(void) {
// 1ms tick timer
SysTick_Config(SystemCoreClock / 1000);
+ // Set UART interrupt higher priority than USB OTG since the F7 USART has no hardware RX FIFO, so a host example's
+ // UART RX must not be starved by the frequent USB host interrupts or incoming bytes overrun (ORE) and dropped.
+ NVIC_SetPriority(OTG_FS_IRQn, 1);
+ NVIC_SetPriority(OTG_HS_IRQn, 1);
+ #ifdef UART_ID
+ NVIC_SetPriority(USARTn_IRQn, 0);
+ #endif
+
#elif CFG_TUSB_OS == OPT_OS_FREERTOS
// Explicitly disable systick to prevent its ISR from running before scheduler start
SysTick->CTRL &= ~1U;
// If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
- NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
- NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
+ NVIC_SetPriority(OTG_FS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
+ NVIC_SetPriority(OTG_HS_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY + 1);
+ #ifdef UART_ID
+ NVIC_SetPriority(USARTn_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
+ #endif
#endif
#ifdef UART_ID
@@ -156,7 +168,6 @@ void board_init(void) {
HAL_UART_Init(&UartHandle);
tu_fifo_config(&uart_rx_ff, uart_rx_ff_buf, sizeof(uart_rx_ff_buf), false);
USARTn->CR1 |= USART_CR1_RXNEIE;
- NVIC_SetPriority(USARTn_IRQn, (1 << __NVIC_PRIO_BITS) - 1);
NVIC_EnableIRQ(USARTn_IRQn);
#endif
@@ -357,7 +368,7 @@ int board_uart_write(const void *buf, int len) {
#else
(void)buf;
(void)len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32g0/family.c b/hw/bsp/stm32g0/family.c
index d0ff8bac2..cb674ccc9 100644
--- a/hw/bsp/stm32g0/family.c
+++ b/hw/bsp/stm32g0/family.c
@@ -206,7 +206,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32g4/family.c b/hw/bsp/stm32g4/family.c
index 98739ffd5..cf7d4329b 100644
--- a/hw/bsp/stm32g4/family.c
+++ b/hw/bsp/stm32g4/family.c
@@ -61,9 +61,11 @@ void USB_LP_IRQHandler(void) {
tud_int_handler(0);
}
-void USBWakeUp_IRQHandler(void) {
- tud_int_handler(0);
-}
+// USB wakeup EXTI IRQ is not enabled by the fsdev driver (see fsdev_stm32.h);
+// restore when STOP-mode wakeup is implemented.
+//void USBWakeUp_IRQHandler(void) {
+// tud_int_handler(0);
+//}
// USB PD
void UCPD1_IRQHandler(void) {
@@ -99,7 +101,7 @@ void board_init(void) {
// If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
NVIC_SetPriority(USB_HP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
NVIC_SetPriority(USB_LP_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
- NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
+ //NVIC_SetPriority(USBWakeUp_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
#endif
GPIO_InitTypeDef GPIO_InitStruct;
@@ -236,7 +238,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32h5/boards/stm32h573i_dk/board.h b/hw/bsp/stm32h5/boards/stm32h573i_dk/board.h
index 5788837ab..e9c406486 100644
--- a/hw/bsp/stm32h5/boards/stm32h573i_dk/board.h
+++ b/hw/bsp/stm32h5/boards/stm32h573i_dk/board.h
@@ -204,6 +204,10 @@ int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Le
return 0;
}
+static int32_t i2c_get_tick(void) {
+ return (int32_t) HAL_GetTick();
+}
+
static inline void board_init2(void) {
TCPP0203_IO_t io_ctx;
@@ -212,6 +216,7 @@ static inline void board_init2(void) {
io_ctx.DeInit = board_tcpp0203_deinit;
io_ctx.ReadReg = i2c_readreg;
io_ctx.WriteReg = i2c_writereg;
+ io_ctx.GetTick = i2c_get_tick;
TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );
diff --git a/hw/bsp/stm32h5/family.c b/hw/bsp/stm32h5/family.c
index 8298dfaab..f52f94f32 100644
--- a/hw/bsp/stm32h5/family.c
+++ b/hw/bsp/stm32h5/family.c
@@ -238,7 +238,7 @@ int board_uart_write(void const* buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32h7/family.c b/hw/bsp/stm32h7/family.c
index b32f73754..5173c5401 100644
--- a/hw/bsp/stm32h7/family.c
+++ b/hw/bsp/stm32h7/family.c
@@ -328,7 +328,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h b/hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h
index b1446414e..996eb1515 100644
--- a/hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h
+++ b/hw/bsp/stm32h7rs/boards/stm32h7s3nucleo/board.h
@@ -223,6 +223,10 @@ int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Le
return 0;
}
+static int32_t i2c_get_tick(void) {
+ return (int32_t) HAL_GetTick();
+}
+
static inline void board_init2(void) {
TCPP0203_IO_t io_ctx;
@@ -231,6 +235,7 @@ static inline void board_init2(void) {
io_ctx.DeInit = board_tcpp0203_deinit;
io_ctx.ReadReg = i2c_readreg;
io_ctx.WriteReg = i2c_writereg;
+ io_ctx.GetTick = i2c_get_tick;
TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );
diff --git a/hw/bsp/stm32h7rs/family.c b/hw/bsp/stm32h7rs/family.c
index 7ae9e5532..b0841c947 100644
--- a/hw/bsp/stm32h7rs/family.c
+++ b/hw/bsp/stm32h7rs/family.c
@@ -490,7 +490,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32l0/family.c b/hw/bsp/stm32l0/family.c
index 930fa2d66..a4a0ebbfe 100644
--- a/hw/bsp/stm32l0/family.c
+++ b/hw/bsp/stm32l0/family.c
@@ -176,7 +176,7 @@ int board_uart_write(void const* buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32l4/family.c b/hw/bsp/stm32l4/family.c
index 7a8acb3de..96de82bd5 100644
--- a/hw/bsp/stm32l4/family.c
+++ b/hw/bsp/stm32l4/family.c
@@ -264,7 +264,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32n6/boards/stm32n6570dk/board.h b/hw/bsp/stm32n6/boards/stm32n6570dk/board.h
index 4d162bbca..0cba5e1f9 100644
--- a/hw/bsp/stm32n6/boards/stm32n6570dk/board.h
+++ b/hw/bsp/stm32n6/boards/stm32n6570dk/board.h
@@ -244,6 +244,10 @@ static int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint
return 0;
}
+static int32_t i2c_get_tick(void) {
+ return (int32_t) HAL_GetTick();
+}
+
static inline void board_init2(void) {
TCPP0203_IO_t io_ctx;
@@ -252,6 +256,7 @@ static inline void board_init2(void) {
io_ctx.DeInit = board_tcpp0203_deinit;
io_ctx.ReadReg = i2c_readreg;
io_ctx.WriteReg = i2c_writereg;
+ io_ctx.GetTick = i2c_get_tick;
TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );
diff --git a/hw/bsp/stm32n6/boards/stm32n657nucleo/board.h b/hw/bsp/stm32n6/boards/stm32n657nucleo/board.h
index c26367af6..be9ea7a31 100644
--- a/hw/bsp/stm32n6/boards/stm32n657nucleo/board.h
+++ b/hw/bsp/stm32n6/boards/stm32n657nucleo/board.h
@@ -239,6 +239,10 @@ int32_t i2c_writereg(uint16_t DevAddr, uint16_t Reg, uint8_t *pData, uint16_t Le
return 0;
}
+static int32_t i2c_get_tick(void) {
+ return (int32_t) HAL_GetTick();
+}
+
static inline void board_init2(void) {
TCPP0203_IO_t io_ctx;
@@ -247,6 +251,7 @@ static inline void board_init2(void) {
io_ctx.DeInit = board_tcpp0203_deinit;
io_ctx.ReadReg = i2c_readreg;
io_ctx.WriteReg = i2c_writereg;
+ io_ctx.GetTick = i2c_get_tick;
TU_ASSERT(TCPP0203_RegisterBusIO(&tcpp0203_obj, &io_ctx) == TCPP0203_OK, );
diff --git a/hw/bsp/stm32n6/family.c b/hw/bsp/stm32n6/family.c
index 95578af04..80de20c6a 100644
--- a/hw/bsp/stm32n6/family.c
+++ b/hw/bsp/stm32n6/family.c
@@ -388,7 +388,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32u0/family.c b/hw/bsp/stm32u0/family.c
index 5cf6e1eb2..0d20ba43f 100644
--- a/hw/bsp/stm32u0/family.c
+++ b/hw/bsp/stm32u0/family.c
@@ -166,6 +166,19 @@ uint32_t board_button_read(void) {
return BUTTON_STATE_ACTIVE == HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN);
}
+size_t board_get_unique_id(uint8_t id[], size_t max_len) {
+ (void) max_len;
+ volatile uint32_t *stm32_uuid = (volatile uint32_t *) UID_BASE;
+ uint32_t *id32 = (uint32_t *) (uintptr_t) id;
+ uint8_t const len = 12;
+
+ id32[0] = stm32_uuid[0];
+ id32[1] = stm32_uuid[1];
+ id32[2] = stm32_uuid[2];
+
+ return len;
+}
+
int board_uart_read(uint8_t* buf, int len) {
#ifdef UART_ID
int count = 0;
@@ -199,7 +212,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32u5/family.c b/hw/bsp/stm32u5/family.c
index 41e354351..7969b1c70 100644
--- a/hw/bsp/stm32u5/family.c
+++ b/hw/bsp/stm32u5/family.c
@@ -304,7 +304,7 @@ int board_uart_write(void const *buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/stm32wb/family.c b/hw/bsp/stm32wb/family.c
index d97be2115..1f1da2271 100644
--- a/hw/bsp/stm32wb/family.c
+++ b/hw/bsp/stm32wb/family.c
@@ -196,7 +196,7 @@ int board_uart_write(void const* buf, int len) {
return count;
#else
(void) buf; (void) len;
- return 0;
+ return -1;
#endif
}
diff --git a/hw/bsp/tm4c/family.c b/hw/bsp/tm4c/family.c
index 6988a264e..4f85be220 100644
--- a/hw/bsp/tm4c/family.c
+++ b/hw/bsp/tm4c/family.c
@@ -36,7 +36,7 @@ static void board_uart_init(void) {
// BAUDRATE = 115200, with SystemCoreClock = 50 Mhz refer manual for calculation
// - BRDI = SystemCoreClock / (16* baud)
// - BRDF = int(fraction*64 + 0.5)
- UART0->CTL &= ~(1 << 0); // Disable UART0 by clearing UARTEN bit in the UARTCTL register
+ UART0->CTL &= ~(1U << 0); // Disable UART0 by clearing UARTEN bit in the UARTCTL register
UART0->IBRD = 27; // Write the integer portion of the BRD to the UARTIRD register
UART0->FBRD = 8; // Write the fractional portion of the BRD to the UARTFBRD registerer
@@ -58,6 +58,14 @@ static void board_button_init(GPIOA_Type* port, uint8_t PinMsk) {
/* Set direction */
port->DIR &= ~PinMsk;
+
+ /* Enable internal pull so the idle state is deterministic. LaunchPad buttons
+ * connect the pin to GND when pressed (active-low) and require a pull-up. */
+#if BUTTON_STATE_ACTIVE == 0
+ port->PUR |= PinMsk;
+#else
+ port->PDR |= PinMsk;
+#endif
}
static void board_led_init(GPIOA_Type* port, uint8_t PinMsk, uint8_t dirmsk) {
diff --git a/hw/bsp/tm4c/family.cmake b/hw/bsp/tm4c/family.cmake
index 41b8a597a..ce7c62409 100644
--- a/hw/bsp/tm4c/family.cmake
+++ b/hw/bsp/tm4c/family.cmake
@@ -79,6 +79,6 @@ function(family_configure_example TARGET RTOS)
# Flashing
family_add_bin_hex(${TARGET})
family_flash_jlink(${TARGET})
- family_flash_openocd(${TARGET})
- family_flash_uniflash(${TARGET})
+ family_flash_lm4flash(${TARGET})
+ # family_flash_uniflash(${TARGET})
endfunction()
diff --git a/hw/bsp/xmc4000/family.c b/hw/bsp/xmc4000/family.c
index 1325b784b..7e224d092 100644
--- a/hw/bsp/xmc4000/family.c
+++ b/hw/bsp/xmc4000/family.c
@@ -150,7 +150,7 @@ int board_uart_write(void const* buf, int len) {
#else
(void) buf;
(void) len;
- return 0;
+ return -1;
#endif
}