summaryrefslogtreecommitdiff
path: root/hw
diff options
context:
space:
mode:
authorHa Thach <[email protected]>2026-03-14 13:31:49 +0700
committerGitHub <[email protected]>2026-03-14 13:31:49 +0700
commit8b59e6234dfe34f4d0658cea43b338eb04efa3c5 (patch)
tree818140d6c447bd5da959fcdcab1c123295e43f39 /hw
parentf98f7e003fc8c4bcdf503e8c9bff29122b70cc9e (diff)
parentc5e3098c37cf165ffde9a304238558294e328e73 (diff)
Merge pull request #3550 from hathach/update-bsp
Update BSP
Diffstat (limited to 'hw')
-rw-r--r--hw/bsp/ch32f20x/boards/ch32f205r-r0/board.cmake7
-rw-r--r--hw/bsp/ch32f20x/family.cmake97
-rw-r--r--hw/bsp/family_support.cmake34
-rw-r--r--hw/bsp/ft9xx/boards/mm900evxb/board.cmake5
-rw-r--r--hw/bsp/ft9xx/boards/mm900evxb/board.h (renamed from hw/bsp/brtmm90x/boards/mm900evxb/board.h)0
-rw-r--r--hw/bsp/ft9xx/boards/mm900evxb/board.mk1
-rw-r--r--hw/bsp/ft9xx/family.c (renamed from hw/bsp/brtmm90x/family.c)0
-rw-r--r--hw/bsp/ft9xx/family.cmake74
-rw-r--r--hw/bsp/ft9xx/family.mk (renamed from hw/bsp/brtmm90x/family.mk)13
-rw-r--r--hw/bsp/hpmicro/boards/hpm6750evk2/board.h5
-rw-r--r--hw/bsp/kinetis_k32l/FreeRTOSConfig/FreeRTOSConfig.h (renamed from hw/bsp/kinetis_k32l2/FreeRTOSConfig/FreeRTOSConfig.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.cmake (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.cmake)6
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.h (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.mk (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.mk)10
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.c (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.c)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.h (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.cmake (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.cmake)6
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.h (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.mk (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.mk)10
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.c (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.c)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.h (renamed from hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/board.cmake (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/board.cmake)4
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/board.h (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/board.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/board.mk (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/board.mk)8
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/clock_config.c (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.c)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/clock_config.h (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.h)0
-rw-r--r--hw/bsp/kinetis_k32l/boards/kuiic/kuiic.ld (renamed from hw/bsp/kinetis_k32l2/boards/kuiic/kuiic.ld)0
-rw-r--r--hw/bsp/kinetis_k32l/family.c (renamed from hw/bsp/kinetis_k32l2/family.c)0
-rw-r--r--hw/bsp/kinetis_k32l/family.cmake (renamed from hw/bsp/kinetis_k32l2/family.cmake)48
-rw-r--r--hw/bsp/kinetis_k32l/family.mk35
-rw-r--r--hw/bsp/kinetis_k32l2/family.mk35
-rw-r--r--hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h2
-rw-r--r--hw/bsp/rx/boards/gr_citrus/board.cmake19
-rw-r--r--hw/bsp/rx/boards/gr_citrus/board.h21
-rw-r--r--hw/bsp/rx/boards/gr_citrus/gr_citrus.c199
-rw-r--r--hw/bsp/rx/boards/gr_citrus/hwinit.c31
-rw-r--r--hw/bsp/rx/boards/rx65n_target/board.cmake22
-rw-r--r--hw/bsp/rx/boards/rx65n_target/board.h28
-rw-r--r--hw/bsp/rx/boards/rx65n_target/rx65n_target.c209
-rw-r--r--hw/bsp/rx/family.c234
-rw-r--r--hw/bsp/rx/family.cmake83
-rw-r--r--hw/bsp/rx/family.mk4
-rw-r--r--hw/bsp/stm32h7/boards/stm32h747disco/board.h4
43 files changed, 777 insertions, 477 deletions
diff --git a/hw/bsp/ch32f20x/boards/ch32f205r-r0/board.cmake b/hw/bsp/ch32f20x/boards/ch32f205r-r0/board.cmake
new file mode 100644
index 000000000..d2877102d
--- /dev/null
+++ b/hw/bsp/ch32f20x/boards/ch32f205r-r0/board.cmake
@@ -0,0 +1,7 @@
+set(MCU_VARIANT D8C)
+
+function(update_board TARGET)
+ target_compile_definitions(${TARGET} PUBLIC
+ CH32F20x_D8C
+ )
+endfunction()
diff --git a/hw/bsp/ch32f20x/family.cmake b/hw/bsp/ch32f20x/family.cmake
new file mode 100644
index 000000000..2027f7bb1
--- /dev/null
+++ b/hw/bsp/ch32f20x/family.cmake
@@ -0,0 +1,97 @@
+include_guard()
+
+set(CH32_FAMILY ch32f20x)
+set(SDK_DIR ${TOP}/hw/mcu/wch/${CH32_FAMILY})
+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 cortex-m3 CACHE INTERNAL "System Processor")
+set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/arm_${TOOLCHAIN}.cmake)
+
+set(FAMILY_MCUS CH32F20X CACHE INTERNAL "")
+
+#------------------------------------
+# Startup & Linker script
+#------------------------------------
+if (NOT DEFINED LD_FILE_GNU)
+ set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/ch32f205.ld)
+endif ()
+set(LD_FILE_Clang ${LD_FILE_GNU})
+
+if (NOT DEFINED STARTUP_FILE_GNU)
+ set(STARTUP_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/startup_gcc_ch32f20x_d8c.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/src/${CH32_FAMILY}_gpio.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_misc.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_rcc.c
+ ${SDK_SRC_DIR}/StdPeriphDriver/src/${CH32_FAMILY}_usart.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/system_${CH32_FAMILY}.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/debug_uart.c
+ )
+ target_include_directories(${BOARD_TARGET} PUBLIC
+ ${SDK_SRC_DIR}/StdPeriphDriver/inc
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
+ )
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED
+ )
+
+ update_board(${BOARD_TARGET})
+endfunction()
+
+#------------------------------------
+# Functions
+#------------------------------------
+function(family_configure_example TARGET RTOS)
+ family_configure_common(${TARGET} ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_CH32F20X)
+
+ target_sources(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
+ ${TOP}/src/portable/wch/dcd_ch32_usbhs.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
+ "LINKER:--script=${LD_FILE_GNU}"
+ --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 ()
+ 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_stlink(${TARGET})
+endfunction()
diff --git a/hw/bsp/family_support.cmake b/hw/bsp/family_support.cmake
index 5d21b4f79..96d6993e6 100644
--- a/hw/bsp/family_support.cmake
+++ b/hw/bsp/family_support.cmake
@@ -846,6 +846,25 @@ function(family_flash_msp430flasher TARGET)
set_property(TARGET ${TARGET}-msp430flasher PROPERTY FOLDER ${TARGET}-group)
endfunction()
+function(family_flash_rfp TARGET)
+ if (NOT DEFINED RFP_CLI)
+ set(RFP_CLI rfp-cli)
+ endif ()
+
+ add_custom_target(${TARGET}-rfp
+ DEPENDS ${TARGET}
+ COMMAND ${CMAKE_OBJCOPY} -O srec -I elf32-rx-be-ns $<TARGET_FILE:${TARGET}> $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.mot
+ COMMAND ${RFP_CLI} -device ${RFP_DEVICE} -tool ${RFP_TOOL} -if fine
+ -fo id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ -auth id FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
+ -auto $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.mot
+ VERBATIM
+ )
+
+ set_property(TARGET ${TARGET}-rfp PROPERTY FOLDER ${TARGET}-group)
+endfunction()
+
+
function(family_flash_uniflash TARGET)
if (NOT DEFINED DSLITE)
set(DSLITE dslite.sh)
@@ -862,6 +881,21 @@ function(family_flash_uniflash TARGET)
set_property(TARGET ${TARGET}-uniflash PROPERTY FOLDER ${TARGET}-group)
endfunction()
+# Add flash ft9xx target need to remove kernal's ftdi_sio and bind D2XX drivers
+# sudo rmmod ftdi_sio && for i in 0 1 2 3; do sudo sh -c "echo 3-3.4:1.$i > /sys/bus/usb/drivers/ftdi_sio/unbind" 2>/dev/null; done
+function(family_flash_ft9xx TARGET)
+ if (NOT DEFINED FT9XXPROG)
+ set(FT9XXPROG FT9xxProg)
+ endif ()
+
+ add_custom_target(${TARGET}-ft9xx
+ DEPENDS ${TARGET}
+ COMMAND ${FT9XXPROG} -f $<TARGET_FILE_DIR:${TARGET}>/${TARGET}.bin
+ )
+
+ set_property(TARGET ${TARGET}-ft9xx PROPERTY FOLDER ${TARGET}-group)
+endfunction()
+
#----------------------------------
# Family specific
#----------------------------------
diff --git a/hw/bsp/ft9xx/boards/mm900evxb/board.cmake b/hw/bsp/ft9xx/boards/mm900evxb/board.cmake
new file mode 100644
index 000000000..49b779de4
--- /dev/null
+++ b/hw/bsp/ft9xx/boards/mm900evxb/board.cmake
@@ -0,0 +1,5 @@
+function(update_board TARGET)
+ target_compile_definitions(${TARGET} PUBLIC
+ __FT900__
+ )
+endfunction()
diff --git a/hw/bsp/brtmm90x/boards/mm900evxb/board.h b/hw/bsp/ft9xx/boards/mm900evxb/board.h
index 623033c2c..623033c2c 100644
--- a/hw/bsp/brtmm90x/boards/mm900evxb/board.h
+++ b/hw/bsp/ft9xx/boards/mm900evxb/board.h
diff --git a/hw/bsp/ft9xx/boards/mm900evxb/board.mk b/hw/bsp/ft9xx/boards/mm900evxb/board.mk
new file mode 100644
index 000000000..4e22ff2e6
--- /dev/null
+++ b/hw/bsp/ft9xx/boards/mm900evxb/board.mk
@@ -0,0 +1 @@
+CFLAGS += -D__FT900__
diff --git a/hw/bsp/brtmm90x/family.c b/hw/bsp/ft9xx/family.c
index ff24cfe89..ff24cfe89 100644
--- a/hw/bsp/brtmm90x/family.c
+++ b/hw/bsp/ft9xx/family.c
diff --git a/hw/bsp/ft9xx/family.cmake b/hw/bsp/ft9xx/family.cmake
new file mode 100644
index 000000000..31efb3c10
--- /dev/null
+++ b/hw/bsp/ft9xx/family.cmake
@@ -0,0 +1,74 @@
+include_guard()
+
+set(FT9XX_SDK ${TOP}/hw/mcu/bridgetek/ft9xx/ft90x-sdk/Source)
+
+# include board specific
+include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+
+# toolchain set up
+set(CMAKE_SYSTEM_CPU ft32 CACHE INTERNAL "System Processor")
+set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/ft32_${TOOLCHAIN}.cmake)
+
+set(FAMILY_MCUS FT90X CACHE INTERNAL "")
+
+#------------------------------------
+# BOARD_TARGET
+#------------------------------------
+function(family_add_board BOARD_TARGET)
+ add_library(${BOARD_TARGET} STATIC
+ ${FT9XX_SDK}/src/sys.c
+ ${FT9XX_SDK}/src/interrupt.c
+ ${FT9XX_SDK}/src/delay.c
+ ${FT9XX_SDK}/src/timers.c
+ ${FT9XX_SDK}/src/uart_simple.c
+ ${FT9XX_SDK}/src/gpio.c
+ )
+ target_include_directories(${BOARD_TARGET} PUBLIC
+ ${FT9XX_SDK}/include
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ )
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ BOARD_TUD_MAX_SPEED=OPT_MODE_HIGH_SPEED
+ )
+ target_compile_options(${BOARD_TARGET} PUBLIC
+ -fmessage-length=0
+ )
+
+ update_board(${BOARD_TARGET})
+endfunction()
+
+#------------------------------------
+# Functions
+#------------------------------------
+function(family_configure_example TARGET RTOS)
+ family_configure_common(${TARGET} ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_FT90X)
+
+ target_sources(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
+ ${TOP}/src/portable/bridgetek/ft9xx/dcd_ft9xx.c
+ ${FT9XX_SDK}/src/bootstrap.c
+ )
+ set_source_files_properties(${FT9XX_SDK}/src/bootstrap.c PROPERTIES
+ COMPILE_OPTIONS "-w")
+ target_include_directories(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../../
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/boards/${BOARD}
+ )
+ target_compile_options(${TARGET} PUBLIC
+ -Wno-error=shadow
+ )
+
+ if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
+ target_link_options(${TARGET} PUBLIC
+ "LINKER:--script=${TOP}/hw/mcu/bridgetek/ft9xx/scripts/ldscript.ld"
+ "LINKER:--entry=_start"
+ )
+ endif ()
+
+ # Flashing
+ family_add_bin_hex(${TARGET})
+ family_flash_ft9xx(${TARGET})
+endfunction()
diff --git a/hw/bsp/brtmm90x/family.mk b/hw/bsp/ft9xx/family.mk
index 2de4dc760..9d71bf321 100644
--- a/hw/bsp/brtmm90x/family.mk
+++ b/hw/bsp/ft9xx/family.mk
@@ -18,13 +18,14 @@ FT9XX_SDK = hw/mcu/bridgetek/ft9xx/ft90x-sdk/Source
INC += "$(TOP)/$(FT9XX_SDK)/include"
endif
+include $(TOP)/$(BOARD_PATH)/board.mk
+
# Add include files which are within the TinyUSB directory structure.
INC += \
$(TOP)/$(BOARD_PATH)
-# Add required C Compiler flags for FT90X.
+# Add required C Compiler flags for FT9XX.
CFLAGS += \
- -D__FT900__ \
-fvar-tracking \
-fvar-tracking-assignments \
-fmessage-length=0 \
@@ -50,6 +51,7 @@ SRC_C += src/portable/bridgetek/ft9xx/dcd_ft9xx.c
ifneq ($(FT9XX_PREBUILT_LIBS),1)
# Optionally add in files from the Bridgetek SDK instead of the prebuilt
# library. These are the minimum required.
+SRC_C += $(FT9XX_SDK)/src/bootstrap.c
SRC_C += $(FT9XX_SDK)/src/sys.c
SRC_C += $(FT9XX_SDK)/src/interrupt.c
SRC_C += $(FT9XX_SDK)/src/delay.c
@@ -64,3 +66,10 @@ endif
# Not required crt0 file for FT90X. Use compiler built-in file.
#SRC_S += hw/mcu/bridgetek/ft9xx/scripts/crt0.S
+
+# Flash using FT9xxProg, need to remove kernal's ftdi_sio and bind D2XX drivers
+# sudo rmmod ftdi_sio && for i in 0 1 2 3; do sudo sh -c "echo 3-3.4:1.$i > /sys/bus/usb/drivers/ftdi_sio/unbind" 2>/dev/null; done
+FT9XXPROG ?= FT9xxProg
+flash: flash-ft9xx
+flash-ft9xx: $(BUILD)/$(PROJECT).bin
+ $(FT9XXPROG) -f $<
diff --git a/hw/bsp/hpmicro/boards/hpm6750evk2/board.h b/hw/bsp/hpmicro/boards/hpm6750evk2/board.h
index 0636a4722..929e11c0d 100644
--- a/hw/bsp/hpmicro/boards/hpm6750evk2/board.h
+++ b/hw/bsp/hpmicro/boards/hpm6750evk2/board.h
@@ -5,6 +5,11 @@
*
*/
+/* metadata:
+ name: HPM6750EVK2
+ url: https://hpm-sdk.readthedocs.io/en/v1.6.0/boards/hpm6750evk2/README_en.html
+*/
+
#ifndef _HPM_BOARD_H
#define _HPM_BOARD_H
diff --git a/hw/bsp/kinetis_k32l2/FreeRTOSConfig/FreeRTOSConfig.h b/hw/bsp/kinetis_k32l/FreeRTOSConfig/FreeRTOSConfig.h
index 0225abe8d..0225abe8d 100644
--- a/hw/bsp/kinetis_k32l2/FreeRTOSConfig/FreeRTOSConfig.h
+++ b/hw/bsp/kinetis_k32l/FreeRTOSConfig/FreeRTOSConfig.h
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.cmake b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.cmake
index 538aec2ca..3e7a4cac6 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.cmake
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.cmake
@@ -1,9 +1,10 @@
set(MCU_VARIANT K32L2A41A)
+set(MCU_CORE ${MCU_VARIANT})
set(JLINK_DEVICE K32L2A41xxxxA)
set(PYOCD_TARGET K32L2A)
-set(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/K32L2A41xxxxA_flash.ld)
+set(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/K32L2A41xxxxA_flash.ld)
function(update_board TARGET)
target_sources(${TARGET} PUBLIC
@@ -12,4 +13,7 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_K32L2A41VLH1A
)
+ target_include_directories(${TARGET} PUBLIC
+ ${MCUX_DEVICES}/K32L/periph1
+ )
endfunction()
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.h b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.h
index 9e2534307..9e2534307 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.h
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.h
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.mk b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.mk
index fb3eb2a03..513b78d66 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/board.mk
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/board.mk
@@ -1,4 +1,4 @@
-MCU = K32L2A41A
+MCU_VARIANT = K32L2A41A
CFLAGS += -DCPU_K32L2A41VLH1A
@@ -6,7 +6,13 @@ CFLAGS += -DCPU_K32L2A41VLH1A
CFLAGS_GCC += -Wno-error=unused-parameter -Wno-error=redundant-decls -Wno-error=cast-qual
# All source paths should be relative to the top level.
-LD_FILE = $(MCU_DIR)/gcc/K32L2A41xxxxA_flash.ld
+LD_FILE = $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/K32L2A41xxxxA_flash.ld
+
+INC += \
+ $(TOP)/$(MCUX_DEVICES)/K32L/periph1
+
+SRC_C += \
+ $(BOARD_PATH)/clock_config.c
# For flash-jlink target
JLINK_DEVICE = K32L2A41xxxxA
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.c b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.c
index 7947faefe..7947faefe 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.c
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.c
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.h b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.h
index c01d5e03c..c01d5e03c 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2a4s/clock_config.h
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2a4s/clock_config.h
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.cmake b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.cmake
index 2ec2acace..0efb0cb3f 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.cmake
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.cmake
@@ -1,9 +1,10 @@
set(MCU_VARIANT K32L2B31A)
+set(MCU_CORE ${MCU_VARIANT})
set(JLINK_DEVICE K32L2B31xxxxA)
set(PYOCD_TARGET K32L2B)
-set(LD_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/K32L2B31xxxxA_flash.ld)
+set(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/K32L2B31xxxxA_flash.ld)
function(update_board TARGET)
target_sources(${TARGET} PUBLIC
@@ -12,4 +13,7 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_K32L2B31VLH0A
)
+ target_include_directories(${TARGET} PUBLIC
+ ${MCUX_DEVICES}/K32L/periph2
+ )
endfunction()
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.h b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.h
index 854340d6d..854340d6d 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.h
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.h
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.mk b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.mk
index 9cf36c500..b204a142c 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/board.mk
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/board.mk
@@ -1,4 +1,4 @@
-MCU = K32L2B31A
+MCU_VARIANT = K32L2B31A
CFLAGS += -DCPU_K32L2B31VLH0A
@@ -6,7 +6,13 @@ CFLAGS += -DCPU_K32L2B31VLH0A
CFLAGS += -Wno-error=unused-parameter -Wno-error=redundant-decls
# All source paths should be relative to the top level.
-LD_FILE = $(MCU_DIR)/gcc/K32L2B31xxxxA_flash.ld
+LD_FILE = $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/K32L2B31xxxxA_flash.ld
+
+INC += \
+ $(TOP)/$(MCUX_DEVICES)/K32L/periph2
+
+SRC_C += \
+ $(BOARD_PATH)/clock_config.c
# For flash-jlink target
JLINK_DEVICE = K32L2B31xxxxA
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.c b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.c
index 86eb42ef8..86eb42ef8 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.c
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.c
diff --git a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.h b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.h
index 37328e7d8..37328e7d8 100644
--- a/hw/bsp/kinetis_k32l2/boards/frdm_k32l2b/clock_config.h
+++ b/hw/bsp/kinetis_k32l/boards/frdm_k32l2b/clock_config.h
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/board.cmake b/hw/bsp/kinetis_k32l/boards/kuiic/board.cmake
index cf14000ac..506f23e51 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/board.cmake
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/board.cmake
@@ -1,4 +1,5 @@
set(MCU_VARIANT K32L2B31A)
+set(MCU_CORE ${MCU_VARIANT})
set(JLINK_DEVICE K32L2B31xxxxA)
set(PYOCD_TARGET K32L2B)
@@ -12,4 +13,7 @@ function(update_board TARGET)
target_compile_definitions(${TARGET} PUBLIC
CPU_K32L2B31VLH0A
)
+ target_include_directories(${TARGET} PUBLIC
+ ${MCUX_DEVICES}/K32L/periph2
+ )
endfunction()
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/board.h b/hw/bsp/kinetis_k32l/boards/kuiic/board.h
index f5895fc65..f5895fc65 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/board.h
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/board.h
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/board.mk b/hw/bsp/kinetis_k32l/boards/kuiic/board.mk
index 2bc5b1e34..4dc4ff60b 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/board.mk
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/board.mk
@@ -1,4 +1,4 @@
-MCU = K32L2B31A
+MCU_VARIANT = K32L2B31A
CFLAGS += -DCPU_K32L2B31VLH0A
@@ -8,6 +8,12 @@ CFLAGS += -Wno-error=unused-parameter -Wno-error=redundant-decls
# All source paths should be relative to the top level.
LD_FILE = $(BOARD_PATH)/kuiic.ld
+INC += \
+ $(TOP)/$(MCUX_DEVICES)/K32L/periph2
+
+SRC_C += \
+ $(BOARD_PATH)/clock_config.c
+
# For flash-jlink target
JLINK_DEVICE = K32L2B31xxxxA
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.c b/hw/bsp/kinetis_k32l/boards/kuiic/clock_config.c
index c1a6d1a8d..c1a6d1a8d 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.c
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/clock_config.c
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.h b/hw/bsp/kinetis_k32l/boards/kuiic/clock_config.h
index 920cad98f..920cad98f 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/clock_config.h
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/clock_config.h
diff --git a/hw/bsp/kinetis_k32l2/boards/kuiic/kuiic.ld b/hw/bsp/kinetis_k32l/boards/kuiic/kuiic.ld
index f478a99c7..f478a99c7 100644
--- a/hw/bsp/kinetis_k32l2/boards/kuiic/kuiic.ld
+++ b/hw/bsp/kinetis_k32l/boards/kuiic/kuiic.ld
diff --git a/hw/bsp/kinetis_k32l2/family.c b/hw/bsp/kinetis_k32l/family.c
index ec8dc6ecf..ec8dc6ecf 100644
--- a/hw/bsp/kinetis_k32l2/family.c
+++ b/hw/bsp/kinetis_k32l/family.c
diff --git a/hw/bsp/kinetis_k32l2/family.cmake b/hw/bsp/kinetis_k32l/family.cmake
index 110335ab2..020695589 100644
--- a/hw/bsp/kinetis_k32l2/family.cmake
+++ b/hw/bsp/kinetis_k32l/family.cmake
@@ -1,7 +1,8 @@
include_guard()
-set(SDK_DIR ${TOP}/hw/mcu/nxp/mcux-sdk)
-set(CMSIS_DIR ${TOP}/lib/CMSIS_5)
+set(MCUX_CORE ${TOP}/hw/mcu/nxp/mcuxsdk-core)
+set(MCUX_DEVICES ${TOP}/hw/mcu/nxp/mcux-devices-kinetis)
+set(CMSIS_DIR ${TOP}/lib/CMSIS_6)
# include board specific
include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
@@ -16,32 +17,38 @@ set(FAMILY_MCUS KINETIS_K32L CACHE INTERNAL "")
#------------------------------------
# Startup & Linker script
#------------------------------------
-set(LD_FILE_Clang ${LD_FILE_GNU})
-set(STARTUP_FILE_GNU ${SDK_DIR}/devices/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S)
-set(STARTUP_FILE_Clang ${STARTUP_FILE_GNU})
+if (NOT DEFINED LD_FILE_GNU)
+ set(LD_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/${MCU_CORE}_flash.ld)
+endif ()
+if (NOT DEFINED STARTUP_FILE_GNU)
+ set(STARTUP_FILE_GNU ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/gcc/startup_${MCU_VARIANT}.S)
+endif ()
#------------------------------------
# Board Target
#------------------------------------
function(family_add_board BOARD_TARGET)
add_library(${BOARD_TARGET} STATIC
- ${SDK_DIR}/drivers/gpio/fsl_gpio.c
- ${SDK_DIR}/drivers/lpuart/fsl_lpuart.c
- ${SDK_DIR}/devices/${MCU_VARIANT}/drivers/fsl_clock.c
- ${SDK_DIR}/devices/${MCU_VARIANT}/system_${MCU_VARIANT}.c
+ # driver
+ ${MCUX_CORE}/drivers/gpio/fsl_gpio.c
+ ${MCUX_CORE}/drivers/common/fsl_common_arm.c
+ ${MCUX_CORE}/drivers/lpuart/fsl_lpuart.c
+ # mcu
+ ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/system_${MCU_VARIANT}.c
+ ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/drivers/fsl_clock.c
)
target_compile_definitions(${BOARD_TARGET} PUBLIC
__STARTUP_CLEAR_BSS
)
target_include_directories(${BOARD_TARGET} PUBLIC
${CMSIS_DIR}/CMSIS/Core/Include
- ${SDK_DIR}/devices/${MCU_VARIANT}
- ${SDK_DIR}/devices/${MCU_VARIANT}/drivers
- ${SDK_DIR}/drivers/common
- ${SDK_DIR}/drivers/gpio
- ${SDK_DIR}/drivers/lpuart
- ${SDK_DIR}/drivers/port
- ${SDK_DIR}/drivers/smc
+ ${MCUX_CORE}/drivers/common
+ ${MCUX_CORE}/drivers/gpio
+ ${MCUX_CORE}/drivers/lpuart
+ ${MCUX_CORE}/drivers/port
+ ${MCUX_CORE}/drivers/smc
+ ${MCUX_DEVICES}/K32L/${MCU_VARIANT}
+ ${MCUX_DEVICES}/K32L/${MCU_VARIANT}/drivers
)
update_board(${BOARD_TARGET})
@@ -73,19 +80,12 @@ function(family_configure_example TARGET RTOS)
--specs=nosys.specs --specs=nano.specs
-nostartfiles
)
- elseif (CMAKE_C_COMPILER_ID STREQUAL "Clang")
- target_link_options(${TARGET} PUBLIC
- "LINKER:--script=${LD_FILE_GNU}"
- )
+ set_source_files_properties(${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes")
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 ()
set_source_files_properties(${STARTUP_FILE_${CMAKE_C_COMPILER_ID}} PROPERTIES
SKIP_LINTING ON
COMPILE_OPTIONS -w)
diff --git a/hw/bsp/kinetis_k32l/family.mk b/hw/bsp/kinetis_k32l/family.mk
new file mode 100644
index 000000000..2802337d3
--- /dev/null
+++ b/hw/bsp/kinetis_k32l/family.mk
@@ -0,0 +1,35 @@
+UF2_FAMILY_ID = 0x7f83e793
+
+include $(TOP)/$(BOARD_PATH)/board.mk
+CPU_CORE ?= cortex-m0plus
+MCUX_CORE = hw/mcu/nxp/mcuxsdk-core
+MCUX_DEVICES = hw/mcu/nxp/mcux-devices-kinetis
+
+CFLAGS += \
+ -DCFG_TUSB_MCU=OPT_MCU_KINETIS_K32L
+
+LDFLAGS_GCC += \
+ -nostartfiles \
+ -specs=nosys.specs -specs=nano.specs
+
+SRC_C += \
+ src/portable/nxp/khci/dcd_khci.c \
+ src/portable/nxp/khci/hcd_khci.c \
+ $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/system_$(MCU_VARIANT).c \
+ $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/drivers/fsl_clock.c \
+ $(MCUX_CORE)/drivers/gpio/fsl_gpio.c \
+ $(MCUX_CORE)/drivers/lpuart/fsl_lpuart.c \
+ $(MCUX_CORE)/drivers/common/fsl_common_arm.c
+
+INC += \
+ $(TOP)/$(BOARD_PATH) \
+ $(TOP)/lib/CMSIS_6/CMSIS/Core/Include \
+ $(TOP)/$(MCUX_DEVICES)/K32L/$(MCU_VARIANT) \
+ $(TOP)/$(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/drivers \
+ $(TOP)/$(MCUX_CORE)/drivers/common \
+ $(TOP)/$(MCUX_CORE)/drivers/gpio \
+ $(TOP)/$(MCUX_CORE)/drivers/lpuart \
+ $(TOP)/$(MCUX_CORE)/drivers/port \
+ $(TOP)/$(MCUX_CORE)/drivers/smc
+
+SRC_S += $(MCUX_DEVICES)/K32L/$(MCU_VARIANT)/gcc/startup_$(MCU_VARIANT).S
diff --git a/hw/bsp/kinetis_k32l2/family.mk b/hw/bsp/kinetis_k32l2/family.mk
deleted file mode 100644
index e18348d4d..000000000
--- a/hw/bsp/kinetis_k32l2/family.mk
+++ /dev/null
@@ -1,35 +0,0 @@
-UF2_FAMILY_ID = 0x7f83e793
-SDK_DIR = hw/mcu/nxp/mcux-sdk
-MCU_DIR = $(SDK_DIR)/devices/$(MCU)
-
-include $(TOP)/$(BOARD_PATH)/board.mk
-CPU_CORE ?= cortex-m0plus
-
-CFLAGS += \
- -DCFG_TUSB_MCU=OPT_MCU_KINETIS_K32L
-
-LDFLAGS_GCC += \
- -nostartfiles \
- -specs=nosys.specs -specs=nano.specs
-
-SRC_C += \
- src/portable/nxp/khci/dcd_khci.c \
- src/portable/nxp/khci/hcd_khci.c \
- $(MCU_DIR)/system_$(MCU).c \
- $(MCU_DIR)/drivers/fsl_clock.c \
- $(SDK_DIR)/drivers/gpio/fsl_gpio.c \
- $(SDK_DIR)/drivers/lpuart/fsl_lpuart.c
-
-INC += \
- $(TOP)/$(BOARD_PATH) \
- $(TOP)/lib/CMSIS_5/CMSIS/Core/Include \
- $(TOP)/$(MCU_DIR) \
- $(TOP)/$(MCU_DIR)/project_template \
- $(TOP)/$(MCU_DIR)/drivers \
- $(TOP)/$(SDK_DIR)/drivers/common \
- $(TOP)/$(SDK_DIR)/drivers/gpio \
- $(TOP)/$(SDK_DIR)/drivers/lpuart \
- $(TOP)/$(SDK_DIR)/drivers/port \
- $(TOP)/$(SDK_DIR)/drivers/smc \
-
-SRC_S += $(MCU_DIR)/gcc/startup_$(MCU).S
diff --git a/hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h b/hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h
index edf0a8433..d9de30099 100644
--- a/hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h
+++ b/hw/bsp/rx/FreeRTOSConfig/FreeRTOSConfig.h
@@ -109,7 +109,7 @@ extern uint32_t SystemCoreClock;
#define INCLUDE_vTaskDelayUntil 1
#define INCLUDE_vTaskDelay 1
#define INCLUDE_xTaskGetSchedulerState 0
-#define INCLUDE_xTaskGetCurrentTaskHandle 0
+#define INCLUDE_xTaskGetCurrentTaskHandle 1
#define INCLUDE_uxTaskGetStackHighWaterMark 0
#define INCLUDE_xTaskGetIdleTaskHandle 0
#define INCLUDE_xTimerGetTimerDaemonTaskHandle 0
diff --git a/hw/bsp/rx/boards/gr_citrus/board.cmake b/hw/bsp/rx/boards/gr_citrus/board.cmake
new file mode 100644
index 000000000..d6200e386
--- /dev/null
+++ b/hw/bsp/rx/boards/gr_citrus/board.cmake
@@ -0,0 +1,19 @@
+set(MCU_VARIANT rx63n)
+set(MCU_FAMILY RX63X)
+
+set(CMAKE_SYSTEM_CPU rx610 CACHE INTERNAL "System Processor")
+
+set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/r5f5631fd.ld)
+
+set(JLINK_DEVICE R5F5631F)
+set(JLINK_IF JTAG)
+
+set(BOARD_SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/gr_citrus.c
+ )
+
+function(update_board TARGET)
+ target_include_directories(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ )
+endfunction()
diff --git a/hw/bsp/rx/boards/gr_citrus/board.h b/hw/bsp/rx/boards/gr_citrus/board.h
index 617d309c3..cc0139e18 100644
--- a/hw/bsp/rx/boards/gr_citrus/board.h
+++ b/hw/bsp/rx/boards/gr_citrus/board.h
@@ -32,10 +32,31 @@
#ifndef BOARD_H_
#define BOARD_H_
+#include "iodefine.h"
+
#ifdef __cplusplus
extern "C" {
#endif
+// LED: PA0, active high
+#define BOARD_LED_WRITE(state) (PORTA.PODR.BIT.B0 = (state) ? 1 : 0)
+
+// No user button
+#define BOARD_BUTTON_READ() 0
+
+// UART: SCI0
+#define BOARD_UART_SCI SCI0
+#define BOARD_SCI_TXI_HANDLER INT_Excep_SCI0_TXI0
+#define BOARD_SCI_TEI_HANDLER INT_Excep_SCI0_TEI0
+#define BOARD_SCI_RXI_HANDLER INT_Excep_SCI0_RXI0
+
+// USB interrupt handler
+#define BOARD_USB_IRQ_HANDLER INT_Excep_USB0_USBI0
+
+// Clocks
+#define BOARD_PCLK 48000000
+#define BOARD_CPUCLK 96000000
+
#ifdef __cplusplus
}
#endif
diff --git a/hw/bsp/rx/boards/gr_citrus/gr_citrus.c b/hw/bsp/rx/boards/gr_citrus/gr_citrus.c
index e5b24bf69..af8c108d0 100644
--- a/hw/bsp/rx/boards/gr_citrus/gr_citrus.c
+++ b/hw/bsp/rx/boards/gr_citrus/gr_citrus.c
@@ -52,141 +52,63 @@
* regarding downloading.
*/
-#include "bsp/board_api.h"
#include "iodefine.h"
-#include "interrupt_handlers.h"
-
-#define IRQ_PRIORITY_CMT0 5
-#define IRQ_PRIORITY_USBI0 6
-#define IRQ_PRIORITY_SCI0 5
+#include "board.h"
#define SYSTEM_PRCR_PRC1 (1<<1)
#define SYSTEM_PRCR_PRKEY (0xA5u<<8)
-
-#define CMT_PCLK 48000000
-#define CMT_CMCR_CKS_DIV_128 2
-#define CMT_CMCR_CMIE (1<<6)
#define MPC_PFS_ISEL (1<<6)
+#define IRQ_PRIORITY_SCI0 5
#define SCI_PCLK 48000000
-#define SCI_SSR_FER (1<<4)
-#define SCI_SSR_ORER (1<<5)
-
-#define SCI_SCR_TEIE (1u<<2)
-#define SCI_SCR_RE (1u<<4)
-#define SCI_SCR_TE (1u<<5)
-#define SCI_SCR_RIE (1u<<6)
-#define SCI_SCR_TIE (1u<<7)
-
-//--------------------------------------------------------------------+
-// SCI0 handling
-//--------------------------------------------------------------------+
-typedef struct {
- uint8_t *buf;
- uint32_t cnt;
-} sci_buf_t;
-static volatile sci_buf_t sci0_buf[2];
-
-void INT_Excep_SCI0_TXI0(void)
-{
- uint8_t *buf = sci0_buf[0].buf;
- uint32_t cnt = sci0_buf[0].cnt;
-
- if (!buf || !cnt) {
- SCI0.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
- return;
- }
- SCI0.TDR = *buf;
- if (--cnt) {
- ++buf;
- } else {
- buf = NULL;
- SCI0.SCR.BIT.TIE = 0;
- SCI0.SCR.BIT.TEIE = 1;
- }
- sci0_buf[0].buf = buf;
- sci0_buf[0].cnt = cnt;
-}
-
-void INT_Excep_SCI0_TEI0(void)
-{
- SCI0.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
-}
-
-void INT_Excep_SCI0_RXI0(void)
-{
- uint8_t *buf = sci0_buf[1].buf;
- uint32_t cnt = sci0_buf[1].cnt;
-
- if (!buf || !cnt ||
- (SCI0.SSR.BYTE & (SCI_SSR_FER | SCI_SSR_ORER))) {
- sci0_buf[1].buf = NULL;
- SCI0.SSR.BYTE = 0;
- SCI0.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
- return;
- }
- *buf = SCI0.RDR;
- if (--cnt) {
- ++buf;
- } else {
- buf = NULL;
- SCI0.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
- }
- sci0_buf[1].buf = buf;
- sci0_buf[1].cnt = cnt;
-}
-//--------------------------------------------------------------------+
-// Forward USB interrupt events to TinyUSB IRQ Handler
-//--------------------------------------------------------------------+
-void INT_Excep_USB0_USBI0(void)
+void HardwareSetup(void)
{
- tud_int_handler(0);
+ SYSTEM.PRCR.WORD = 0xA503u;
+ SYSTEM.SOSCCR.BYTE = 0x01u;
+ SYSTEM.MOSCWTCR.BYTE = 0x0Du;
+ SYSTEM.PLLWTCR.BYTE = 0x0Eu;
+ SYSTEM.PLLCR.WORD = 0x0F00u;
+ SYSTEM.MOSCCR.BYTE = 0x00u;
+ SYSTEM.PLLCR2.BYTE = 0x00u;
+ for (unsigned i = 0; i < 2075u; ++i) __asm("nop");
+ SYSTEM.SCKCR.LONG = 0x21021211u;
+ SYSTEM.SCKCR2.WORD = 0x0033u;
+ SYSTEM.SCKCR3.WORD = 0x0400u;
+ SYSTEM.SYSCR0.WORD = 0x5A01;
+ SYSTEM.MSTPCRB.BIT.MSTPB15 = 0;
+ SYSTEM.PRCR.WORD = 0xA500u;
}
-void board_init(void)
+void board_pin_init(void)
{
-#if CFG_TUSB_OS == OPT_OS_NONE
- /* Enable CMT0 */
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
- MSTP(CMT0) = 0;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY;
- /* Setup 1ms tick timer */
- CMT0.CMCNT = 0;
- CMT0.CMCOR = CMT_PCLK / 1000 / 128;
- CMT0.CMCR.WORD = CMT_CMCR_CMIE | CMT_CMCR_CKS_DIV_128;
- IR(CMT0, CMI0) = 0;
- IPR(CMT0, CMI0) = IRQ_PRIORITY_CMT0;
- IEN(CMT0, CMI0) = 1;
- CMT.CMSTR0.BIT.STR0 = 1;
-#endif
-
/* Unlock MPC registers */
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
+
/* LED PA0 */
PORTA.PMR.BIT.B0 = 0U;
PORTA.PODR.BIT.B0 = 0U;
PORTA.PDR.BIT.B0 = 1U;
+
/* UART TXD0 => P20, RXD0 => P21 */
PORT2.PMR.BIT.B0 = 1U;
PORT2.PCR.BIT.B0 = 1U;
MPC.P20PFS.BYTE = 0b01010;
PORT2.PMR.BIT.B1 = 1U;
MPC.P21PFS.BYTE = 0b01010;
+
/* USB VBUS -> P16 DPUPE -> P14 */
PORT1.PMR.BIT.B4 = 1U;
PORT1.PMR.BIT.B6 = 1U;
MPC.P14PFS.BYTE = 0b10001;
MPC.P16PFS.BYTE = MPC_PFS_ISEL | 0b10001;
MPC.PFUSB0.BIT.PUPHZS = 1;
+
/* Lock MPC registers */
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
- IR(USB0, USBI0) = 0;
- IPR(USB0, USBI0) = IRQ_PRIORITY_USBI0;
-
/* Enable SCI0 */
SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
MSTP(SCI0) = 0;
@@ -201,81 +123,4 @@ void board_init(void)
IEN(SCI0, RXI0) = 1;
IEN(SCI0, TXI0) = 1;
IEN(SCI0, TEI0) = 1;
-
- /* Enable USB0 */
- unsigned short oldPRCR = SYSTEM.PRCR.WORD;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
- MSTP(USB0) = 0;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | oldPRCR;
-}
-
-//--------------------------------------------------------------------+
-// Board porting API
-//--------------------------------------------------------------------+
-
-void board_led_write(bool state)
-{
- PORTA.PODR.BIT.B0 = state ? 1 : 0;
-}
-
-uint32_t board_button_read(void)
-{
- return 0;
-}
-
-int board_uart_read(uint8_t* buf, int len)
-{
- sci0_buf[1].buf = buf;
- sci0_buf[1].cnt = len;
- SCI0.SCR.BYTE |= SCI_SCR_RE | SCI_SCR_RIE;
- while (SCI0.SCR.BIT.RE) ;
- return len - sci0_buf[1].cnt;
-}
-
-int board_uart_write(void const *buf, int len)
-{
- sci0_buf[0].buf = (uint8_t*)(uintptr_t) buf;
- sci0_buf[0].cnt = len;
- SCI0.SCR.BYTE |= SCI_SCR_TE | SCI_SCR_TIE;
- while (SCI0.SCR.BIT.TE) ;
- return len;
-}
-
-#if CFG_TUSB_OS == OPT_OS_NONE
-volatile uint32_t system_ticks = 0;
-void INT_Excep_CMT0_CMI0(void)
-{
- ++system_ticks;
-}
-
-uint32_t tusb_time_millis_api(void)
-{
- return system_ticks;
-}
-#else
-uint32_t SystemCoreClock = 96000000;
-#endif
-
-int close(int fd)
-{
- (void)fd;
- return -1;
-}
-int fstat(int fd, void *pstat)
-{
- (void)fd;
- (void)pstat;
- return 0;
-}
-off_t lseek(int fd, off_t pos, int whence)
-{
- (void)fd;
- (void)pos;
- (void)whence;
- return 0;
-}
-int isatty(int fd)
-{
- (void)fd;
- return 1;
}
diff --git a/hw/bsp/rx/boards/gr_citrus/hwinit.c b/hw/bsp/rx/boards/gr_citrus/hwinit.c
deleted file mode 100644
index 8245d7744..000000000
--- a/hw/bsp/rx/boards/gr_citrus/hwinit.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/************************************************************************/
-/* File Version: V1.00 */
-/* Date Generated: 08/07/2013 */
-/************************************************************************/
-
-#include "iodefine.h"
-#ifdef __cplusplus
-extern "C" {
-#endif
-extern void HardwareSetup(void);
-#ifdef __cplusplus
-}
-#endif
-
-void HardwareSetup(void)
-{
- SYSTEM.PRCR.WORD = 0xA503u;
- SYSTEM.SOSCCR.BYTE = 0x01u;
- SYSTEM.MOSCWTCR.BYTE = 0x0Du;
- SYSTEM.PLLWTCR.BYTE = 0x0Eu;
- SYSTEM.PLLCR.WORD = 0x0F00u;
- SYSTEM.MOSCCR.BYTE = 0x00u;
- SYSTEM.PLLCR2.BYTE = 0x00u;
- for (unsigned i = 0; i < 2075u; ++i) __asm("nop");
- SYSTEM.SCKCR.LONG = 0x21021211u;
- SYSTEM.SCKCR2.WORD = 0x0033u;
- SYSTEM.SCKCR3.WORD = 0x0400u;
- SYSTEM.SYSCR0.WORD = 0x5A01;
- SYSTEM.MSTPCRB.BIT.MSTPB15 = 0;
- SYSTEM.PRCR.WORD = 0xA500u;
-}
diff --git a/hw/bsp/rx/boards/rx65n_target/board.cmake b/hw/bsp/rx/boards/rx65n_target/board.cmake
new file mode 100644
index 000000000..c8b9286bc
--- /dev/null
+++ b/hw/bsp/rx/boards/rx65n_target/board.cmake
@@ -0,0 +1,22 @@
+set(MCU_VARIANT rx65n)
+set(MCU_FAMILY RX65X)
+
+set(CMAKE_SYSTEM_CPU rx64m CACHE INTERNAL "System Processor")
+
+set(LD_FILE_GNU ${CMAKE_CURRENT_LIST_DIR}/r5f565ne.ld)
+
+set(JLINK_DEVICE R5F565NE)
+set(JLINK_IF JTAG)
+
+set(RFP_DEVICE rx65x)
+set(RFP_TOOL e2l)
+
+set(BOARD_SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/rx65n_target.c
+ )
+
+function(update_board TARGET)
+ target_include_directories(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ )
+endfunction()
diff --git a/hw/bsp/rx/boards/rx65n_target/board.h b/hw/bsp/rx/boards/rx65n_target/board.h
index 8c8e7b95f..4f1367fbd 100644
--- a/hw/bsp/rx/boards/rx65n_target/board.h
+++ b/hw/bsp/rx/boards/rx65n_target/board.h
@@ -32,10 +32,38 @@
#ifndef BOARD_H_
#define BOARD_H_
+#include "iodefine.h"
+
#ifdef __cplusplus
extern "C" {
#endif
+// LED: PD6, active low (open-drain)
+#define BOARD_LED_WRITE(state) (PORTD.PODR.BIT.B6 = (state) ? 0 : 1)
+
+// Button: PB1, active low
+#define BOARD_BUTTON_READ() (PORTB.PIDR.BIT.B1 ? 0 : 1)
+
+// UART: SCI5
+#define BOARD_UART_SCI SCI5
+#define BOARD_SCI_TXI_HANDLER INT_Excep_SCI5_TXI5
+#define BOARD_SCI_TEI_HANDLER INT_Excep_ICU_GROUPBL0 // SCI5 TEI uses group interrupt
+#define BOARD_SCI_RXI_HANDLER INT_Excep_SCI5_RXI5
+
+// USB interrupt handler (software configurable vector)
+#define IRQ_USB0_USBI0 62
+#define SLIBR_USBI0 SLIBR185
+#define IR_USB0_USBI0 IR_PERIB_INTB185
+#define IER_USB0_USBI0 IER_PERIB_INTB185
+#define IEN_USB0_USBI0 IEN_PERIB_INTB185
+#define IPR_USB0_USBI0 IPR_PERIB_INTB185
+#define INT_Excep_USB0_USBI0 INT_Excep_PERIB_INTB185
+#define BOARD_USB_IRQ_HANDLER INT_Excep_USB0_USBI0
+
+// Clocks
+#define BOARD_PCLK 60000000
+#define BOARD_CPUCLK 120000000
+
#ifdef __cplusplus
}
#endif
diff --git a/hw/bsp/rx/boards/rx65n_target/rx65n_target.c b/hw/bsp/rx/boards/rx65n_target/rx65n_target.c
index d5c2de05a..318cd1b6d 100644
--- a/hw/bsp/rx/boards/rx65n_target/rx65n_target.c
+++ b/hw/bsp/rx/boards/rx65n_target/rx65n_target.c
@@ -50,37 +50,15 @@
* regarding downloading.
*/
-#include "bsp/board_api.h"
#include "iodefine.h"
-#include "interrupt_handlers.h"
-
-#define IRQ_PRIORITY_CMT0 5
-#define IRQ_PRIORITY_USBI0 6
-#define IRQ_PRIORITY_SCI5 5
+#include "board.h"
#define SYSTEM_PRCR_PRC1 (1<<1)
#define SYSTEM_PRCR_PRKEY (0xA5u<<8)
-
-#define CMT_PCLK 60000000
-#define CMT_CMCR_CKS_DIV_128 2
-#define CMT_CMCR_CMIE (1<<6)
#define MPC_PFS_ISEL (1<<6)
+#define IRQ_PRIORITY_SCI5 5
#define SCI_PCLK 60000000
-#define SCI_SSR_FER (1<<4)
-#define SCI_SSR_ORER (1<<5)
-
-#define SCI_SCR_TEIE (1u<<2)
-#define SCI_SCR_RE (1u<<4)
-#define SCI_SCR_TE (1u<<5)
-#define SCI_SCR_RIE (1u<<6)
-#define SCI_SCR_TIE (1u<<7)
-#define INT_Excep_SCI5_TEI5 INT_Excep_ICU_GROUPBL0
-
-#define IRQ_USB0_USBI0 62
-#define SLIBR_USBI0 SLIBR185
-#define IPR_USB0_USBI0 IPR_PERIB_INTB185
-#define INT_Excep_USB0_USBI0 INT_Excep_PERIB_INTB185
void HardwareSetup(void)
{
@@ -113,118 +91,37 @@ void HardwareSetup(void)
SYSTEM.PRCR.WORD = 0xA500u;
}
-//--------------------------------------------------------------------+
-// SCI handling
-//--------------------------------------------------------------------+
-typedef struct {
- uint8_t *buf;
- uint32_t cnt;
-} sci_buf_t;
-static volatile sci_buf_t sci_buf[2];
-
-void INT_Excep_SCI5_TXI5(void)
-{
- uint8_t *buf = sci_buf[0].buf;
- uint32_t cnt = sci_buf[0].cnt;
-
- if (!buf || !cnt) {
- SCI5.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
- return;
- }
- SCI5.TDR = *buf;
- if (--cnt) {
- ++buf;
- } else {
- buf = NULL;
- SCI5.SCR.BIT.TIE = 0;
- SCI5.SCR.BIT.TEIE = 1;
- }
- sci_buf[0].buf = buf;
- sci_buf[0].cnt = cnt;
-}
-
-void INT_Excep_SCI5_TEI5(void)
-{
- SCI5.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
-}
-
-void INT_Excep_SCI5_RXI5(void)
+void board_pin_init(void)
{
- uint8_t *buf = sci_buf[1].buf;
- uint32_t cnt = sci_buf[1].cnt;
-
- if (!buf || !cnt ||
- (SCI5.SSR.BYTE & (SCI_SSR_FER | SCI_SSR_ORER))) {
- sci_buf[1].buf = NULL;
- SCI5.SSR.BYTE = 0;
- SCI5.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
- return;
- }
- *buf = SCI5.RDR;
- if (--cnt) {
- ++buf;
- } else {
- buf = NULL;
- SCI5.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
- }
- sci_buf[1].buf = buf;
- sci_buf[1].cnt = cnt;
-}
-
-//--------------------------------------------------------------------+
-// Forward USB interrupt events to TinyUSB IRQ Handler
-//--------------------------------------------------------------------+
-void INT_Excep_USB0_USBI0(void)
-{
-#if CFG_TUH_ENABLED
- tuh_int_handler(0, true);
-#endif
-#if CFG_TUD_ENABLED
- tud_int_handler(0);
-#endif
-}
-
-void board_init(void)
-{
- /* setup software configurable interrupts */
+ /* Setup software configurable interrupts for USB */
ICU.SLIBR_USBI0.BYTE = IRQ_USB0_USBI0;
ICU.SLIPRCR.BYTE = 1;
-#if CFG_TUSB_OS == OPT_OS_NONE
- /* Enable CMT0 */
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
- MSTP(CMT0) = 0;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY;
- /* Setup 1ms tick timer */
- CMT0.CMCNT = 0;
- CMT0.CMCOR = CMT_PCLK / 1000 / 128;
- CMT0.CMCR.WORD = CMT_CMCR_CMIE | CMT_CMCR_CKS_DIV_128;
- IR(CMT0, CMI0) = 0;
- IPR(CMT0, CMI0) = IRQ_PRIORITY_CMT0;
- IEN(CMT0, CMI0) = 1;
- CMT.CMSTR0.BIT.STR0 = 1;
-#endif
-
/* Unlock MPC registers */
MPC.PWPR.BIT.B0WI = 0;
MPC.PWPR.BIT.PFSWE = 1;
- // SW PB1
+
+ /* Button PB1 */
PORTB.PMR.BIT.B1 = 0U;
PORTB.PDR.BIT.B1 = 0U;
- // LED PD6
+
+ /* LED PD6 (open-drain, active low) */
PORTD.PODR.BIT.B6 = 1U;
PORTD.ODR1.BIT.B4 = 1U;
PORTD.PMR.BIT.B6 = 0U;
PORTD.PDR.BIT.B6 = 1U;
+
/* UART TXD5 => PA4, RXD5 => PA3 */
PORTA.PMR.BIT.B4 = 1U;
PORTA.PCR.BIT.B4 = 1U;
MPC.PA4PFS.BYTE = 0b01010;
PORTA.PMR.BIT.B3 = 1U;
- MPC.PA5PFS.BYTE = 0b01010;
+ MPC.PA3PFS.BYTE = 0b01010;
+
/* USB VBUS -> P16 */
PORT1.PMR.BIT.B6 = 1U;
MPC.P16PFS.BYTE = MPC_PFS_ISEL | 0b10001;
+
/* Lock MPC registers */
MPC.PWPR.BIT.PFSWE = 0;
MPC.PWPR.BIT.B0WI = 1;
@@ -247,86 +144,4 @@ void board_init(void)
IEN(SCI5, TXI5) = 1;
IEN(ICU,GROUPBL0) = 1;
EN(SCI5, TEI5) = 1;
-
- /* Enable USB0 */
- unsigned short oldPRCR = SYSTEM.PRCR.WORD;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
- MSTP(USB0) = 0;
- SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | oldPRCR;
-
- /* setup USBI0 interrupt. */
- IR(USB0, USBI0) = 0;
- IPR(USB0, USBI0) = IRQ_PRIORITY_USBI0;
-}
-
-//--------------------------------------------------------------------+
-// Board porting API
-//--------------------------------------------------------------------+
-
-void board_led_write(bool state)
-{
- PORTD.PODR.BIT.B6 = state ? 0 : 1;
-}
-
-uint32_t board_button_read(void)
-{
- return PORTB.PIDR.BIT.B1 ? 0 : 1;
-}
-
-int board_uart_read(uint8_t* buf, int len)
-{
- sci_buf[1].buf = buf;
- sci_buf[1].cnt = len;
- SCI5.SCR.BYTE |= SCI_SCR_RE | SCI_SCR_RIE;
- // TODO change to non blocking, return -1 immediately if no data
- while (SCI5.SCR.BIT.RE) ;
- return len - sci_buf[1].cnt;
-}
-
-int board_uart_write(void const *buf, int len)
-{
- sci_buf[0].buf = (uint8_t*)(uintptr_t) buf;
- sci_buf[0].cnt = len;
- SCI5.SCR.BYTE |= SCI_SCR_TE | SCI_SCR_TIE;
- while (SCI5.SCR.BIT.TE) ;
- return len;
-}
-
-#if CFG_TUSB_OS == OPT_OS_NONE
-volatile uint32_t system_ticks = 0;
-void INT_Excep_CMT0_CMI0(void)
-{
- ++system_ticks;
-}
-
-uint32_t tusb_time_millis_api(void)
-{
- return system_ticks;
-}
-#else
-uint32_t SystemCoreClock = 120000000;
-#endif
-
-int close(int fd)
-{
- (void)fd;
- return -1;
-}
-int fstat(int fd, void *pstat)
-{
- (void)fd;
- (void)pstat;
- return 0;
-}
-off_t lseek(int fd, off_t pos, int whence)
-{
- (void)fd;
- (void)pos;
- (void)whence;
- return 0;
-}
-int isatty(int fd)
-{
- (void)fd;
- return 1;
}
diff --git a/hw/bsp/rx/family.c b/hw/bsp/rx/family.c
new file mode 100644
index 000000000..5741b44ef
--- /dev/null
+++ b/hw/bsp/rx/family.c
@@ -0,0 +1,234 @@
+/*
+ * The MIT License (MIT)
+ *
+ * Copyright (c) 2021, Koji Kitayama
+ *
+ * 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 "bsp/board_api.h"
+#include "board.h"
+#include "interrupt_handlers.h"
+
+#define SYSTEM_PRCR_PRC1 (1<<1)
+#define SYSTEM_PRCR_PRKEY (0xA5u<<8)
+
+#define CMT_CMCR_CKS_DIV_128 2
+#define CMT_CMCR_CMIE (1<<6)
+
+#define IRQ_PRIORITY_CMT0 5
+#define IRQ_PRIORITY_USBI0 6
+
+#define SCI_SSR_FER (1<<4)
+#define SCI_SSR_ORER (1<<5)
+#define SCI_SCR_TEIE (1u<<2)
+#define SCI_SCR_RE (1u<<4)
+#define SCI_SCR_TE (1u<<5)
+#define SCI_SCR_RIE (1u<<6)
+#define SCI_SCR_TIE (1u<<7)
+
+// Board-specific pin/peripheral init (implemented per board)
+void board_pin_init(void);
+
+//--------------------------------------------------------------------+
+// SCI UART interrupt handlers
+//--------------------------------------------------------------------+
+typedef struct {
+ uint8_t *buf;
+ uint32_t cnt;
+} sci_buf_t;
+static volatile sci_buf_t sci_buf[2];
+
+void BOARD_SCI_TXI_HANDLER(void)
+{
+ uint8_t *buf = sci_buf[0].buf;
+ uint32_t cnt = sci_buf[0].cnt;
+
+ if (!buf || !cnt) {
+ BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
+ return;
+ }
+ BOARD_UART_SCI.TDR = *buf;
+ if (--cnt) {
+ ++buf;
+ } else {
+ buf = NULL;
+ BOARD_UART_SCI.SCR.BIT.TIE = 0;
+ BOARD_UART_SCI.SCR.BIT.TEIE = 1;
+ }
+ sci_buf[0].buf = buf;
+ sci_buf[0].cnt = cnt;
+}
+
+void BOARD_SCI_TEI_HANDLER(void)
+{
+ BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_TEIE | SCI_SCR_TE | SCI_SCR_TIE);
+}
+
+void BOARD_SCI_RXI_HANDLER(void)
+{
+ uint8_t *buf = sci_buf[1].buf;
+ uint32_t cnt = sci_buf[1].cnt;
+
+ if (!buf || !cnt ||
+ (BOARD_UART_SCI.SSR.BYTE & (SCI_SSR_FER | SCI_SSR_ORER))) {
+ sci_buf[1].buf = NULL;
+ BOARD_UART_SCI.SSR.BYTE = 0;
+ BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
+ return;
+ }
+ *buf = BOARD_UART_SCI.RDR;
+ if (--cnt) {
+ ++buf;
+ } else {
+ buf = NULL;
+ BOARD_UART_SCI.SCR.BYTE &= ~(SCI_SCR_RE | SCI_SCR_RIE);
+ }
+ sci_buf[1].buf = buf;
+ sci_buf[1].cnt = cnt;
+}
+
+//--------------------------------------------------------------------+
+// Forward USB interrupt events to TinyUSB IRQ Handler
+//--------------------------------------------------------------------+
+void BOARD_USB_IRQ_HANDLER(void)
+{
+#if CFG_TUH_ENABLED
+ tuh_int_handler(0, true);
+#endif
+#if CFG_TUD_ENABLED
+ tud_int_handler(0);
+#endif
+}
+
+//--------------------------------------------------------------------+
+// Board init
+//--------------------------------------------------------------------+
+void board_init(void)
+{
+#if CFG_TUSB_OS == OPT_OS_NONE
+ /* Enable CMT0 */
+ SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
+ MSTP(CMT0) = 0;
+ SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY;
+ /* Setup 1ms tick timer */
+ CMT0.CMCNT = 0;
+ CMT0.CMCOR = BOARD_PCLK / 1000 / 128;
+ CMT0.CMCR.WORD = CMT_CMCR_CMIE | CMT_CMCR_CKS_DIV_128;
+ IR(CMT0, CMI0) = 0;
+ IPR(CMT0, CMI0) = IRQ_PRIORITY_CMT0;
+ IEN(CMT0, CMI0) = 1;
+ CMT.CMSTR0.BIT.STR0 = 1;
+#endif
+
+ /* Board-specific: pin mux, SCI, USB pin config */
+ board_pin_init();
+
+ /* Enable USB0 module */
+ unsigned short oldPRCR = SYSTEM.PRCR.WORD;
+ SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | SYSTEM_PRCR_PRC1;
+ MSTP(USB0) = 0;
+ SYSTEM.PRCR.WORD = SYSTEM_PRCR_PRKEY | oldPRCR;
+
+ /* USB IRQ */
+ IR(USB0, USBI0) = 0;
+ IPR(USB0, USBI0) = IRQ_PRIORITY_USBI0;
+}
+
+//--------------------------------------------------------------------+
+// Board porting API
+//--------------------------------------------------------------------+
+
+void board_led_write(bool state)
+{
+ BOARD_LED_WRITE(state);
+}
+
+uint32_t board_button_read(void)
+{
+ return BOARD_BUTTON_READ();
+}
+
+int board_uart_read(uint8_t* buf, int len)
+{
+ sci_buf[1].buf = buf;
+ sci_buf[1].cnt = len;
+ BOARD_UART_SCI.SCR.BYTE |= SCI_SCR_RE | SCI_SCR_RIE;
+ while (BOARD_UART_SCI.SCR.BIT.RE) ;
+ return len - sci_buf[1].cnt;
+}
+
+int board_uart_write(void const *buf, int len)
+{
+ sci_buf[0].buf = (uint8_t*)(uintptr_t) buf;
+ sci_buf[0].cnt = len;
+ BOARD_UART_SCI.SCR.BYTE |= SCI_SCR_TE | SCI_SCR_TIE;
+ while (BOARD_UART_SCI.SCR.BIT.TE) ;
+ return len;
+}
+
+//--------------------------------------------------------------------+
+// Tick timer
+//--------------------------------------------------------------------+
+#if CFG_TUSB_OS == OPT_OS_NONE
+volatile uint32_t system_ticks = 0;
+void INT_Excep_CMT0_CMI0(void)
+{
+ ++system_ticks;
+}
+
+uint32_t tusb_time_millis_api(void)
+{
+ return system_ticks;
+}
+#else
+uint32_t SystemCoreClock = BOARD_CPUCLK;
+#endif
+
+//--------------------------------------------------------------------+
+// Newlib syscall stubs
+//--------------------------------------------------------------------+
+int close(int fd)
+{
+ (void)fd;
+ return -1;
+}
+
+int fstat(int fd, void *pstat)
+{
+ (void)fd;
+ (void)pstat;
+ return 0;
+}
+
+off_t lseek(int fd, off_t pos, int whence)
+{
+ (void)fd;
+ (void)pos;
+ (void)whence;
+ return 0;
+}
+
+int isatty(int fd)
+{
+ (void)fd;
+ return 1;
+}
diff --git a/hw/bsp/rx/family.cmake b/hw/bsp/rx/family.cmake
new file mode 100644
index 000000000..9bb0dcebb
--- /dev/null
+++ b/hw/bsp/rx/family.cmake
@@ -0,0 +1,83 @@
+include_guard()
+
+set(MCU_DIR ${TOP}/hw/mcu/renesas/rx)
+
+# include board specific
+include(${CMAKE_CURRENT_LIST_DIR}/boards/${BOARD}/board.cmake)
+
+# toolchain set up
+set(CMAKE_TOOLCHAIN_FILE ${TOP}/examples/build_system/cmake/toolchain/rx_gcc.cmake)
+
+set(FAMILY_MCUS ${MCU_FAMILY} CACHE INTERNAL "")
+
+#------------------------------------
+# Startup & Linker script
+#------------------------------------
+set(LD_FILE_Clang ${LD_FILE_GNU})
+
+#------------------------------------
+# Board Target
+#------------------------------------
+function(family_add_board BOARD_TARGET)
+ add_library(${BOARD_TARGET} STATIC
+ ${MCU_DIR}/${MCU_VARIANT}/vects.c
+ )
+ target_include_directories(${BOARD_TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}
+ ${MCU_DIR}/${MCU_VARIANT}
+ )
+ target_compile_definitions(${BOARD_TARGET} PUBLIC
+ SSIZE_MAX=__INT_MAX__
+ )
+
+ update_board(${BOARD_TARGET})
+endfunction()
+
+#------------------------------------
+# Functions
+#------------------------------------
+function(family_configure_example TARGET RTOS)
+ family_configure_common(${TARGET} ${RTOS})
+ family_add_tinyusb(${TARGET} OPT_MCU_${MCU_FAMILY})
+
+ target_sources(${TARGET} PUBLIC
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/../board.c
+ ${TOP}/src/portable/renesas/rusb2/rusb2_common.c
+ ${TOP}/src/portable/renesas/rusb2/dcd_rusb2.c
+ ${TOP}/src/portable/renesas/rusb2/hcd_rusb2.c
+ ${MCU_DIR}/${MCU_VARIANT}/start.S
+ ${BOARD_SOURCES}
+ )
+ 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_compile_options(${TARGET} PUBLIC
+ -Wno-error=redundant-decls
+ )
+ target_link_options(${TARGET} PUBLIC
+ "LINKER:--script=${LD_FILE_GNU}"
+ -nostartfiles
+ --specs=nosys.specs --specs=nano.specs
+ )
+ endif ()
+
+ set_source_files_properties(${MCU_DIR}/${MCU_VARIANT}/start.S PROPERTIES
+ SKIP_LINTING ON
+ COMPILE_OPTIONS -w)
+
+ # Suppress warnings for board-specific and family source files
+ set_source_files_properties(
+ ${CMAKE_CURRENT_FUNCTION_LIST_DIR}/family.c
+ ${BOARD_SOURCES}
+ PROPERTIES COMPILE_FLAGS "-Wno-missing-prototypes")
+
+ # Flashing
+ family_add_bin_hex(${TARGET})
+ family_flash_jlink(${TARGET})
+ family_flash_rfp(${TARGET})
+endfunction()
diff --git a/hw/bsp/rx/family.mk b/hw/bsp/rx/family.mk
index 4ecf80409..8b23b6c46 100644
--- a/hw/bsp/rx/family.mk
+++ b/hw/bsp/rx/family.mk
@@ -19,7 +19,9 @@ LDFLAGS_GCC += -specs=nosys.specs -specs=nano.specs
SRC_C += \
src/portable/renesas/rusb2/dcd_rusb2.c \
src/portable/renesas/rusb2/hcd_rusb2.c \
- $(MCU_DIR)/vects.c
+ src/portable/renesas/rusb2/rusb2_common.c \
+ $(MCU_DIR)/vects.c \
+ $(FAMILY_PATH)/family.c
INC += \
$(TOP)/$(BOARD_PATH) \
diff --git a/hw/bsp/stm32h7/boards/stm32h747disco/board.h b/hw/bsp/stm32h7/boards/stm32h747disco/board.h
index 0a25c89dc..1793338f8 100644
--- a/hw/bsp/stm32h7/boards/stm32h747disco/board.h
+++ b/hw/bsp/stm32h7/boards/stm32h747disco/board.h
@@ -25,8 +25,8 @@
*/
/* metadata:
- name: STM32 H745 Discovery
- url: https://www.st.com/en/evaluation-tools/stm32h745i-disco.html
+ name: STM32 H747 Discovery
+ url: https://www.st.com/en/evaluation-tools/stm32h747i-disco.html
*/
#ifndef BOARD_H_