diff --git a/.github/ALL_BSP_COMPILE.json b/.github/ALL_BSP_COMPILE.json
index 090b7c012905..f0543b97ad7c 100644
--- a/.github/ALL_BSP_COMPILE.json
+++ b/.github/ALL_BSP_COMPILE.json
@@ -464,7 +464,8 @@
"hpmicro/hpm6800evk",
"hpmicro/hpm6e00evk",
"hpmicro/hpm6p00evk",
- "hpmicro/hpm5e00evk"
+ "hpmicro/hpm5e00evk",
+ "hpmicro/hpm5100evk"
]
},
{
diff --git a/.github/membrowse-targets.json b/.github/membrowse-targets.json
index 10c12b7aa58e..a08a70283670 100644
--- a/.github/membrowse-targets.json
+++ b/.github/membrowse-targets.json
@@ -193,6 +193,20 @@
"bsp/hpmicro/tools"
]
},
+ {
+ "target_name": "hpmicro-hpm5100evk",
+ "toolchain": "riscv32-unknown-elf-multilib",
+ "bsp_path": "bsp/hpmicro/hpm5100evk",
+ "elf": "bsp/hpmicro/hpm5100evk/rtthread.elf",
+ "ld": "bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/flash_rtt.ld",
+ "map_file": "",
+ "linker_vars": "",
+ "watch_paths": [
+ "bsp/hpmicro/hpm5100evk",
+ "bsp/hpmicro/libraries",
+ "bsp/hpmicro/tools"
+ ]
+ },
{
"target_name": "xuantie-e901plus",
"toolchain": "xuantie-elf-newlib",
diff --git a/.github/workflows/manual_trigger_scons_except_STM32_all.yml b/.github/workflows/manual_trigger_scons_except_STM32_all.yml
index 85ab16cb4999..cac5f842af58 100644
--- a/.github/workflows/manual_trigger_scons_except_STM32_all.yml
+++ b/.github/workflows/manual_trigger_scons_except_STM32_all.yml
@@ -124,8 +124,9 @@ jobs:
- {RTT_BSP_NAME: "hc32l196", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "hc32l196"}
- {RTT_BSP_NAME: "hifive1", RTT_TOOL_CHAIN: "sourcery-riscv-none-embed", RTT_BSP: "hifive1"}
#- {RTT_BSP_NAME: "hk32_hk32f030c8-mini", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "hk32/hk32f030c8-mini"} #scons dist有问题
- - {RTT_BSP_NAME: "hpmicro_hpm6750evk", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "hpmicro/hpm6750evk"}
- - {RTT_BSP_NAME: "hpmicro_hpm6750evkmini", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "hpmicro/hpm6750evkmini"}
+ - {RTT_BSP_NAME: "hpmicro_hpm5100evk", RTT_TOOL_CHAIN: "RISC-V-GCC-RV32", RTT_BSP: "hpmicro/hpm5100evk"}
+ - {RTT_BSP_NAME: "hpmicro_hpm6750evk", RTT_TOOL_CHAIN: "RISC-V-GCC-RV32", RTT_BSP: "hpmicro/hpm6750evk"}
+ - {RTT_BSP_NAME: "hpmicro_hpm6750evkmini", RTT_TOOL_CHAIN: "RISC-V-GCC-RV32", RTT_BSP: "hpmicro/hpm6750evkmini"}
- {RTT_BSP_NAME: "ht32f12366", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "ht32/ht32f12366"}
- {RTT_BSP_NAME: "ht32f52352", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "ht32/ht32f52352"}
#- {RTT_BSP_NAME: "imx_imx6ull-smart", RTT_TOOL_CHAIN: "sourcery-arm", RTT_BSP: "imx/imx6ull-smart"} # toolchain还没支持
@@ -294,7 +295,7 @@ jobs:
steps:
- uses: actions/checkout@main
- name: Set up Python
- uses: actions/setup-python@v3
+ uses: actions/setup-python@main
with:
python-version: 3.8
@@ -305,9 +306,11 @@ jobs:
wget https://raw.githubusercontent.com/RT-Thread/env/master/install_ubuntu.sh
chmod 777 install_ubuntu.sh
./install_ubuntu.sh
+ pip install -r tools/requirements.txt
git config --global http.postBuffer 524288000
echo "RTT_ROOT=${{ github.workspace }}" >> $GITHUB_ENV
echo "RTT_CC=gcc" >> $GITHUB_ENV
+ echo "export PATH=~/.env/tools/scripts:$PATH" > ~/.env/env.sh
- name: Install Arm ToolChains
if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-arm' && success() }}
@@ -344,6 +347,14 @@ jobs:
/opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin/riscv64-unknown-elf-gcc --version
echo "RTT_EXEC_PATH=/opt/riscv64-unknown-elf-toolchain-10.2.0-2020.12.8-x86_64-linux-ubuntu14/bin" >> $GITHUB_ENV
+ - name: Install riscv32-unknown-elf ToolChains
+ if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'RISC-V-GCC-RV32' && success() }}
+ run: |
+ wget -q https://github.com/hpmicro/riscv-gnu-toolchain/releases/download/2022.05.15/riscv32-unknown-elf-newlib-multilib_2022.05.15_linux.tar.gz
+ sudo tar zxf riscv32-unknown-elf-newlib-multilib_2022.05.15_linux.tar.gz -C /opt
+ /opt/riscv32-unknown-elf-newlib-multilib/bin/riscv32-unknown-elf-gcc --version
+ echo "RTT_EXEC_PATH=/opt/riscv32-unknown-elf-newlib-multilib/bin/" >> $GITHUB_ENV
+
- name: Install Riscv-none-embed ToolChains
if: ${{ matrix.legs.RTT_TOOL_CHAIN == 'sourcery-riscv-none-embed' && success() }}
run: |
@@ -373,7 +384,7 @@ jobs:
RTT_BSP: ${{ matrix.legs.RTT_BSP }}
RTT_TOOL_CHAIN: ${{ matrix.legs.RTT_TOOL_CHAIN }}
run: |
- # source ~/.env/env.sh
+ source ~/.env/env.sh
echo $RTT_BSP
ls bsp/$RTT_BSP/Kconfig && scons -C bsp/$RTT_BSP --pyconfig-silent
sed -i "s/# ${{ github.event.inputs.bsp_config }} is not set/${{ github.event.inputs.bsp_config }}=y/g" bsp/$RTT_BSP/.config
@@ -386,7 +397,7 @@ jobs:
cp bsp/$RTT_BSP/dist/project.zip ${{ github.workspace }}/$RTT_BSP/
ls bsp/$RTT_BSP/dist
pwd
- - uses: actions/upload-artifact@v3
+ - uses: actions/upload-artifact@main
if: ${{ github.event.inputs.dist_flag }}
env:
RTT_BSP: ${{ matrix.legs.RTT_BSP }}
diff --git a/bsp/.clang-format-ignore b/bsp/.clang-format-ignore
index 7286b8f79b15..befc415a75e5 100644
--- a/bsp/.clang-format-ignore
+++ b/bsp/.clang-format-ignore
@@ -1 +1,2 @@
rtconfig.h
+rtconfig_preinc.h
diff --git a/bsp/README.md b/bsp/README.md
index ac704da3f7ae..62c88b1c2e9d 100644
--- a/bsp/README.md
+++ b/bsp/README.md
@@ -763,6 +763,7 @@ This document is based on the RT-Thread mainline repository and categorizes the
| [hpm6800evk](hpmicro/hpm6800evk) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | - | ✅ | ✅ | ✅ | - | ✅ | ✅ | ✅ |
| [hpm6e00evk](hpmicro/hpm6e00evk) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | - | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| [hpm6p00evk](hpmicro/hpm6p00evk) | ✅ | ✅ | ✅ | ✅ | ✅ | - | - | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
+| [hpm5100evk](hpmicro/hpm5100evk) | ✅ | ✅ | ✅ | ✅ | - | - | - | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
#### 🟢 K230 (RT-Smart)
diff --git a/bsp/hpmicro/.clang-format-ignore b/bsp/hpmicro/.clang-format-ignore
index 8d88b7152f55..ee0d8d7fc645 100644
--- a/bsp/hpmicro/.clang-format-ignore
+++ b/bsp/hpmicro/.clang-format-ignore
@@ -1,3 +1,4 @@
# clang-format ignore file
/**/startup/
-/libraries/hpm_sdk/
+/**/board/
+/libraries/
diff --git a/bsp/hpmicro/.gitignore b/bsp/hpmicro/.gitignore
new file mode 100644
index 000000000000..f866a6c2e361
--- /dev/null
+++ b/bsp/hpmicro/.gitignore
@@ -0,0 +1,2 @@
+# HPMicro SDK is fetched as an RT-Thread package into the shared libraries dir
+/libraries/hpm_sdk-*/
diff --git a/bsp/hpmicro/.ignore_format.yml b/bsp/hpmicro/.ignore_format.yml
new file mode 100644
index 000000000000..276544a2499e
--- /dev/null
+++ b/bsp/hpmicro/.ignore_format.yml
@@ -0,0 +1,36 @@
+# Exclude the files that are kept in sync with the upstream HPMicro sources
+# (the all-in-one tree / hpm_sdk) from the changed-file checks, as already done
+# for clang-format in .clang-format-ignore.
+#
+# tools/ci/cpp_check.py runs cppcheck with a minimal configuration (only
+# '-I include -I thread/components/finsh'), so it cannot resolve the hpm_sdk
+# macros used in these files (e.g. ATTR_PLACE_AT) and it reports the linker
+# script symbol arithmetic in c_startup() as 'subtractPointers'; both are
+# false positives for code that is not ours to restructure.
+
+dir_path:
+- hpm5100evk/board
+- hpm5100evk/startup
+- hpm5300evk/board
+- hpm5300evk/startup
+- hpm5301evklite/board
+- hpm5301evklite/startup
+- hpm5e00evk/board
+- hpm5e00evk/startup
+- hpm6200evk/board
+- hpm6200evk/startup
+- hpm6300evk/board
+- hpm6300evk/startup
+- hpm6750evk/board
+- hpm6750evk/startup
+- hpm6750evk2/board
+- hpm6750evk2/startup
+- hpm6750evkmini/board
+- hpm6750evkmini/startup
+- hpm6800evk/board
+- hpm6800evk/startup
+- hpm6e00evk/board
+- hpm6e00evk/startup
+- hpm6p00evk/board
+- hpm6p00evk/startup
+- libraries
diff --git a/bsp/hpmicro/README.md b/bsp/hpmicro/README.md
index 5d21c2380e71..bc8cbf1d9643 100644
--- a/bsp/hpmicro/README.md
+++ b/bsp/hpmicro/README.md
@@ -33,6 +33,7 @@ Below is a comprehensive list of HPMicro BSPs currently supported:
| hpm6800evk | HPM6800EVK | HPM6800 | Development board for HPM6800 series |
| hpm6e00evk | HPM6E00EVK | HPM6E00 | Development board for HPM6E00 series |
| hpm6p00evk | HPM6P00EVK | HPM6P00 | Development board for HPM6P00 series |
+| hpm5100evk | HPM5100EVK | HPM5100 | Development board for HPM5100 series |
## Quick Start Guide
@@ -120,7 +121,7 @@ Additional peripherals may be supported depending on the specific board:
- HPM6E00EVK
- HPM6P00EVK
- HPM5E00EVK
-- **CAN**: Available on HPM6750 series Development Boards, HPM5300EVK, HPM6800EVK, HPM6E00EVK, HPM6P00EVK and HPM5E00EVK
+- **CAN**: Available on HPM6750 series Development Boards, HPM5300EVK, HPM6800EVK, HPM6E00EVK, HPM6P00EVK, HPM5E00EVK and HPM5100EVK
- **SDIO**: Available on HPM6300EVK, HPM6750EVKMINI, HPM6750EVK, HPM6750EVK2 and HPM6800EVK
- **Display/Audio**: Available on HPM6750EVK, HPM6800EVK, HPM6E00EVK,HPM6P00EVK
@@ -153,6 +154,7 @@ Please refer to the individual BSP directories for detailed documentation:
- `hpm6800evk/README.md`
- `hpm6e00evk/README.md`
- `hpm6p00evk/README.md`
+- `hpm5100evk/README.md`
## Troubleshooting
diff --git a/bsp/hpmicro/README_zh.md b/bsp/hpmicro/README_zh.md
index ac006d2f9284..a2115c6a5505 100644
--- a/bsp/hpmicro/README_zh.md
+++ b/bsp/hpmicro/README_zh.md
@@ -33,6 +33,7 @@
| hpm6800evk | HPM6800EVK | HPM6800 | HPM6800 系列开发板 |
| hpm6e00evk | HPM6E00EVK | HPM6E00 | HPM6E00 系列开发板 |
| hpm6p00evk | HPM6P00EVK | HPM6P00 | HPM6P00 系列开发板 |
+| hpm5100evk | HPM5100EVK | HPM5100 | HPM5100 系列开发板 |
## 快速开始指南
@@ -120,7 +121,7 @@ msh >
- HPM6E00EVK
- HPM6P00EVK
- HPM5E00EVK
-- **CAN**:HPM5300EVK、HPM6750系列开发板,HPM6300EVK,HPM6800EVK, HPM6E00EVK, HPM6P00EVK 和HPM5E00EVK
+- **CAN**:HPM5300EVK、HPM6750系列开发板,HPM6300EVK,HPM6800EVK, HPM6E00EVK, HPM6P00EVK、HPM5E00EVK 和HPM5100EVK
- **SDIO**:HPM6300EVK、HPM6750EVK 系列可用
- **显示/音频**:HPM6750EVK 系列可用
@@ -152,6 +153,7 @@ msh >
- `hpm6800evk/README.md`
- `hpm6e00evk/README.md`
- `hpm6p00evk/README.md`
+- `hpm5100evk/README.md`
## 故障排除
diff --git a/bsp/hpmicro/hpm5100evk/.config b/bsp/hpmicro/hpm5100evk/.config
new file mode 100644
index 000000000000..aadef66475b3
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/.config
@@ -0,0 +1,1573 @@
+
+#
+# RT-Thread Kernel
+#
+
+#
+# klibc options
+#
+
+#
+# rt_vsnprintf options
+#
+# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
+# end of rt_vsnprintf options
+
+#
+# rt_vsscanf options
+#
+# CONFIG_RT_KLIBC_USING_LIBC_VSSCANF is not set
+# end of rt_vsscanf options
+
+#
+# rt_memset options
+#
+# CONFIG_RT_KLIBC_USING_USER_MEMSET is not set
+# CONFIG_RT_KLIBC_USING_LIBC_MEMSET is not set
+# CONFIG_RT_KLIBC_USING_TINY_MEMSET is not set
+# end of rt_memset options
+
+#
+# rt_memcpy options
+#
+# CONFIG_RT_KLIBC_USING_USER_MEMCPY is not set
+# CONFIG_RT_KLIBC_USING_LIBC_MEMCPY is not set
+# CONFIG_RT_KLIBC_USING_TINY_MEMCPY is not set
+# end of rt_memcpy options
+
+#
+# rt_memmove options
+#
+# CONFIG_RT_KLIBC_USING_USER_MEMMOVE is not set
+# CONFIG_RT_KLIBC_USING_LIBC_MEMMOVE is not set
+# end of rt_memmove options
+
+#
+# rt_memcmp options
+#
+# CONFIG_RT_KLIBC_USING_USER_MEMCMP is not set
+# CONFIG_RT_KLIBC_USING_LIBC_MEMCMP is not set
+# end of rt_memcmp options
+
+#
+# rt_strstr options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRSTR is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRSTR is not set
+# end of rt_strstr options
+
+#
+# rt_strcasecmp options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRCASECMP is not set
+# end of rt_strcasecmp options
+
+#
+# rt_strncpy options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRNCPY is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRNCPY is not set
+# end of rt_strncpy options
+
+#
+# rt_strcpy options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRCPY is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRCPY is not set
+# end of rt_strcpy options
+
+#
+# rt_strncmp options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRNCMP is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRNCMP is not set
+# end of rt_strncmp options
+
+#
+# rt_strcmp options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRCMP is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRCMP is not set
+# end of rt_strcmp options
+
+#
+# rt_strlen options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRLEN is not set
+# CONFIG_RT_KLIBC_USING_LIBC_STRLEN is not set
+# end of rt_strlen options
+
+#
+# rt_strnlen options
+#
+# CONFIG_RT_KLIBC_USING_USER_STRNLEN is not set
+# end of rt_strnlen options
+# end of klibc options
+
+CONFIG_RT_NAME_MAX=16
+# CONFIG_RT_USING_ARCH_DATA_TYPE is not set
+# CONFIG_RT_USING_NANO is not set
+# CONFIG_RT_USING_AMP is not set
+# CONFIG_RT_USING_SMP is not set
+CONFIG_RT_CPUS_NR=1
+CONFIG_RT_ALIGN_SIZE=8
+# CONFIG_RT_THREAD_PRIORITY_8 is not set
+CONFIG_RT_THREAD_PRIORITY_32=y
+# CONFIG_RT_THREAD_PRIORITY_256 is not set
+CONFIG_RT_THREAD_PRIORITY_MAX=32
+CONFIG_RT_TICK_PER_SECOND=1000
+CONFIG_RT_USING_OVERFLOW_CHECK=y
+CONFIG_RT_USING_HOOK=y
+CONFIG_RT_HOOK_USING_FUNC_PTR=y
+# CONFIG_RT_USING_HOOKLIST is not set
+CONFIG_RT_USING_IDLE_HOOK=y
+CONFIG_RT_IDLE_HOOK_LIST_SIZE=4
+CONFIG_IDLE_THREAD_STACK_SIZE=1024
+CONFIG_RT_USING_TIMER_SOFT=y
+CONFIG_RT_TIMER_THREAD_PRIO=4
+CONFIG_RT_TIMER_THREAD_STACK_SIZE=512
+# CONFIG_RT_USING_TIMER_ALL_SOFT is not set
+# CONFIG_RT_USING_CPU_USAGE_TRACER is not set
+
+#
+# kservice options
+#
+# CONFIG_RT_USING_TINY_FFS is not set
+# end of kservice options
+
+CONFIG_RT_USING_DEBUG=y
+CONFIG_RT_DEBUGING_ASSERT=y
+CONFIG_RT_DEBUGING_COLOR=y
+CONFIG_RT_DEBUGING_CONTEXT=y
+# CONFIG_RT_DEBUGING_AUTO_INIT is not set
+# CONFIG_RT_USING_CI_ACTION is not set
+
+#
+# Inter-Thread communication
+#
+CONFIG_RT_USING_SEMAPHORE=y
+CONFIG_RT_USING_MUTEX=y
+CONFIG_RT_USING_EVENT=y
+CONFIG_RT_USING_MAILBOX=y
+CONFIG_RT_USING_MESSAGEQUEUE=y
+# CONFIG_RT_USING_MESSAGEQUEUE_PRIORITY is not set
+# CONFIG_RT_USING_SIGNALS is not set
+# end of Inter-Thread communication
+
+#
+# Memory Management
+#
+CONFIG_RT_USING_MEMPOOL=y
+CONFIG_RT_USING_SMALL_MEM=y
+# CONFIG_RT_USING_SLAB is not set
+# CONFIG_RT_USING_MEMHEAP is not set
+CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y
+# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set
+# CONFIG_RT_USING_SLAB_AS_HEAP is not set
+# CONFIG_RT_USING_USERHEAP is not set
+# CONFIG_RT_USING_NOHEAP is not set
+# CONFIG_RT_USING_MEMTRACE is not set
+# CONFIG_RT_USING_HEAP_ISR is not set
+CONFIG_RT_USING_HEAP=y
+# end of Memory Management
+
+CONFIG_RT_USING_DEVICE=y
+# CONFIG_RT_USING_DEVICE_OPS is not set
+# CONFIG_RT_USING_INTERRUPT_INFO is not set
+# CONFIG_RT_USING_THREADSAFE_PRINTF is not set
+CONFIG_RT_USING_CONSOLE=y
+CONFIG_RT_CONSOLEBUF_SIZE=128
+CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
+CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
+CONFIG_RT_VER_NUM=0x50301
+# CONFIG_RT_USING_STDC_ATOMIC is not set
+CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
+# end of RT-Thread Kernel
+
+CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_RISCV32=y
+
+#
+# RT-Thread Components
+#
+CONFIG_RT_USING_COMPONENTS_INIT=y
+CONFIG_RT_USING_USER_MAIN=y
+CONFIG_RT_MAIN_THREAD_STACK_SIZE=1024
+CONFIG_RT_MAIN_THREAD_PRIORITY=10
+# CONFIG_RT_USING_LEGACY is not set
+CONFIG_RT_USING_MSH=y
+CONFIG_RT_USING_FINSH=y
+CONFIG_FINSH_USING_MSH=y
+CONFIG_FINSH_THREAD_NAME="tshell"
+CONFIG_FINSH_THREAD_PRIORITY=20
+CONFIG_FINSH_THREAD_STACK_SIZE=4096
+CONFIG_FINSH_USING_HISTORY=y
+CONFIG_FINSH_HISTORY_LINES=5
+# CONFIG_FINSH_USING_WORD_OPERATION is not set
+# CONFIG_FINSH_USING_FUNC_EXT is not set
+CONFIG_FINSH_USING_SYMTAB=y
+CONFIG_FINSH_CMD_SIZE=80
+CONFIG_MSH_USING_BUILT_IN_COMMANDS=y
+CONFIG_FINSH_USING_DESCRIPTION=y
+# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set
+# CONFIG_FINSH_USING_AUTH is not set
+CONFIG_FINSH_ARG_MAX=10
+CONFIG_FINSH_USING_OPTION_COMPLETION=y
+
+#
+# DFS: device virtual file system
+#
+# CONFIG_RT_USING_DFS is not set
+# end of DFS: device virtual file system
+
+# CONFIG_RT_USING_FAL is not set
+
+#
+# Device Drivers
+#
+# CONFIG_RT_USING_DM is not set
+# CONFIG_RT_USING_DEV_BUS is not set
+CONFIG_RT_USING_DEVICE_IPC=y
+CONFIG_RT_UNAMED_PIPE_NUMBER=64
+# CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set
+CONFIG_RT_USING_SERIAL=y
+# CONFIG_RT_USING_SERIAL_V1 is not set
+CONFIG_RT_USING_SERIAL_V2=y
+# CONFIG_RT_SERIAL_BUF_STRATEGY_DROP is not set
+CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
+CONFIG_RT_SERIAL_USING_DMA=y
+# CONFIG_RT_USING_SERIAL_BYPASS is not set
+# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
+# CONFIG_RT_USING_CLOCK_TIME is not set
+# CONFIG_RT_USING_I2C is not set
+# CONFIG_RT_USING_PHY is not set
+# CONFIG_RT_USING_PHY_V2 is not set
+# CONFIG_RT_USING_DAC is not set
+# CONFIG_RT_USING_NULL is not set
+# CONFIG_RT_USING_ZERO is not set
+# CONFIG_RT_USING_RANDOM is not set
+# CONFIG_RT_USING_PWM is not set
+# CONFIG_RT_USING_PULSE_ENCODER is not set
+# CONFIG_RT_USING_INPUT_CAPTURE is not set
+# CONFIG_RT_USING_MTD_NOR is not set
+# CONFIG_RT_USING_MTD_NAND is not set
+# CONFIG_RT_USING_PM is not set
+# CONFIG_RT_USING_RTC is not set
+# CONFIG_RT_USING_SDIO is not set
+# CONFIG_RT_USING_SPI is not set
+# CONFIG_RT_USING_WDT is not set
+# CONFIG_RT_USING_AUDIO is not set
+# CONFIG_RT_USING_SENSOR is not set
+# CONFIG_RT_USING_TOUCH is not set
+# CONFIG_RT_USING_LCD is not set
+# CONFIG_RT_USING_HWCRYPTO is not set
+# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
+# CONFIG_RT_USING_BLK is not set
+# CONFIG_RT_USING_REGULATOR is not set
+# CONFIG_RT_USING_POWER_SUPPLY is not set
+CONFIG_RT_USING_PIN=y
+# CONFIG_RT_USING_CHERRYUSB is not set
+# end of Device Drivers
+
+#
+# C/C++ and POSIX layer
+#
+
+#
+# ISO-ANSI C layer
+#
+
+#
+# Timezone and Daylight Saving Time
+#
+# CONFIG_RT_LIBC_USING_FULL_TZ_DST is not set
+CONFIG_RT_LIBC_USING_LIGHT_TZ_DST=y
+CONFIG_RT_LIBC_TZ_DEFAULT_HOUR=8
+CONFIG_RT_LIBC_TZ_DEFAULT_MIN=0
+CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
+# end of Timezone and Daylight Saving Time
+# end of ISO-ANSI C layer
+
+#
+# POSIX (Portable Operating System Interface) layer
+#
+# CONFIG_RT_USING_POSIX_FS is not set
+# CONFIG_RT_USING_POSIX_DELAY is not set
+# CONFIG_RT_USING_POSIX_CLOCK is not set
+# CONFIG_RT_USING_POSIX_TIMER is not set
+# CONFIG_RT_USING_PTHREADS is not set
+# CONFIG_RT_USING_MODULE is not set
+
+#
+# Interprocess Communication (IPC)
+#
+# CONFIG_RT_USING_POSIX_PIPE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set
+# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set
+
+#
+# Socket is in the 'Network' category
+#
+# end of Interprocess Communication (IPC)
+# end of POSIX (Portable Operating System Interface) layer
+
+# CONFIG_RT_USING_CPLUSPLUS is not set
+# end of C/C++ and POSIX layer
+
+#
+# Network
+#
+# CONFIG_RT_USING_SAL is not set
+# CONFIG_RT_USING_NETDEV is not set
+# CONFIG_RT_USING_LWIP is not set
+# CONFIG_RT_USING_AT is not set
+# end of Network
+
+#
+# Memory protection
+#
+# CONFIG_RT_USING_MEM_PROTECTION is not set
+# CONFIG_RT_USING_HW_STACK_GUARD is not set
+# end of Memory protection
+
+#
+# Utilities
+#
+# CONFIG_RT_USING_RYM is not set
+# CONFIG_RT_USING_ULOG is not set
+# CONFIG_RT_USING_UTEST is not set
+# CONFIG_RT_USING_VAR_EXPORT is not set
+# CONFIG_RT_USING_RESOURCE_ID is not set
+# CONFIG_RT_USING_ADT is not set
+# CONFIG_RT_USING_RT_LINK is not set
+# end of Utilities
+
+#
+# Using USB legacy version
+#
+# CONFIG_RT_USING_USB_HOST is not set
+# CONFIG_RT_USING_USB_DEVICE is not set
+# end of Using USB legacy version
+
+# CONFIG_RT_USING_FDT is not set
+# CONFIG_RT_USING_RUST is not set
+# end of RT-Thread Components
+
+#
+# RT-Thread Utestcases
+#
+# CONFIG_RT_USING_UTESTCASES is not set
+# end of RT-Thread Utestcases
+
+#
+# RT-Thread online packages
+#
+
+#
+# IoT - internet of things
+#
+# CONFIG_PKG_USING_LORAWAN_DRIVER is not set
+# CONFIG_PKG_USING_PAHOMQTT is not set
+# CONFIG_PKG_USING_UMQTT is not set
+# CONFIG_PKG_USING_WEBCLIENT is not set
+# CONFIG_PKG_USING_WEBNET is not set
+# CONFIG_PKG_USING_MONGOOSE is not set
+# CONFIG_PKG_USING_MYMQTT is not set
+# CONFIG_PKG_USING_KAWAII_MQTT is not set
+# CONFIG_PKG_USING_BC28_MQTT is not set
+# CONFIG_PKG_USING_WEBTERMINAL is not set
+# CONFIG_PKG_USING_FREEMODBUS is not set
+# CONFIG_PKG_USING_NANOPB is not set
+# CONFIG_PKG_USING_WIFI_HOST_DRIVER is not set
+# CONFIG_PKG_USING_ESP_HOSTED is not set
+
+#
+# Wi-Fi
+#
+
+#
+# Marvell WiFi
+#
+# CONFIG_PKG_USING_WLANMARVELL is not set
+# end of Marvell WiFi
+
+#
+# Wiced WiFi
+#
+# CONFIG_PKG_USING_WLAN_WICED is not set
+# end of Wiced WiFi
+
+# CONFIG_PKG_USING_RW007 is not set
+
+#
+# CYW43012 WiFi
+#
+# CONFIG_PKG_USING_WLAN_CYW43012 is not set
+# end of CYW43012 WiFi
+
+#
+# BL808 WiFi
+#
+# CONFIG_PKG_USING_WLAN_BL808 is not set
+# end of BL808 WiFi
+
+#
+# CYW43439 WiFi
+#
+# CONFIG_PKG_USING_WLAN_CYW43439 is not set
+# end of CYW43439 WiFi
+# end of Wi-Fi
+
+# CONFIG_PKG_USING_COAP is not set
+# CONFIG_PKG_USING_NOPOLL is not set
+# CONFIG_PKG_USING_NETUTILS is not set
+# CONFIG_PKG_USING_CMUX is not set
+# CONFIG_PKG_USING_PPP_DEVICE is not set
+# CONFIG_PKG_USING_AT_DEVICE is not set
+# CONFIG_PKG_USING_ATSRV_SOCKET is not set
+# CONFIG_PKG_USING_WIZNET is not set
+# CONFIG_PKG_USING_ZB_COORDINATOR is not set
+
+#
+# IoT Cloud
+#
+# CONFIG_PKG_USING_ONENET is not set
+# CONFIG_PKG_USING_GAGENT_CLOUD is not set
+# CONFIG_PKG_USING_ALI_IOTKIT is not set
+# CONFIG_PKG_USING_AZURE is not set
+# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set
+# CONFIG_PKG_USING_JIOT-C-SDK is not set
+# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set
+# CONFIG_PKG_USING_JOYLINK is not set
+# CONFIG_PKG_USING_IOTSHARP_SDK is not set
+# end of IoT Cloud
+
+# CONFIG_PKG_USING_NIMBLE is not set
+# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set
+# CONFIG_PKG_USING_OTA_DOWNLOADER is not set
+# CONFIG_PKG_USING_IPMSG is not set
+# CONFIG_PKG_USING_LSSDP is not set
+# CONFIG_PKG_USING_AIRKISS_OPEN is not set
+# CONFIG_PKG_USING_LIBRWS is not set
+# CONFIG_PKG_USING_TCPSERVER is not set
+# CONFIG_PKG_USING_PROTOBUF_C is not set
+# CONFIG_PKG_USING_DLT645 is not set
+# CONFIG_PKG_USING_QXWZ is not set
+# CONFIG_PKG_USING_SMTP_CLIENT is not set
+# CONFIG_PKG_USING_ABUP_FOTA is not set
+# CONFIG_PKG_USING_LIBCURL2RTT is not set
+# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
+# CONFIG_PKG_USING_AGILE_TELNET is not set
+# CONFIG_PKG_USING_NMEALIB is not set
+# CONFIG_PKG_USING_PDULIB is not set
+# CONFIG_PKG_USING_BTSTACK is not set
+# CONFIG_PKG_USING_BT_CYW43012 is not set
+# CONFIG_PKG_USING_CYW43XX is not set
+# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set
+# CONFIG_PKG_USING_WAYZ_IOTKIT is not set
+# CONFIG_PKG_USING_MAVLINK is not set
+# CONFIG_PKG_USING_BSAL is not set
+# CONFIG_PKG_USING_AGILE_MODBUS is not set
+# CONFIG_PKG_USING_AGILE_FTP is not set
+# CONFIG_PKG_USING_EMBEDDEDPROTO is not set
+# CONFIG_PKG_USING_RT_LINK_HW is not set
+# CONFIG_PKG_USING_RYANMQTT is not set
+# CONFIG_PKG_USING_RYANW5500 is not set
+# CONFIG_PKG_USING_LORA_PKT_FWD is not set
+# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set
+# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set
+# CONFIG_PKG_USING_HM is not set
+# CONFIG_PKG_USING_SMALL_MODBUS is not set
+# CONFIG_PKG_USING_NET_SERVER is not set
+# CONFIG_PKG_USING_ZFTP is not set
+# CONFIG_PKG_USING_WOL is not set
+# CONFIG_PKG_USING_ZEPHYR_POLLING is not set
+# CONFIG_PKG_USING_MATTER_ADAPTATION_LAYER is not set
+# CONFIG_PKG_USING_LHC_MODBUS is not set
+# CONFIG_PKG_USING_QMODBUS is not set
+# CONFIG_PKG_USING_PNET is not set
+# CONFIG_PKG_USING_OPENER is not set
+# CONFIG_PKG_USING_FREEMQTT is not set
+# end of IoT - internet of things
+
+#
+# security packages
+#
+# CONFIG_PKG_USING_MBEDTLS is not set
+# CONFIG_PKG_USING_LIBSODIUM is not set
+# CONFIG_PKG_USING_LIBHYDROGEN is not set
+# CONFIG_PKG_USING_TINYCRYPT is not set
+# CONFIG_PKG_USING_TFM is not set
+# CONFIG_PKG_USING_YD_CRYPTO is not set
+# end of security packages
+
+#
+# language packages
+#
+
+#
+# JSON: JavaScript Object Notation, a lightweight data-interchange format
+#
+# CONFIG_PKG_USING_CJSON is not set
+# CONFIG_PKG_USING_LJSON is not set
+# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set
+# CONFIG_PKG_USING_RAPIDJSON is not set
+# CONFIG_PKG_USING_JSMN is not set
+# CONFIG_PKG_USING_AGILE_JSMN is not set
+# CONFIG_PKG_USING_PARSON is not set
+# CONFIG_PKG_USING_RYAN_JSON is not set
+# end of JSON: JavaScript Object Notation, a lightweight data-interchange format
+
+#
+# XML: Extensible Markup Language
+#
+# CONFIG_PKG_USING_SIMPLE_XML is not set
+# CONFIG_PKG_USING_EZXML is not set
+# end of XML: Extensible Markup Language
+
+# CONFIG_PKG_USING_LUATOS_SOC is not set
+# CONFIG_PKG_USING_LUA is not set
+# CONFIG_PKG_USING_JERRYSCRIPT is not set
+# CONFIG_PKG_USING_MICROPYTHON is not set
+# CONFIG_PKG_USING_PIKASCRIPT is not set
+# CONFIG_PKG_USING_RTT_RUST is not set
+# end of language packages
+
+#
+# multimedia packages
+#
+
+#
+# LVGL: powerful and easy-to-use embedded GUI library
+#
+# CONFIG_PKG_USING_LVGL is not set
+# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set
+# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set
+# end of LVGL: powerful and easy-to-use embedded GUI library
+
+#
+# u8g2: a monochrome graphic library
+#
+# CONFIG_PKG_USING_U8G2_OFFICIAL is not set
+# CONFIG_PKG_USING_U8G2 is not set
+# end of u8g2: a monochrome graphic library
+
+# CONFIG_PKG_USING_NES_SIMULATOR is not set
+# CONFIG_PKG_USING_OPENMV is not set
+# CONFIG_PKG_USING_MUPDF is not set
+# CONFIG_PKG_USING_STEMWIN is not set
+# CONFIG_PKG_USING_WAVPLAYER is not set
+# CONFIG_PKG_USING_TJPGD is not set
+# CONFIG_PKG_USING_PDFGEN is not set
+# CONFIG_PKG_USING_HELIX is not set
+# CONFIG_PKG_USING_AZUREGUIX is not set
+# CONFIG_PKG_USING_TOUCHGFX2RTT is not set
+# CONFIG_PKG_USING_NUEMWIN is not set
+# CONFIG_PKG_USING_MP3PLAYER is not set
+# CONFIG_PKG_USING_TINYJPEG is not set
+# CONFIG_PKG_USING_UGUI is not set
+# CONFIG_PKG_USING_MCURSES is not set
+# CONFIG_PKG_USING_TERMBOX is not set
+# CONFIG_PKG_USING_VT100 is not set
+# CONFIG_PKG_USING_QRCODE is not set
+# CONFIG_PKG_USING_GUIENGINE is not set
+# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
+# end of multimedia packages
+
+#
+# tools packages
+#
+# CONFIG_PKG_USING_VECTOR is not set
+# CONFIG_PKG_USING_SORCH is not set
+# CONFIG_PKG_USING_DICT is not set
+# CONFIG_PKG_USING_CMBACKTRACE is not set
+# CONFIG_PKG_USING_MCOREDUMP is not set
+# CONFIG_PKG_USING_EASYFLASH is not set
+# CONFIG_PKG_USING_EASYLOGGER is not set
+# CONFIG_PKG_USING_SYSTEMVIEW is not set
+# CONFIG_PKG_USING_SEGGER_RTT is not set
+# CONFIG_PKG_USING_RTT_AUTO_EXE_CMD is not set
+# CONFIG_PKG_USING_RDB is not set
+# CONFIG_PKG_USING_ULOG_EASYFLASH is not set
+# CONFIG_PKG_USING_LOGMGR is not set
+# CONFIG_PKG_USING_ADBD is not set
+# CONFIG_PKG_USING_COREMARK is not set
+# CONFIG_PKG_USING_DHRYSTONE is not set
+# CONFIG_PKG_USING_MEMORYPERF is not set
+# CONFIG_PKG_USING_NR_MICRO_SHELL is not set
+# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set
+# CONFIG_PKG_USING_LUNAR_CALENDAR is not set
+# CONFIG_PKG_USING_BS8116A is not set
+# CONFIG_PKG_USING_GPS_RMC is not set
+# CONFIG_PKG_USING_URLENCODE is not set
+# CONFIG_PKG_USING_UMCN is not set
+# CONFIG_PKG_USING_LWRB2RTT is not set
+# CONFIG_PKG_USING_CPU_USAGE is not set
+# CONFIG_PKG_USING_GBK2UTF8 is not set
+# CONFIG_PKG_USING_VCONSOLE is not set
+# CONFIG_PKG_USING_KDB is not set
+# CONFIG_PKG_USING_WAMR is not set
+# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set
+# CONFIG_PKG_USING_LWLOG is not set
+# CONFIG_PKG_USING_ANV_TRACE is not set
+# CONFIG_PKG_USING_ANV_MEMLEAK is not set
+# CONFIG_PKG_USING_ANV_TESTSUIT is not set
+# CONFIG_PKG_USING_ANV_BENCH is not set
+# CONFIG_PKG_USING_DEVMEM is not set
+# CONFIG_PKG_USING_REGEX is not set
+# CONFIG_PKG_USING_MEM_SANDBOX is not set
+# CONFIG_PKG_USING_SOLAR_TERMS is not set
+# CONFIG_PKG_USING_GAN_ZHI is not set
+# CONFIG_PKG_USING_FDT is not set
+# CONFIG_PKG_USING_CBOX is not set
+# CONFIG_PKG_USING_SNOWFLAKE is not set
+# CONFIG_PKG_USING_HASH_MATCH is not set
+# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set
+# CONFIG_PKG_USING_VOFA_PLUS is not set
+# CONFIG_PKG_USING_ZDEBUG is not set
+# CONFIG_PKG_USING_RVBACKTRACE is not set
+# CONFIG_PKG_USING_HPATCHLITE is not set
+# CONFIG_PKG_USING_THREAD_METRIC is not set
+# CONFIG_PKG_USING_UORB is not set
+# CONFIG_PKG_USING_RT_TUNNEL is not set
+# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
+# end of tools packages
+
+#
+# system packages
+#
+
+#
+# enhanced kernel services
+#
+# CONFIG_PKG_USING_RT_MEMCPY_CM is not set
+# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set
+# end of enhanced kernel services
+
+# CONFIG_PKG_USING_AUNITY is not set
+
+#
+# acceleration: Assembly language or algorithmic acceleration packages
+#
+# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set
+# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set
+# CONFIG_PKG_USING_QFPLIB_M3 is not set
+# end of acceleration: Assembly language or algorithmic acceleration packages
+
+#
+# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+#
+# CONFIG_PKG_USING_CMSIS_5 is not set
+# CONFIG_PKG_USING_CMSIS_CORE is not set
+# CONFIG_PKG_USING_CMSIS_NN is not set
+# CONFIG_PKG_USING_CMSIS_RTOS1 is not set
+# CONFIG_PKG_USING_CMSIS_RTOS2 is not set
+# end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard
+
+#
+# Micrium: Micrium software products porting for RT-Thread
+#
+# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set
+# CONFIG_PKG_USING_UCOSII_WRAPPER is not set
+# CONFIG_PKG_USING_UC_CRC is not set
+# CONFIG_PKG_USING_UC_CLK is not set
+# CONFIG_PKG_USING_UC_COMMON is not set
+# CONFIG_PKG_USING_UC_MODBUS is not set
+# end of Micrium: Micrium software products porting for RT-Thread
+
+# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set
+# CONFIG_PKG_USING_LITEOS_SDK is not set
+# CONFIG_PKG_USING_TZ_DATABASE is not set
+# CONFIG_PKG_USING_CAIRO is not set
+# CONFIG_PKG_USING_PIXMAN is not set
+# CONFIG_PKG_USING_PARTITION is not set
+# CONFIG_PKG_USING_PERF_COUNTER is not set
+# CONFIG_PKG_USING_FILEX is not set
+# CONFIG_PKG_USING_LEVELX is not set
+# CONFIG_PKG_USING_FLASHDB is not set
+# CONFIG_PKG_USING_SQLITE is not set
+# CONFIG_PKG_USING_RTI is not set
+# CONFIG_PKG_USING_DFS_YAFFS is not set
+# CONFIG_PKG_USING_LITTLEFS is not set
+# CONFIG_PKG_USING_DFS_JFFS2 is not set
+# CONFIG_PKG_USING_DFS_UFFS is not set
+# CONFIG_PKG_USING_LWEXT4 is not set
+# CONFIG_PKG_USING_THREAD_POOL is not set
+# CONFIG_PKG_USING_ROBOTS is not set
+# CONFIG_PKG_USING_EV is not set
+# CONFIG_PKG_USING_SYSWATCH is not set
+# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set
+# CONFIG_PKG_USING_PLCCORE is not set
+# CONFIG_PKG_USING_RAMDISK is not set
+# CONFIG_PKG_USING_MININI is not set
+# CONFIG_PKG_USING_QBOOT is not set
+# CONFIG_PKG_USING_PPOOL is not set
+# CONFIG_PKG_USING_OPENAMP is not set
+# CONFIG_PKG_USING_RPMSG_LITE is not set
+# CONFIG_PKG_USING_LPM is not set
+# CONFIG_PKG_USING_TLSF is not set
+# CONFIG_PKG_USING_EVENT_RECORDER is not set
+# CONFIG_PKG_USING_ARM_2D is not set
+# CONFIG_PKG_USING_MCUBOOT is not set
+# CONFIG_PKG_USING_TINYUSB is not set
+# CONFIG_PKG_USING_KMULTI_RTIMER is not set
+# CONFIG_PKG_USING_TFDB is not set
+# CONFIG_PKG_USING_QPC is not set
+# CONFIG_PKG_USING_AGILE_UPGRADE is not set
+# CONFIG_PKG_USING_FLASH_BLOB is not set
+# CONFIG_PKG_USING_MLIBC is not set
+# CONFIG_PKG_USING_TASK_MSG_BUS is not set
+# CONFIG_PKG_USING_UART_FRAMEWORK is not set
+# CONFIG_PKG_USING_SFDB is not set
+# CONFIG_PKG_USING_RTP is not set
+# CONFIG_PKG_USING_REB is not set
+# CONFIG_PKG_USING_RMP is not set
+# CONFIG_PKG_USING_R_RHEALSTONE is not set
+# CONFIG_PKG_USING_HEARTBEAT is not set
+# CONFIG_PKG_USING_MICRO_ROS_RTTHREAD_PACKAGE is not set
+# CONFIG_PKG_USING_CHERRYECAT is not set
+# CONFIG_PKG_USING_EVENT_LOOP is not set
+# CONFIG_PKG_USING_THREAD_MANAGER is not set
+# end of system packages
+
+#
+# peripheral libraries and drivers
+#
+
+#
+# HAL & SDK Drivers
+#
+
+#
+# STM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_STM32F0_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F0_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32F1_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F1_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32F2_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F2_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32F3_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F3_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32F4_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32F7_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32F7_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32G0_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32G0_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32G4_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32G4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32H5_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32H5_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32H7_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32H7_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32H7RS_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32H7RS_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32L0_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32L0_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32L4_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32L4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32L5_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32L5_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32U5_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32U5_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32WB55_SDK is not set
+# CONFIG_PKG_USING_STM32_SDIO is not set
+# CONFIG_PKG_USING_STM32WL_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32WL_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32WB_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
+# end of STM32 HAL & SDK Drivers
+
+#
+# Infineon HAL Packages
+#
+# CONFIG_PKG_USING_INFINEON_CAT1CM0P is not set
+# CONFIG_PKG_USING_INFINEON_CMSIS is not set
+# CONFIG_PKG_USING_INFINEON_CORE_LIB is not set
+# CONFIG_PKG_USING_INFINEON_MTB_HAL_CAT1 is not set
+# CONFIG_PKG_USING_INFINEON_MTB_PDL_CAT1 is not set
+# CONFIG_PKG_USING_INFINEON_RETARGET_IO is not set
+# CONFIG_PKG_USING_INFINEON_CAPSENSE is not set
+# CONFIG_PKG_USING_INFINEON_CSDIDAC is not set
+# CONFIG_PKG_USING_INFINEON_SERIAL_FLASH is not set
+# CONFIG_PKG_USING_INFINEON_USBDEV is not set
+# end of Infineon HAL Packages
+
+# CONFIG_PKG_USING_BLUETRUM_SDK is not set
+# CONFIG_PKG_USING_EMBARC_BSP is not set
+# CONFIG_PKG_USING_ESP_IDF is not set
+
+#
+# Kendryte SDK
+#
+# CONFIG_PKG_USING_K210_SDK is not set
+# CONFIG_PKG_USING_KENDRYTE_SDK is not set
+# end of Kendryte SDK
+
+# CONFIG_PKG_USING_NRF5X_SDK is not set
+# CONFIG_PKG_USING_NRFX is not set
+# CONFIG_PKG_USING_NUCLEI_SDK is not set
+# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
+# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
+
+#
+# WCH HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_CH32V20x_SDK is not set
+# CONFIG_PKG_USING_CH32V307_SDK is not set
+# end of WCH HAL & SDK Drivers
+
+#
+# AT32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_AT32A403A_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32A403A_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32A423_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32A423_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F45x_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F45x_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F402_405_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F402_405_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F403A_407_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F403A_407_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F413_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F413_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F415_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F415_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F421_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F421_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F423_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F423_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F425_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F425_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32F435_437_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32F435_437_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_AT32M412_416_HAL_DRIVER is not set
+# CONFIG_PKG_USING_AT32M412_416_CMSIS_DRIVER is not set
+# end of AT32 HAL & SDK Drivers
+
+#
+# HC32 DDL Drivers
+#
+# CONFIG_PKG_USING_HC32F3_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_HC32F3_SERIES_DRIVER is not set
+# CONFIG_PKG_USING_HC32F4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_HC32F4_SERIES_DRIVER is not set
+# end of HC32 DDL Drivers
+
+#
+# NXP HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_NXP_MCX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_NXP_MCX_SERIES_DRIVER is not set
+# CONFIG_PKG_USING_NXP_LPC_DRIVER is not set
+# CONFIG_PKG_USING_NXP_LPC55S_DRIVER is not set
+# CONFIG_PKG_USING_NXP_IMX6SX_DRIVER is not set
+# CONFIG_PKG_USING_NXP_IMX6UL_DRIVER is not set
+# CONFIG_PKG_USING_NXP_IMXRT_DRIVER is not set
+# end of NXP HAL & SDK Drivers
+
+#
+# NUVOTON Drivers
+#
+# CONFIG_PKG_USING_NUVOTON_SERIES_DRIVER is not set
+# end of NUVOTON Drivers
+
+#
+# GD32 Drivers
+#
+# CONFIG_PKG_USING_GD32_ARM_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_GD32_ARM_SERIES_DRIVER is not set
+# CONFIG_PKG_USING_GD32_RISCV_SERIES_DRIVER is not set
+# CONFIG_PKG_USING_GD32VW55X_WIFI is not set
+# end of GD32 Drivers
+
+#
+# HPMicro SDK
+#
+CONFIG_PKG_USING_HPM_SDK=y
+CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
+# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
+# end of HPMicro SDK
+
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
+#
+# FT32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_FT32F0_STD_DRIVER is not set
+# CONFIG_PKG_USING_FT32F0_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
+# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
+# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
+# end of HAL & SDK Drivers
+
+#
+# sensors drivers
+#
+# CONFIG_PKG_USING_LSM6DSM is not set
+# CONFIG_PKG_USING_LSM6DSL is not set
+# CONFIG_PKG_USING_LPS22HB is not set
+# CONFIG_PKG_USING_HTS221 is not set
+# CONFIG_PKG_USING_LSM303AGR is not set
+# CONFIG_PKG_USING_BME280 is not set
+# CONFIG_PKG_USING_BME680 is not set
+# CONFIG_PKG_USING_BMA400 is not set
+# CONFIG_PKG_USING_BMI160_BMX160 is not set
+# CONFIG_PKG_USING_SPL0601 is not set
+# CONFIG_PKG_USING_MS5805 is not set
+# CONFIG_PKG_USING_DA270 is not set
+# CONFIG_PKG_USING_DF220 is not set
+# CONFIG_PKG_USING_HSHCAL001 is not set
+# CONFIG_PKG_USING_BH1750 is not set
+# CONFIG_PKG_USING_MPU6XXX is not set
+# CONFIG_PKG_USING_AHT10 is not set
+# CONFIG_PKG_USING_AP3216C is not set
+# CONFIG_PKG_USING_TSL4531 is not set
+# CONFIG_PKG_USING_DS18B20 is not set
+# CONFIG_PKG_USING_DHT11 is not set
+# CONFIG_PKG_USING_DHTXX is not set
+# CONFIG_PKG_USING_GY271 is not set
+# CONFIG_PKG_USING_GP2Y10 is not set
+# CONFIG_PKG_USING_SGP30 is not set
+# CONFIG_PKG_USING_HDC1000 is not set
+# CONFIG_PKG_USING_BMP180 is not set
+# CONFIG_PKG_USING_BMP280 is not set
+# CONFIG_PKG_USING_SHTC1 is not set
+# CONFIG_PKG_USING_BMI088 is not set
+# CONFIG_PKG_USING_HMC5883 is not set
+# CONFIG_PKG_USING_MAX6675 is not set
+# CONFIG_PKG_USING_MAX31855 is not set
+# CONFIG_PKG_USING_TMP1075 is not set
+# CONFIG_PKG_USING_SR04 is not set
+# CONFIG_PKG_USING_CCS811 is not set
+# CONFIG_PKG_USING_PMSXX is not set
+# CONFIG_PKG_USING_RT3020 is not set
+# CONFIG_PKG_USING_MLX90632 is not set
+# CONFIG_PKG_USING_MLX90382 is not set
+# CONFIG_PKG_USING_MLX90384 is not set
+# CONFIG_PKG_USING_MLX90393 is not set
+# CONFIG_PKG_USING_MLX90392 is not set
+# CONFIG_PKG_USING_MLX90394 is not set
+# CONFIG_PKG_USING_MLX90396 is not set
+# CONFIG_PKG_USING_MLX90397 is not set
+# CONFIG_PKG_USING_MS5611 is not set
+# CONFIG_PKG_USING_MAX31865 is not set
+# CONFIG_PKG_USING_VL53L0X is not set
+# CONFIG_PKG_USING_INA260 is not set
+# CONFIG_PKG_USING_MAX30102 is not set
+# CONFIG_PKG_USING_INA226 is not set
+# CONFIG_PKG_USING_LIS2DH12 is not set
+# CONFIG_PKG_USING_HS300X is not set
+# CONFIG_PKG_USING_ZMOD4410 is not set
+# CONFIG_PKG_USING_ISL29035 is not set
+# CONFIG_PKG_USING_MMC3680KJ is not set
+# CONFIG_PKG_USING_QMP6989 is not set
+# CONFIG_PKG_USING_BALANCE is not set
+# CONFIG_PKG_USING_SHT2X is not set
+# CONFIG_PKG_USING_SHT3X is not set
+# CONFIG_PKG_USING_SHT4X is not set
+# CONFIG_PKG_USING_AD7746 is not set
+# CONFIG_PKG_USING_ADT74XX is not set
+# CONFIG_PKG_USING_MAX17048 is not set
+# CONFIG_PKG_USING_AS7341 is not set
+# CONFIG_PKG_USING_CW2015 is not set
+# CONFIG_PKG_USING_ICM20608 is not set
+# CONFIG_PKG_USING_PAJ7620 is not set
+# CONFIG_PKG_USING_STHS34PF80 is not set
+# CONFIG_PKG_USING_P3T1755 is not set
+# CONFIG_PKG_USING_QMI8658 is not set
+# CONFIG_PKG_USING_ICM20948 is not set
+# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
+# end of sensors drivers
+
+#
+# touch drivers
+#
+# CONFIG_PKG_USING_GT9147 is not set
+# CONFIG_PKG_USING_GT1151 is not set
+# CONFIG_PKG_USING_GT917S is not set
+# CONFIG_PKG_USING_GT911 is not set
+# CONFIG_PKG_USING_FT6206 is not set
+# CONFIG_PKG_USING_FT5426 is not set
+# CONFIG_PKG_USING_FT6236 is not set
+# CONFIG_PKG_USING_XPT2046_TOUCH is not set
+# CONFIG_PKG_USING_CST816X is not set
+# CONFIG_PKG_USING_CST812T is not set
+# end of touch drivers
+
+# CONFIG_PKG_USING_LCD_SPI_DRIVER is not set
+# CONFIG_PKG_USING_REALTEK_AMEBA is not set
+# CONFIG_PKG_USING_BUTTON is not set
+# CONFIG_PKG_USING_PCF8574 is not set
+# CONFIG_PKG_USING_SX12XX is not set
+# CONFIG_PKG_USING_SIGNAL_LED is not set
+# CONFIG_PKG_USING_LEDBLINK is not set
+# CONFIG_PKG_USING_LITTLED is not set
+# CONFIG_PKG_USING_LKDGUI is not set
+# CONFIG_PKG_USING_INFRARED is not set
+# CONFIG_PKG_USING_MULTI_INFRARED is not set
+# CONFIG_PKG_USING_AGILE_BUTTON is not set
+# CONFIG_PKG_USING_AGILE_LED is not set
+# CONFIG_PKG_USING_AT24CXX is not set
+# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set
+# CONFIG_PKG_USING_PCA9685 is not set
+# CONFIG_PKG_USING_ILI9341 is not set
+# CONFIG_PKG_USING_I2C_TOOLS is not set
+# CONFIG_PKG_USING_NRF24L01 is not set
+# CONFIG_PKG_USING_RPLIDAR is not set
+# CONFIG_PKG_USING_AS608 is not set
+# CONFIG_PKG_USING_RC522 is not set
+# CONFIG_PKG_USING_WS2812B is not set
+# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set
+# CONFIG_PKG_USING_MULTI_RTIMER is not set
+# CONFIG_PKG_USING_MAX7219 is not set
+# CONFIG_PKG_USING_BEEP is not set
+# CONFIG_PKG_USING_EASYBLINK is not set
+# CONFIG_PKG_USING_PMS_SERIES is not set
+# CONFIG_PKG_USING_CAN_YMODEM is not set
+# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set
+# CONFIG_PKG_USING_QLED is not set
+# CONFIG_PKG_USING_AGILE_CONSOLE is not set
+# CONFIG_PKG_USING_LD3320 is not set
+# CONFIG_PKG_USING_WK2124 is not set
+# CONFIG_PKG_USING_LY68L6400 is not set
+# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
+# CONFIG_PKG_USING_SSD1306 is not set
+# CONFIG_PKG_USING_QKEY is not set
+# CONFIG_PKG_USING_RS485 is not set
+# CONFIG_PKG_USING_RS232 is not set
+# CONFIG_PKG_USING_NES is not set
+# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set
+# CONFIG_PKG_USING_VDEVICE is not set
+# CONFIG_PKG_USING_SGM706 is not set
+# CONFIG_PKG_USING_RDA58XX is not set
+# CONFIG_PKG_USING_LIBNFC is not set
+# CONFIG_PKG_USING_MFOC is not set
+# CONFIG_PKG_USING_TMC51XX is not set
+# CONFIG_PKG_USING_TCA9534 is not set
+# CONFIG_PKG_USING_KOBUKI is not set
+# CONFIG_PKG_USING_ROSSERIAL is not set
+# CONFIG_PKG_USING_MICRO_ROS is not set
+# CONFIG_PKG_USING_MCP23008 is not set
+# CONFIG_PKG_USING_MISAKA_AT24CXX is not set
+# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set
+# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set
+# CONFIG_PKG_USING_SOFT_SERIAL is not set
+# CONFIG_PKG_USING_MB85RS16 is not set
+# CONFIG_PKG_USING_RFM300 is not set
+# CONFIG_PKG_USING_IO_INPUT_FILTER is not set
+# CONFIG_PKG_USING_LRF_NV7LIDAR is not set
+# CONFIG_PKG_USING_AIP650 is not set
+# CONFIG_PKG_USING_FINGERPRINT is not set
+# CONFIG_PKG_USING_BT_ECB02C is not set
+# CONFIG_PKG_USING_UAT is not set
+# CONFIG_PKG_USING_ST7789 is not set
+# CONFIG_PKG_USING_VS1003 is not set
+# CONFIG_PKG_USING_X9555 is not set
+# CONFIG_PKG_USING_SYSTEM_RUN_LED is not set
+# CONFIG_PKG_USING_BT_MX01 is not set
+# CONFIG_PKG_USING_RGPOWER is not set
+# CONFIG_PKG_USING_BT_MX02 is not set
+# CONFIG_PKG_USING_GC9A01 is not set
+# CONFIG_PKG_USING_IK485 is not set
+# CONFIG_PKG_USING_SERVO is not set
+# CONFIG_PKG_USING_SEAN_WS2812B is not set
+# CONFIG_PKG_USING_IC74HC165 is not set
+# CONFIG_PKG_USING_IST8310 is not set
+# CONFIG_PKG_USING_ST7789_SPI is not set
+# CONFIG_PKG_USING_CAN_UDS is not set
+# CONFIG_PKG_USING_ISOTP_C is not set
+# CONFIG_PKG_USING_IKUNLED is not set
+# CONFIG_PKG_USING_INS5T8025 is not set
+# CONFIG_PKG_USING_IRUART is not set
+# CONFIG_PKG_USING_ST7305 is not set
+# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
+# CONFIG_PKG_USING_SPI_TOOLS is not set
+# end of peripheral libraries and drivers
+
+#
+# AI packages
+#
+# CONFIG_PKG_USING_LIBANN is not set
+# CONFIG_PKG_USING_NNOM is not set
+# CONFIG_PKG_USING_ONNX_BACKEND is not set
+# CONFIG_PKG_USING_ONNX_PARSER is not set
+# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set
+# CONFIG_PKG_USING_ELAPACK is not set
+# CONFIG_PKG_USING_ULAPACK is not set
+# CONFIG_PKG_USING_QUEST is not set
+# CONFIG_PKG_USING_NAXOS is not set
+# CONFIG_PKG_USING_R_TINYMAIX is not set
+# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
+# end of AI packages
+
+#
+# Signal Processing and Control Algorithm Packages
+#
+# CONFIG_PKG_USING_APID is not set
+# CONFIG_PKG_USING_FIRE_PID_CURVE is not set
+# CONFIG_PKG_USING_QPID is not set
+# CONFIG_PKG_USING_UKAL is not set
+# CONFIG_PKG_USING_DIGITALCTRL is not set
+# CONFIG_PKG_USING_KISSFFT is not set
+# end of Signal Processing and Control Algorithm Packages
+
+#
+# miscellaneous packages
+#
+
+#
+# project laboratory
+#
+# end of project laboratory
+
+#
+# samples: kernel and components samples
+#
+# CONFIG_PKG_USING_KERNEL_SAMPLES is not set
+# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set
+# CONFIG_PKG_USING_NETWORK_SAMPLES is not set
+# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set
+# end of samples: kernel and components samples
+
+#
+# entertainment: terminal games and other interesting software packages
+#
+# CONFIG_PKG_USING_CMATRIX is not set
+# CONFIG_PKG_USING_SL is not set
+# CONFIG_PKG_USING_CAL is not set
+# CONFIG_PKG_USING_ACLOCK is not set
+# CONFIG_PKG_USING_THREES is not set
+# CONFIG_PKG_USING_2048 is not set
+# CONFIG_PKG_USING_SNAKE is not set
+# CONFIG_PKG_USING_TETRIS is not set
+# CONFIG_PKG_USING_DONUT is not set
+# CONFIG_PKG_USING_COWSAY is not set
+# CONFIG_PKG_USING_MORSE is not set
+# end of entertainment: terminal games and other interesting software packages
+
+# CONFIG_PKG_USING_LIBCSV is not set
+# CONFIG_PKG_USING_OPTPARSE is not set
+# CONFIG_PKG_USING_FASTLZ is not set
+# CONFIG_PKG_USING_MINILZO is not set
+# CONFIG_PKG_USING_QUICKLZ is not set
+# CONFIG_PKG_USING_LZMA is not set
+# CONFIG_PKG_USING_RALARAM is not set
+# CONFIG_PKG_USING_MULTIBUTTON is not set
+# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
+# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
+# CONFIG_PKG_USING_ZLIB is not set
+# CONFIG_PKG_USING_MINIZIP is not set
+# CONFIG_PKG_USING_HEATSHRINK is not set
+# CONFIG_PKG_USING_DSTR is not set
+# CONFIG_PKG_USING_TINYFRAME is not set
+# CONFIG_PKG_USING_KENDRYTE_DEMO is not set
+# CONFIG_PKG_USING_UPACKER is not set
+# CONFIG_PKG_USING_UPARAM is not set
+# CONFIG_PKG_USING_HELLO is not set
+# CONFIG_PKG_USING_VI is not set
+# CONFIG_PKG_USING_KI is not set
+# CONFIG_PKG_USING_ARMv7M_DWT is not set
+# CONFIG_PKG_USING_CRCLIB is not set
+# CONFIG_PKG_USING_LIBCRC is not set
+# CONFIG_PKG_USING_LWGPS is not set
+# CONFIG_PKG_USING_STATE_MACHINE is not set
+# CONFIG_PKG_USING_DESIGN_PATTERN is not set
+# CONFIG_PKG_USING_CONTROLLER is not set
+# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set
+# CONFIG_PKG_USING_MFBD is not set
+# CONFIG_PKG_USING_SLCAN2RTT is not set
+# CONFIG_PKG_USING_SOEM is not set
+# CONFIG_PKG_USING_QPARAM is not set
+# CONFIG_PKG_USING_CorevMCU_CLI is not set
+# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
+# end of miscellaneous packages
+
+#
+# Arduino libraries
+#
+# CONFIG_PKG_USING_RTDUINO is not set
+
+#
+# Projects and Demos
+#
+# CONFIG_PKG_USING_ARDUINO_MSGQ_C_CPP_DEMO is not set
+# CONFIG_PKG_USING_ARDUINO_SKETCH_LOADER_DEMO is not set
+# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set
+# CONFIG_PKG_USING_ARDUINO_RTDUINO_SENSORFUSION_SHIELD is not set
+# CONFIG_PKG_USING_ARDUINO_NINEINONE_SENSOR_SHIELD is not set
+# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set
+# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set
+# end of Projects and Demos
+
+#
+# Sensors
+#
+# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31855 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MSA301 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_ITG3200 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MP503 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set
+# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set
+# CONFIG_PKG_USING_ARDUINO_JARZEBSKI_MPU6050 is not set
+# end of Sensors
+
+#
+# Display
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_GFX_LIBRARY is not set
+# CONFIG_PKG_USING_ARDUINO_U8G2 is not set
+# CONFIG_PKG_USING_ARDUINO_TFT_ESPI is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ST7735 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SSD1306 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ILI9341 is not set
+# CONFIG_PKG_USING_SEEED_TM1637 is not set
+# end of Display
+
+#
+# Timing
+#
+# CONFIG_PKG_USING_ARDUINO_RTCLIB is not set
+# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set
+# CONFIG_PKG_USING_ARDUINO_TICKER is not set
+# CONFIG_PKG_USING_ARDUINO_TASKSCHEDULER is not set
+# end of Timing
+
+#
+# Data Processing
+#
+# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set
+# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set
+# CONFIG_PKG_USING_ARDUINO_TENSORFLOW_LITE_MICRO is not set
+# CONFIG_PKG_USING_ARDUINO_RUNNINGMEDIAN is not set
+# end of Data Processing
+
+#
+# Data Storage
+#
+
+#
+# Communication
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set
+# end of Communication
+
+#
+# Device Control
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TPA2016 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DRV2605 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS1841 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DS3502 is not set
+# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set
+# end of Device Control
+
+#
+# Other
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MFRC630 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI5351 is not set
+# end of Other
+
+#
+# Signal IO
+#
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set
+# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set
+# end of Signal IO
+
+#
+# Uncategorized
+#
+# end of Arduino libraries
+# end of RT-Thread online packages
+
+CONFIG_SOC_SERIES_HPM5100=y
+
+#
+# Hardware Drivers Config
+#
+CONFIG_SOC_HPM5100=y
+
+#
+# On-chip Peripheral Drivers
+#
+CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_GPIO_IRQ_PRIORITY=1
+CONFIG_BSP_USING_UART=y
+CONFIG_BSP_USING_UART0=y
+# CONFIG_BSP_UART0_RX_USING_DMA is not set
+# CONFIG_BSP_UART0_TX_USING_DMA is not set
+CONFIG_BSP_UART0_RX_BUFSIZE=128
+CONFIG_BSP_UART0_TX_BUFSIZE=0
+CONFIG_BSP_UART0_IRQ_PRIORITY=1
+# CONFIG_BSP_USING_UART1 is not set
+# CONFIG_BSP_USING_UART2 is not set
+# CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_PUART is not set
+# CONFIG_BSP_USING_I2C is not set
+# CONFIG_BSP_USING_SPI is not set
+# CONFIG_BSP_USING_I2S is not set
+# CONFIG_BSP_USING_PWM is not set
+# CONFIG_BSP_USING_GPTMRV2 is not set
+# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_OPAMP is not set
+# CONFIG_BSP_USING_MCAN is not set
+# CONFIG_BSP_USING_USB is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_EWDG is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
+# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
+# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm5100evk/.cproject b/bsp/hpmicro/hpm5100evk/.cproject
new file mode 100644
index 000000000000..b7f94f01bb2a
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/.cproject
@@ -0,0 +1,227 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/bsp/hpmicro/hpm5100evk/.project b/bsp/hpmicro/hpm5100evk/.project
new file mode 100644
index 000000000000..0d08d5512da7
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/.project
@@ -0,0 +1,27 @@
+
+
+ blink_led
+
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.genmakebuilder
+ clean,full,incremental,
+
+
+
+
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder
+ full,incremental,
+
+
+
+
+
+ org.eclipse.cdt.core.cnature
+ org.rt-thread.studio.rttnature
+ org.eclipse.cdt.managedbuilder.core.managedBuildNature
+ org.eclipse.cdt.managedbuilder.core.ScannerConfigNature
+
+
diff --git a/bsp/hpmicro/hpm5100evk/.settings/org.eclipse.core.runtime.prefs b/bsp/hpmicro/hpm5100evk/.settings/org.eclipse.core.runtime.prefs
new file mode 100644
index 000000000000..9f1acfcfba24
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/.settings/org.eclipse.core.runtime.prefs
@@ -0,0 +1,3 @@
+content-types/enabled=true
+content-types/org.eclipse.cdt.core.asmSource/file-extensions=s
+eclipse.preferences.version=1
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/.settings/projcfg.ini b/bsp/hpmicro/hpm5100evk/.settings/projcfg.ini
new file mode 100644
index 000000000000..671d4a8a91fd
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/.settings/projcfg.ini
@@ -0,0 +1,20 @@
+#RT-Thread Studio Project Configuration
+# Fri Apr 25 13:53:29 2025
+cfg_version=v3.0
+
+board_name=
+bsp_version=
+bsp_path=
+chip_name=
+project_base_rtt_bsp=true
+is_use_scons_build=true
+hardware_adapter=
+selected_rtt_version=latest
+board_base_nano_proj=false
+is_base_example_project=false
+example_name=
+project_type=rt-thread
+os_branch=master
+os_version=latest
+project_name=blink_led
+output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm5100evk
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/Kconfig b/bsp/hpmicro/hpm5100evk/Kconfig
new file mode 100644
index 000000000000..73238d3a13b2
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/Kconfig
@@ -0,0 +1,12 @@
+mainmenu "RT-Thread Configuration"
+
+BSP_DIR := .
+
+RTT_DIR := ../../..
+
+PKGS_DIR := packages
+
+source "$(RTT_DIR)/Kconfig"
+osource "$PKGS_DIR/Kconfig"
+rsource "../libraries/Kconfig"
+rsource "board/Kconfig"
diff --git a/bsp/hpmicro/hpm5100evk/README.md b/bsp/hpmicro/hpm5100evk/README.md
new file mode 100644
index 000000000000..cfed70162b03
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/README.md
@@ -0,0 +1,115 @@
+# HPMicro HPM5100EVK BSP(Board Support Package) Introduction
+
+[中文页](README_zh.md) |
+
+## Introduction
+
+This document provides brief introduction of the BSP (board support package) for the HPM5100EVK development board.
+
+The document consists of the following parts:
+
+- HPM5100EVK Board Resources Introduction
+- Quickly Getting Started
+- Refreences
+
+By reading the Quickly Get Started section developers can quickly get their hands on this BSP and run RT-Thread on the board. More advanced features will be introduced in the Advanced Features section to help developers take advantage of RT-Thread to drive more on-board resources.
+
+## Board Resources Introduction
+
+HPM5100EVK is a development board based on the RISC-V core launched by HPMicro, with rich on-board resources and on-chip resources for Connectivity, motor control,etc.
+
+
+
+## Peripheral Condition
+
+Each peripheral supporting condition for this BSP is as follows:
+
+
+| **On-board Peripherals** | **Support** | **Note** |
+| ------------------------ | ----------- | ------------------------------------- |
+| USB | √ | |
+| QSPI Flash | √ | |
+| CAN | √ | |
+| AUDIO | √ | |
+| GPIO | √ | |
+| SPI | √ | |
+| I2C | √ | |
+| PWM | √ | |
+| On-Board Debugger | √ | hslink-lite |
+
+
+## Execution Instruction
+
+### Quickly Getting Started
+
+The BSP support being build via the 'scons' command, below is the steps of compiling the example via the 'scons' command
+
+#### Parpare Environment
+- Step 1: Prepare [RT-Thread ENV](https://www.rt-thread.org/download.html#download-rt-thread-env-tool)
+- Step 2: Prepare [toolcahin](https://github.com/helloeagleyang/riscv32-gnu-toolchain-win/archive/2022.04.12.zip)
+ - Download the package and extract it into a specified directory, for example: `C:\DevTools\riscv32-gnu-toolchain`
+- Step 3: Set environment variable `RTT_RISCV_TOOLCHAIN` to `\bin`
+ - For example: `C:\DevTools\riscv32-gnu-toolchain\bin`
+- Step 4: Prepare [OpenOCD](https://github.com/hpmicro/rtt-debugger-support-package/archive/v0.4.0.zip)
+ - Download and extract it to specified directory, for example: `C:\DevTools\openocd-hpmicro`
+ - Add `OpenOCD` environment variable `OPENOCD_HPMICRO` to `\bin`
+ - For example: `C:\DevTools\openocd-hpmicro\bin`
+
+#### Configure and Build project
+
+Open RT-Thread ENV command-line, and change directory to this BSP directory, then users can:
+
+- Configure the project via `menuconfig` in `RT-Thread ENV`
+- Build the project using `scons -jN`, `N` equals to the number of CPU cores
+- Clean the project using `scons -c`
+
+#### Hardware Connection
+
+- Switch BOOT pin to 2'b00
+- Connect the `PWR_DEBUG` port to PC via TYPE-C cable
+
+
+#### Dowload / Debug
+
+- Users can download the project via the below command:
+ ```console
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5100.cfg -f board\debug_scripts\openocd\boards\hpm5100evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ ```
+
+- Users can debug the project via the below command:
+
+ - Connect debugger via `OpenOCD`:
+
+```console
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5100.cfg -f board\debug_scripts\openocd\boards\hpm5100evk.cfg
+```
+ - Start Debugger via `GDB`:
+
+```console
+%RTT_EXEC_PATH%\riscv32-unknown-elf-gdb.exe rtthread.elf
+```
+ - In the `gdb shell`, type the following commands:
+
+```console
+load
+c
+```
+
+### **Running Results**
+
+Once the project is successfully downloaded, the system runs automatically. The LED on the board will flash periodically.
+
+Connect the serial port of the board to the PC, communicate with it via a serial terminal tool(115200-8-1-N). Reset the board and the startup information of RT-Thread will be observed:
+
+```
+ \ | /
+- RT - Thread Operating System
+ / | \ 5.2.2 build Aug 16 2025 18:18:18
+ 2006 - 2025 Copyright by RT-Thread team
+```
+
+## **References**
+
+- [RT-Thread Documnent Center](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README)
+- [RT-Thread Env](https://github.com/RT-Thread/rtthread-manual-doc/blob/master/env/env.md)
+- [HPM5100EVK RT-Thread BSP Package](https://github.com/hpmicro/rtt-bsp-hpm5100evk)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/README_zh.md b/bsp/hpmicro/hpm5100evk/README_zh.md
new file mode 100644
index 000000000000..810322fbb999
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/README_zh.md
@@ -0,0 +1,112 @@
+# 先楫 HPM5100EVK BSP(板级支持包)说明
+
+[English](README.md) |
+
+## 简介
+
+本文档为 HPM5100EVK 的 BSP (板级支持包) 说明。
+
+本文包含如下部分:
+
+- HPM5100EVK 板级资源介绍
+- 快速上手指南
+- 参考链接
+
+通过阅读快速上手章节开发者可以快速地上手该 BSP,将 RT-Thread 运行在开发板上。在进阶使用指南章节,将会介绍更多高级功能,帮助开发者利用 RT-Thread 驱动更多板载资源。
+
+## 板级资源介绍
+
+HPM5100EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,带有丰富的片上资源和板上资源,可用于网络互联和电机控制等应用。
+
+开发板外观如下图所示:
+
+
+
+
+## 板载外设
+
+本 BSP 目前对外设的支持情况如下:
+
+
+| **板载外设** | **支持情况** | **备注** |
+| ------------------------ | ----------- | ------------------------------------- |
+| USB | √ | |
+| QSPI Flash | √ | |
+| GPIO | √ | |
+| SPI | √ | |
+| I2C | √ | |
+| PWM | √ | |
+| 板载调试器 | √ | hslink-lite |
+
+
+## 使用说明
+
+### 快速开始
+
+本BSP支持通过`scons`命令来完成编译,在开始之前,需要先准备好开发所需的环境。
+
+#### 准备环境
+- 步骤 1: 准备 [RT-Thread ENV](https://www.rt-thread.org/download.html#download-rt-thread-env-tool)
+- 步骤 2: 准备 [toolcahin](https://github.com/helloeagleyang/riscv32-gnu-toolchain-win/archive/2022.04.12.zip)
+ - 下载并解压到指定的目录,如: `C:\DevTools\riscv32-gnu-toolchain`
+- 步骤 3: 设置环境变量: `RTT_RISCV_TOOLCHAIN` 为 `\bin`, 如: `C:\DevTools\riscv32-gnu-toolchain\bin`
+- 步骤 4: 准备 [OpenOCD](https://github.com/hpmicro/rtt-debugger-support-package/archive/v0.4.0.zip)
+ - 下载并解压到指定目录,如: `C:\DevTools\openocd-hpmicro`
+ - 将 `OPENOCD_HPMICRO`环境变量设置为 `\bin`,如: `C:\DevTools\openocd-hpmicro\bin`
+
+#### 配置和构建工程
+
+通过 RT-Thread ENV 命令行切换目录到当前BSP所在目录后,用户可以:
+
+- 通过 `menuconfig` 命令 配置RT-Thread BSP的功能
+- 通过 `scons -jN` 命令完成构建, 其中`N` 最大值可以指定为CP拥有的物理内核数
+- 通过 `scons -c` 命令清除构建
+
+#### 硬件连接
+
+- 将BOOT 引脚拨到2'b00
+- 通过 TYPE-C线将板上的 `PWR_DEBUG` 连接到电脑
+
+#### 下载 和 调试
+
+- 通过如下命令完成下载:
+ ```console
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5100.cfg -f board\debug_scripts\openocd\boards\hpm5100evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ ```
+
+- 通过如下命令实现调试:
+
+ - 通过 `OpenOCD` 来连接开发板:
+```console
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5100.cfg -f board\debug_scripts\openocd\boards\hpm5100evk.cfg
+```
+ - 通过 `GDB` 实现调试:
+```console
+%RTT_EXEC_PATH%\riscv32-unknown-elf-gdb.exe rtthread.elf
+```
+
+ - 在`GDB Shell`中使用如下命令来加载和运行:
+
+```console
+load
+c
+```
+
+### **运行结果**
+
+一旦成功下载,程序会自动运行并打印如下结果,板载LED灯会周期性闪烁。
+
+配置好串口终端(串口配置为115200, 8-N-1),按复位键后,串口终端会打印如下日志:
+
+```
+ \ | /
+- RT - Thread Operating System
+ / | \ 5.2.2 build Aug 16 2025 18:18:18
+ 2006 - 2025 Copyright by RT-Thread team
+```
+
+## **参考链接**
+
+- [RT-Thread 文档中心](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/README)
+- [RT-Thread Env](https://github.com/RT-Thread/rtthread-manual-doc/blob/master/env/env.md)
+- [HPM5100EVK RT-Thread BSP 包](https://github.com/hpmicro/rtt-bsp-hpm5100evk)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/SConscript b/bsp/hpmicro/hpm5100evk/SConscript
new file mode 100644
index 000000000000..606b65445b0a
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/SConscript
@@ -0,0 +1,16 @@
+# for module compiling
+import os
+Import('RTT_ROOT')
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+list = os.listdir(cwd)
+
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
diff --git a/bsp/hpmicro/hpm5100evk/SConstruct b/bsp/hpmicro/hpm5100evk/SConstruct
new file mode 100644
index 000000000000..c0ae22c1c28f
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/SConstruct
@@ -0,0 +1,83 @@
+import os
+import sys
+import rtconfig
+
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+ RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
+
+sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+try:
+ from building import *
+except:
+ print('Cannot found RT-Thread root directory, please check RTT_ROOT')
+ print(RTT_ROOT)
+ exit(-1)
+
+def bsp_pkg_check():
+ if GetOption('clean'):
+ return
+
+ need_update = True
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
+ if need_update:
+ print("\n===============================================================================")
+ print("Dependency packages missing, please running 'pkgs --update'...")
+ print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...")
+ print("===============================================================================")
+ exit(1)
+
+RegisterPreBuildingAction(bsp_pkg_check)
+
+TARGET = 'rtthread.' + rtconfig.TARGET_EXT
+
+AddOption('--run',
+ dest = 'run',
+ type='string',
+ nargs=1,
+ action = 'store',
+ default = "",
+ help = 'Upload or debug application using openocd')
+
+DefaultEnvironment(tools=[])
+env = Environment(tools = ['mingw'],
+ AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS,
+ CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS,
+ CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS,
+ AR = rtconfig.AR, ARFLAGS = '-rc',
+ LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS,
+ CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES')
+
+env.PrependENVPath('PATH', rtconfig.EXEC_PATH)
+env['ASCOM'] = env['ASPPCOM']
+
+Export('RTT_ROOT')
+Export('rtconfig')
+
+SDK_ROOT = os.path.abspath('./')
+
+if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
+ libraries_path_prefix = os.path.join(SDK_ROOT, 'libraries')
+else:
+ libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
+
+
+GDB = rtconfig.GDB
+
+# prepare building environment
+objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
+
+
+
+# includes rtt drivers
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
+
+# make a building
+DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm5100evk/applications/SConscript b/bsp/hpmicro/hpm5100evk/applications/SConscript
new file mode 100644
index 000000000000..00bf6b8d8f7e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/applications/SConscript
@@ -0,0 +1,12 @@
+from building import *
+
+cwd = GetCurrentDir()
+
+src = Glob('*.c')
+
+CPPDEFINES=[]
+CPPPATH = [cwd]
+
+group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES)
+
+Return('group')
diff --git a/bsp/hpmicro/hpm5100evk/applications/main.c b/bsp/hpmicro/hpm5100evk/applications/main.c
new file mode 100644
index 000000000000..ce90f2deffb7
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/applications/main.c
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021-2024 HPMicro
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-08-13 Fan YANG first version
+ *
+ */
+
+#include
+#include
+#include "rtt_board.h"
+
+void thread_entry(void *arg);
+
+int main(void)
+{
+ app_init_led_pins();
+
+ static uint32_t led_thread_arg = 0;
+ rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
+
+ return 0;
+}
+
+void thread_entry(void *arg)
+{
+ while (1)
+ {
+ app_led_write(0, APP_LED_ON);
+ rt_thread_mdelay(500);
+ app_led_write(0, APP_LED_OFF);
+ rt_thread_mdelay(500);
+ }
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/Kconfig b/bsp/hpmicro/hpm5100evk/board/Kconfig
new file mode 100644
index 000000000000..8844405bb448
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/Kconfig
@@ -0,0 +1,740 @@
+menu "Hardware Drivers Config"
+
+config SOC_HPM5100
+ bool
+ select SOC_SERIES_HPM5100
+ select RT_USING_COMPONENTS_INIT
+ select RT_USING_USER_MAIN
+ default y
+
+menu "On-chip Peripheral Drivers"
+ config BSP_USING_GPIO
+ bool "Enable GPIO"
+ select RT_USING_PIN if BSP_USING_GPIO
+ default n
+ if BSP_USING_GPIO
+ config BSP_GPIO_IRQ_PRIORITY
+ int "GPIO Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+
+ menuconfig BSP_USING_UART
+ bool "Enable UART"
+ default y
+ select RT_USING_SERIAL
+
+ if BSP_USING_UART
+ menuconfig BSP_USING_UART0
+ bool "Enable UART0 (Debugger)"
+ default y
+ if BSP_USING_UART0
+ config BSP_UART0_RX_USING_DMA
+ bool "Enable UART0 RX DMA"
+ depends on BSP_USING_UART0 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART0_TX_USING_DMA
+ bool "Enable UART0 TX DMA"
+ depends on BSP_USING_UART0 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART0_RX_BUFSIZE
+ int "Set UART0 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_UART0_TX_BUFSIZE
+ int "Set UART0 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART0_IRQ_PRIORITY
+ int "UART0 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART0_DMA_PINGPONG_BUFSIZE
+ int "Set UART0 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
+ default 128
+ endif
+
+ menuconfig BSP_USING_UART1
+ bool "Enable UART1"
+ default n
+ if BSP_USING_UART1
+ config BSP_UART1_RX_USING_DMA
+ bool "Enable UART1 RX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_TX_USING_DMA
+ bool "Enable UART1 TX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_RX_BUFSIZE
+ int "Set UART1 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_UART1_TX_BUFSIZE
+ int "Set UART1 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART1_IRQ_PRIORITY
+ int "UART1 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
+ endif
+
+ menuconfig BSP_USING_UART2
+ bool "Enable UART2"
+ default n
+ if BSP_USING_UART2
+ config BSP_UART2_RX_USING_DMA
+ bool "Enable UART2 RX DMA"
+ depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART2_TX_USING_DMA
+ bool "Enable UART2 TX DMA"
+ depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART2_RX_BUFSIZE
+ int "Set UART2 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_UART2_TX_BUFSIZE
+ int "Set UART2 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART2_IRQ_PRIORITY
+ int "UART2 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
+ endif
+
+ menuconfig BSP_USING_UART3
+ bool "Enable UART3"
+ default n
+ if BSP_USING_UART3
+ config BSP_UART3_RX_USING_DMA
+ bool "Enable UART3 RX DMA"
+ depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART3_TX_USING_DMA
+ bool "Enable UART3 TX DMA"
+ depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART3_RX_BUFSIZE
+ int "Set UART3 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_UART3_TX_BUFSIZE
+ int "Set UART3 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART3_IRQ_PRIORITY
+ int "UART3 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
+ endif
+
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ endif
+
+ menuconfig BSP_USING_I2C
+ bool "Enable I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_I2C
+ if BSP_USING_I2C
+ config BSP_USING_I2C0
+ bool "Enable I2C0"
+ default y
+ if BSP_USING_I2C0
+ config BSP_I2C0_USING_DMA
+ bool "Enable I2C0 DMA"
+ default n
+ config BSP_I2C0_IRQ_PRIORITY
+ int "I2C0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_I2C1
+ bool "Enable I2C1"
+ default n
+ if BSP_USING_I2C1
+ config BSP_I2C1_USING_DMA
+ bool "Enable I2C1 DMA"
+ default n
+ config BSP_I2C1_IRQ_PRIORITY
+ int "I2C1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_I2C2
+ bool "Enable I2C2"
+ default n
+ if BSP_USING_I2C2
+ config BSP_I2C2_USING_DMA
+ bool "Enable I2C2 DMA"
+ default n
+ config BSP_I2C2_IRQ_PRIORITY
+ int "I2C2 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ endif
+
+ menuconfig BSP_USING_SPI
+ bool "Enable SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SPI
+ if BSP_USING_SPI
+ config BSP_USING_SPI0
+ bool "Enable SPI0"
+ default n
+ if BSP_USING_SPI0
+ config BSP_SPI0_USING_DMA
+ bool "Enable SPI0 DMA"
+ default n
+ config BSP_SPI0_IRQ_PRIORITY
+ int "SPI0 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI0 CS TYPE"
+ default BSP_SPI0_USING_SOFT_CS
+ config BSP_SPI0_USING_SOFT_CS
+ bool "Enable SPI0 software cs"
+ config BSP_SPI0_USING_HARD_CS
+ bool "Enable SPI0 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI0 IO mode"
+ default BSP_SPI0_USING_SINGLE_IO
+ config BSP_SPI0_USING_SINGLE_IO
+ bool "Enable SPI0 single IO mode"
+ config BSP_SPI0_USING_DUAL_IO
+ bool "Enable SPI0 dual IO mode"
+ config BSP_SPI0_USING_QUAD_IO
+ bool "Enable SPI0 quad IO mode"
+ endchoice
+ endif
+ config BSP_USING_SPI1
+ bool "Enable SPI1"
+ default n
+ if BSP_USING_SPI1
+ config BSP_SPI1_USING_DMA
+ bool "Enable SPI1 DMA"
+ default n
+ config BSP_SPI1_IRQ_PRIORITY
+ int "SPI1 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI1 CS TYPE"
+ default BSP_SPI1_USING_SOFT_CS
+ config BSP_SPI1_USING_SOFT_CS
+ bool "Enable SPI1 software cs"
+ config BSP_SPI1_USING_HARD_CS
+ bool "Enable SPI1 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI1 IO mode"
+ default BSP_SPI1_USING_SINGLE_IO
+ config BSP_SPI1_USING_SINGLE_IO
+ bool "Enable SPI1 single IO mode"
+ config BSP_SPI1_USING_DUAL_IO
+ bool "Enable SPI1 dual IO mode"
+ config BSP_SPI1_USING_QUAD_IO
+ bool "Enable SPI1 quad IO mode"
+ endchoice
+ endif
+ config BSP_USING_SPI2
+ bool "Enable SPI2"
+ default n
+ if BSP_USING_SPI2
+ config BSP_SPI2_USING_DMA
+ bool "Enable SPI2 DMA"
+ default n
+ config BSP_SPI2_IRQ_PRIORITY
+ int "SPI2 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI2 CS TYPE"
+ default BSP_SPI2_USING_SOFT_CS
+ config BSP_SPI2_USING_SOFT_CS
+ bool "Enable SPI2 software cs"
+ config BSP_SPI2_USING_HARD_CS
+ bool "Enable SPI2 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI2 IO mode"
+ default BSP_SPI2_USING_SINGLE_IO
+ config BSP_SPI2_USING_SINGLE_IO
+ bool "Enable SPI2 single IO mode"
+ config BSP_SPI2_USING_DUAL_IO
+ bool "Enable SPI2 dual IO mode"
+ config BSP_SPI2_USING_QUAD_IO
+ bool "Enable SPI2 quad IO mode"
+ endchoice
+ endif
+ config BSP_USING_SPI3
+ bool "Enable SPI3"
+ default y
+ if BSP_USING_SPI3
+ config BSP_SPI3_USING_DMA
+ bool "Enable SPI3 DMA"
+ default n
+ config BSP_SPI3_IRQ_PRIORITY
+ int "SPI3 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI3 CS TYPE"
+ default BSP_SPI3_USING_SOFT_CS
+ config BSP_SPI3_USING_SOFT_CS
+ bool "Enable SPI3 software cs"
+ config BSP_SPI3_USING_HARD_CS
+ bool "Enable SPI3 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI3 IO mode"
+ default BSP_SPI3_USING_SINGLE_IO
+ config BSP_SPI3_USING_SINGLE_IO
+ bool "Enable SPI3 single IO mode"
+ config BSP_SPI3_USING_DUAL_IO
+ bool "Enable SPI3 dual IO mode"
+ config BSP_SPI3_USING_QUAD_IO
+ bool "Enable SPI3 quad IO mode"
+ endchoice
+ endif
+ endif
+
+ menuconfig BSP_USING_I2S
+ bool "Enable I2S"
+ default n
+ select RT_USING_I2S if BSP_USING_I2S
+ if BSP_USING_I2S
+ config BSP_USING_I2S0
+ bool "Enable I2S0"
+ default n
+ if BSP_USING_I2S0
+ config BSP_I2S0_USING_DMA
+ bool "Enable I2S0 DMA"
+ default n
+ config BSP_I2S0_IRQ_PRIORITY
+ int "I2S0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_I2S1
+ bool "Enable I2S1"
+ default n
+ if BSP_USING_I2S1
+ config BSP_I2S1_USING_DMA
+ bool "Enable I2S1 DMA"
+ default n
+ config BSP_I2S1_IRQ_PRIORITY
+ int "I2S1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ endif
+
+ menuconfig BSP_USING_PWM
+ bool "Enable PWM"
+ default n
+ select RT_USING_PWM
+
+ menuconfig BSP_USING_GPTMRV2
+ bool "Enable GPTMR"
+ default n
+ select RT_USING_CLOCK_TIME if BSP_USING_GPTMRV2
+ if BSP_USING_GPTMRV2
+ config BSP_USING_GPTMR0
+ bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
+ default n
+ if BSP_USING_GPTMR0
+ config BSP_GPTMR0_IRQ_PRIORITY
+ int "GPTMR0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_GPTMR1
+ bool "Enable GPTMR1"
+ default n
+ if BSP_USING_GPTMR1
+ config BSP_GPTMR1_IRQ_PRIORITY
+ int "GPTMR1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ endif
+
+ menuconfig BSP_USING_ADC
+ bool "Enable ADC"
+ default n
+ select RT_USING_ADC
+ if BSP_USING_ADC
+ menuconfig BSP_USING_ADC16
+ bool "Enable ADC16"
+ default y
+ if BSP_USING_ADC16
+ config BSP_USING_ADC0
+ bool "Enable ADC0"
+ default y
+ config BSP_USING_ADC1
+ bool "Enable ADC1"
+ default n
+ config BSP_USING_ADC2
+ bool "Enable ADC2"
+ default n
+ config BSP_USING_ADC3
+ bool "Enable ADC3"
+ default n
+ endif
+ endif
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+ if BSP_USING_ACMP
+ config BSP_USING_ACMP0
+ bool "Enable ACMP0"
+ default n
+ config BSP_USING_ACMP1
+ bool "Enable ACMP1"
+ default n
+ endif
+
+ menuconfig BSP_USING_OPAMP
+ bool "Enable OPAMP (Operational Amplifier)"
+ default n
+ if BSP_USING_OPAMP
+ config BSP_USING_OPAMP0
+ bool "Enable OPAMP0"
+ default n
+ config BSP_USING_OPAMP1
+ bool "Enable OPAMP1"
+ default n
+ config BSP_USING_OPAMP2
+ bool "Enable OPAMP2"
+ default n
+ config BSP_USING_OPAMP3
+ bool "Enable OPAMP3"
+ default n
+ endif
+
+ menuconfig BSP_USING_MCAN
+ bool "Enable MCAN"
+ default n
+ select RT_USING_CAN if BSP_USING_MCAN
+ if BSP_USING_MCAN
+ config BSP_USING_MCAN0
+ bool "Enable MCAN0"
+ default n
+ if BSP_USING_MCAN0
+ config BSP_MCAN0_IRQ_PRIORITY
+ int "MCAN0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ endif
+
+ menuconfig BSP_USING_USB
+ bool "Enable USB"
+ default n
+ if BSP_USING_USB
+ config BSP_USING_USB_DEVICE
+ bool "Enable USB Device"
+ select RT_USING_CACHE
+ default n
+ config BSP_USING_USB_HOST
+ bool "Enable USB HOST"
+ select RT_USING_CACHE
+ default n
+ endif
+
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+ if BSP_USING_WDG
+ config BSP_USING_WDG0
+ bool "Enable WDG0"
+ default y
+ config BSP_USING_WDG1
+ bool "Enable WDG1"
+ default n
+ endif
+
+ menuconfig BSP_USING_EWDG
+ bool "Enable EWDG"
+ default n
+ select RT_USING_WDT if BSP_USING_EWDG
+ if BSP_USING_EWDG
+ config BSP_USING_EWDG0
+ bool "Enable EWDG0"
+ default n
+ config BSP_USING_EWDG1
+ bool "Enable EWDG1"
+ default n
+ endif
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+endmenu
diff --git a/bsp/hpmicro/hpm5100evk/board/SConscript b/bsp/hpmicro/hpm5100evk/board/SConscript
new file mode 100644
index 000000000000..aeb0cee8b26d
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/SConscript
@@ -0,0 +1,19 @@
+from building import *
+
+cwd = GetCurrentDir()
+
+# add the general drivers
+src = Split("""
+ board.c
+ rtt_board.c
+ pinmux.c
+ fal_flash_port.c
+ fal_spi_flash_sfud_port.c
+""")
+
+CPPPATH = [cwd]
+CPPDEFINES=['D25', 'HPM5151']
+
+group = DefineGroup('Board', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
+
+Return('group')
diff --git a/bsp/hpmicro/hpm5100evk/board/board.c b/bsp/hpmicro/hpm5100evk/board/board.c
new file mode 100644
index 000000000000..d9515366de46
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/board.c
@@ -0,0 +1,666 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "board.h"
+#include "hpm_uart_drv.h"
+#include "hpm_gptmrv2_drv.h"
+#include "hpm_gpio_drv.h"
+#include "hpm_usb_drv.h"
+#include "hpm_clock_drv.h"
+#include "hpm_pllctlv2_drv.h"
+#include "hpm_i2c_drv.h"
+#include "hpm_pcfg_drv.h"
+#include
+#include
+
+
+/**
+ * @brief FLASH configuration option definitions:
+ * option[0]:
+ * [31:16] 0xfcf9 - FLASH configuration option tag
+ * [15:4] 0 - Reserved
+ * [3:0] option words (exclude option[0])
+ * option[1]:
+ * [31:28] Flash probe type
+ * 0 - SFDP SDR / 1 - SFDP DDR
+ * 2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)
+ * 4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V
+ * 6 - OctaBus DDR (SPI -> OPI DDR)
+ * 8 - Xccela DDR (SPI -> OPI DDR)
+ * 10 - EcoXiP DDR (SPI -> OPI DDR)
+ * [27:24] Command Pads after Power-on Reset
+ * 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+ * [23:20] Command Pads after Configuring FLASH
+ * 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+ * [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
+ * 0 - Not needed
+ * 1 - QE bit is at bit 6 in Status Register 1
+ * 2 - QE bit is at bit1 in Status Register 2
+ * 3 - QE bit is at bit7 in Status Register 2
+ * 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
+ * [15:8] Dummy cycles
+ * 0 - Auto-probed / detected / default value
+ * Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet
+ * [7:4] Misc.
+ * 0 - Not used
+ * 1 - SPI mode
+ * 2 - Internal loopback
+ * 3 - External DQS
+ * [3:0] Frequency option
+ * 1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 114MHz / 7 - 133MHz / 8 - 166MHz
+ *
+ * option[2] (Effective only if the bit[3:0] in option[0] > 1)
+ * [31:20] Reserved
+ * [19:16] IO voltage
+ * 0 - 3V / 1 - 1.8V
+ * [15:12] Pin group
+ * 0 - 1st group / 1 - 2nd group
+ * [11:8] Connection selection
+ * 0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)
+ * [7:0] Drive Strength
+ * 0 - Default value
+ * option[3] (Effective only if the bit[3:0] in option[0] > 2, required only for the QSPI NOR FLASH that not supports
+ * JESD216)
+ * [31:16] reserved
+ * [15:12] Sector Erase Command Option, not required here
+ * [11:8] Sector Size Option, not required here
+ * [7:0] Flash Size Option
+ * 0 - 4MB / 1 - 8MB / 2 - 16MB
+ */
+#if defined(FLASH_XIP) && FLASH_XIP
+__attribute__ ((section(".nor_cfg_option"), used)) const uint32_t option[4] = {0xfcf90002, 0x00000005, 0x1000, 0x0};
+#endif
+
+#if defined(FLASH_UF2) && FLASH_UF2
+ATTR_PLACE_AT(".uf2_signature") __attribute__((used)) const uint32_t uf2_signature = BOARD_UF2_SIGNATURE;
+#endif
+
+void board_init_console(void)
+{
+#if !defined(CONFIG_NDEBUG_CONSOLE) || !CONFIG_NDEBUG_CONSOLE
+#if BOARD_CONSOLE_TYPE == CONSOLE_TYPE_UART
+ console_config_t cfg;
+
+ /* uart needs to configure pin function before enabling clock, otherwise the level change of
+ * uart rx pin when configuring pin function will cause a wrong data to be received.
+ * And a uart rx dma request will be generated by default uart fifo dma trigger level.
+ */
+ init_uart_pins((UART_Type *) BOARD_CONSOLE_UART_BASE);
+
+ clock_add_to_group(BOARD_CONSOLE_UART_CLK_NAME, 0);
+
+ cfg.type = BOARD_CONSOLE_TYPE;
+ cfg.base = (uint32_t)BOARD_CONSOLE_UART_BASE;
+ cfg.src_freq_in_hz = clock_get_frequency(BOARD_CONSOLE_UART_CLK_NAME);
+ cfg.baudrate = BOARD_CONSOLE_UART_BAUDRATE;
+
+ if (status_success != console_init(&cfg)) {
+ /* failed to initialize debug console */
+ while (1) {
+ }
+ }
+#else
+ while (1)
+ ;
+#endif
+#endif
+}
+
+void board_print_banner(void)
+{
+ const uint8_t banner[] = "\n"
+"----------------------------------------------------------------------\n"
+"$$\\ $$\\ $$$$$$$\\ $$\\ $$\\ $$\\\n"
+"$$ | $$ |$$ __$$\\ $$$\\ $$$ |\\__|\n"
+"$$ | $$ |$$ | $$ |$$$$\\ $$$$ |$$\\ $$$$$$$\\ $$$$$$\\ $$$$$$\\\n"
+"$$$$$$$$ |$$$$$$$ |$$\\$$\\$$ $$ |$$ |$$ _____|$$ __$$\\ $$ __$$\\\n"
+"$$ __$$ |$$ ____/ $$ \\$$$ $$ |$$ |$$ / $$ | \\__|$$ / $$ |\n"
+"$$ | $$ |$$ | $$ |\\$ /$$ |$$ |$$ | $$ | $$ | $$ |\n"
+"$$ | $$ |$$ | $$ | \\_/ $$ |$$ |\\$$$$$$\\ $$ | \\$$$$$$ |\n"
+"\\__| \\__|\\__| \\__| \\__|\\__| \\_______|\\__| \\______/\n"
+"----------------------------------------------------------------------\n";
+#ifdef SDK_VERSION_STRING
+ printf("hpm_sdk: %s\n", SDK_VERSION_STRING);
+#endif
+ printf("%s", banner);
+}
+
+void board_print_clock_freq(void)
+{
+ printf("==============================\n");
+ printf(" %s clock summary\n", BOARD_NAME);
+ printf("==============================\n");
+ printf("cpu0:\t\t %luHz\n", clock_get_frequency(clock_cpu0));
+ printf("ahb:\t\t %luHz\n", clock_get_frequency(clock_ahb));
+ printf("mchtmr0:\t %luHz\n", clock_get_frequency(clock_mchtmr0));
+ printf("xpi0:\t\t %luHz\n", clock_get_frequency(clock_xpi0));
+ printf("==============================\n");
+}
+
+void board_init(void)
+{
+ init_py_pins_as_pgpio();
+ board_init_usb_dp_dm_pins();
+
+ board_init_clock();
+ board_init_console();
+ board_init_pmp();
+#if BOARD_SHOW_CLOCK
+ board_print_clock_freq();
+#endif
+#if BOARD_SHOW_BANNER
+ board_print_banner();
+#endif
+}
+
+void board_init_usb_dp_dm_pins(void)
+{
+ /* Disconnect usb dp/dm pins pull down 45ohm resistance */
+
+ while (sysctl_resource_any_is_busy(HPM_SYSCTL)) {
+ ;
+ }
+ if (pllctlv2_xtal_is_stable(HPM_PLLCTLV2) && pllctlv2_xtal_is_enabled(HPM_PLLCTLV2)) {
+ if (clock_check_in_group(clock_usb0, 0)) {
+ usb_phy_disable_dp_dm_pulldown(HPM_USB0);
+ } else {
+ clock_add_to_group(clock_usb0, 0);
+ usb_phy_disable_dp_dm_pulldown(HPM_USB0);
+ clock_remove_from_group(clock_usb0, 0);
+ }
+ } else {
+ uint8_t tmp;
+ tmp = sysctl_resource_target_get_mode(HPM_SYSCTL, sysctl_resource_xtal);
+ sysctl_resource_target_set_mode(HPM_SYSCTL, sysctl_resource_xtal, 0x03); /* NOLINT */
+ clock_add_to_group(clock_usb0, 0);
+ usb_phy_disable_dp_dm_pulldown(HPM_USB0);
+ clock_remove_from_group(clock_usb0, 0);
+ while (sysctl_resource_target_is_busy(HPM_SYSCTL, sysctl_resource_usb0)) {
+ ;
+ }
+ sysctl_resource_target_set_mode(HPM_SYSCTL, sysctl_resource_xtal, tmp);
+ }
+}
+
+void board_init_clock(void)
+{
+ uint32_t cpu0_freq = clock_get_frequency(clock_cpu0);
+
+ if (cpu0_freq == PLLCTL_SOC_PLL_REFCLK_FREQ) {
+ /* Configure the External OSC ramp-up time: ~9ms */
+ pllctlv2_xtal_set_rampup_time(HPM_PLLCTLV2, 32UL * 1000UL * 9U);
+
+ /* Select clock setting preset1 */
+ sysctl_clock_set_preset(HPM_SYSCTL, 2);
+ }
+
+ /* group0[0] */
+ clock_add_to_group(clock_cpu0, 0);
+ clock_add_to_group(clock_ahb, 0);
+ clock_add_to_group(clock_lmm0, 0);
+ clock_add_to_group(clock_mchtmr0, 0);
+ clock_add_to_group(clock_rom, 0);
+ clock_add_to_group(clock_mot0, 0);
+ clock_add_to_group(clock_gpio, 0);
+ clock_add_to_group(clock_hdma0, 0);
+ clock_add_to_group(clock_hdma1, 0);
+ clock_add_to_group(clock_xpi0, 0);
+ clock_add_to_group(clock_ptpc, 0);
+
+ /* Connect Group0 to CPU0 */
+ clock_connect_group_to_cpu(0, 0);
+
+ /* Bump up LDO voltage to 1175mv */
+ pcfg_ldo1p1_set_voltage(HPM_PCFG, 1175);
+
+ /* Configure CPU to 360MHz, AHB to 180MHz. */
+ clock_set_source_divider(clock_cpu0, clk_src_pll0_clk0, 2);;
+
+ /* Configure mchtmr to 24MHz */
+ clock_set_source_divider(clock_mchtmr0, clk_src_osc24m, 1);
+
+ clock_update_core_clock();
+}
+
+/*==============================================================================
+ * RT-Thread peripheral pin dispatch wrappers
+ * These dispatch to the pinmux-generated init_xxx_pins() functions
+ *============================================================================*/
+
+void init_py_pins_as_pgpio(void)
+{
+ /* Set PY00-PY07 default function to PGPIO */
+ HPM_PIOC->PAD[IOC_PAD_PY00].FUNC_CTL = PIOC_PY00_FUNC_CTL_PGPIO_Y_00;
+ HPM_PIOC->PAD[IOC_PAD_PY01].FUNC_CTL = PIOC_PY01_FUNC_CTL_PGPIO_Y_01;
+ HPM_PIOC->PAD[IOC_PAD_PY02].FUNC_CTL = PIOC_PY02_FUNC_CTL_PGPIO_Y_02;
+ HPM_PIOC->PAD[IOC_PAD_PY03].FUNC_CTL = PIOC_PY03_FUNC_CTL_PGPIO_Y_03;
+ HPM_PIOC->PAD[IOC_PAD_PY04].FUNC_CTL = PIOC_PY04_FUNC_CTL_PGPIO_Y_04;
+ HPM_PIOC->PAD[IOC_PAD_PY05].FUNC_CTL = PIOC_PY05_FUNC_CTL_PGPIO_Y_05;
+ HPM_PIOC->PAD[IOC_PAD_PY06].FUNC_CTL = PIOC_PY06_FUNC_CTL_PGPIO_Y_06;
+ HPM_PIOC->PAD[IOC_PAD_PY07].FUNC_CTL = PIOC_PY07_FUNC_CTL_PGPIO_Y_07;
+}
+
+void init_uart_pins(UART_Type *ptr)
+{
+ if (ptr == HPM_UART0) {
+ init_uart0_pins();
+ } else if (ptr == HPM_UART2) {
+ init_uart2_pins();
+ } else if (ptr == HPM_UART3) {
+ init_uart3_pins();
+ }
+}
+
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
+{
+ if (ptr == HPM_I2C0) {
+ init_i2c0_pins();
+ return status_success;
+ } else if (ptr == HPM_I2C1) {
+ init_i2c1_pins();
+ return status_success;
+ } else if (ptr == HPM_I2C2) {
+ init_i2c2_pins();
+ return status_success;
+ }
+ return status_invalid_argument;
+}
+
+void init_can_pins(MCAN_Type *ptr)
+{
+ if (ptr == HPM_MCAN0) {
+ init_mcan0_pins();
+ }
+}
+
+void init_usb_pins(USB_Type *ptr)
+{
+ if (ptr == HPM_USB0) {
+ init_usb0_pins();
+ }
+}
+
+void init_spi_pins(SPI_Type *ptr)
+{
+ if (ptr == HPM_SPI3) {
+ init_spi3_pins();
+ } else if (ptr == HPM_SPI0) {
+ init_spi_nor_flash_pins();
+ }
+}
+
+void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr)
+{
+ if (ptr == HPM_SPI3) {
+ init_spi3_pins_with_gpio_as_cs();
+ } else if (ptr == HPM_SPI0) {
+ init_spi_nor_flash_pins_with_gpio_as_cs();
+ }
+}
+
+void init_gptmr_channel_pin(GPTMRV2_Type *ptr, uint32_t channel, bool as_comp)
+{
+ if (ptr == HPM_GPTMR0) {
+ if (as_comp) {
+ if (channel == 0) {
+ init_gptmr0_channel0_pin_as_output();
+ } else if (channel == 1) {
+ init_gptmr0_channel1_pin_as_output();
+ } else if (channel == 3) {
+ init_gptmr0_channel3_pin_as_output();
+ }
+ } else {
+ init_gptmr0_channel0_pin_as_capture();
+ }
+ }
+}
+
+void init_pwm_pins(PWM_Type *ptr)
+{
+ if (ptr == HPM_PWM0) {
+ init_pwm0_pins();
+ } else if (ptr == HPM_PWM1) {
+ init_pwm1_pins();
+ } else if (ptr == HPM_PWM2) {
+ init_pwm2_pins();
+ } else if (ptr == HPM_PWM3) {
+ init_pwm3_pins();
+ }
+}
+
+void board_delay_us(uint32_t us)
+{
+ rt_hw_us_delay(us);
+}
+
+void board_delay_ms(uint32_t ms)
+{
+ while (ms--)
+ {
+ rt_hw_us_delay(1000);
+ }
+}
+
+#if !defined(NO_BOARD_TIMER_SUPPORT) || !NO_BOARD_TIMER_SUPPORT
+static board_timer_cb timer_cb;
+SDK_DECLARE_EXT_ISR_M(BOARD_CALLBACK_TIMER_IRQ, board_timer_isr)
+void board_timer_isr(void)
+{
+ if (gptmr_check_status(BOARD_CALLBACK_TIMER, GPTMR_CH_RLD_STAT_MASK(BOARD_CALLBACK_TIMER_CH))) {
+ gptmr_clear_status(BOARD_CALLBACK_TIMER, GPTMR_CH_RLD_STAT_MASK(BOARD_CALLBACK_TIMER_CH));
+ timer_cb();
+ }
+}
+
+void board_timer_create(uint32_t ms, board_timer_cb cb)
+{
+ uint32_t gptmr_freq;
+ gptmr_channel_config_t config;
+
+ timer_cb = cb;
+ gptmr_channel_get_default_config(BOARD_CALLBACK_TIMER, &config);
+
+ clock_add_to_group(BOARD_CALLBACK_TIMER_CLK_NAME, 0);
+ gptmr_freq = clock_get_frequency(BOARD_CALLBACK_TIMER_CLK_NAME);
+
+ config.reload = gptmr_freq / 1000 * ms;
+ gptmr_channel_config(BOARD_CALLBACK_TIMER, BOARD_CALLBACK_TIMER_CH, &config, false);
+ gptmr_enable_irq(BOARD_CALLBACK_TIMER, GPTMR_CH_RLD_IRQ_MASK(BOARD_CALLBACK_TIMER_CH));
+ intc_m_enable_irq_with_priority(BOARD_CALLBACK_TIMER_IRQ, 1);
+
+ gptmr_start_counter(BOARD_CALLBACK_TIMER, BOARD_CALLBACK_TIMER_CH);
+}
+#endif
+
+void board_init_gpio_pins(void)
+{
+ init_gpio_pins();
+ gpio_set_pin_input(BOARD_APP_GPIO_CTRL, BOARD_APP_GPIO_INDEX, BOARD_APP_GPIO_PIN);
+}
+
+void board_init_led_pins(void)
+{
+ init_led_pins_as_gpio();
+ gpio_set_pin_output_with_initial(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, board_get_led_gpio_off_level());
+}
+
+void board_init_usb(USB_Type *ptr)
+{
+ if (ptr == HPM_USB0) {
+ init_usb_pins(ptr);
+ clock_add_to_group(clock_usb0, 0);
+
+ usb_hcd_set_power_ctrl_polarity(ptr, true);
+ /* Wait USB_PWR pin control vbus power stable. Time depend on decoupling capacitor, you can decrease or increase this time */
+ board_delay_ms(100);
+
+ /* As QFN48 and LQFP64 has no vbus pin, so should be call usb_phy_using_internal_vbus() API to use internal vbus. */
+ usb_phy_using_internal_vbus(ptr);
+ }
+}
+
+void board_led_write(uint8_t state)
+{
+ gpio_write_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN, state);
+}
+
+void board_led_toggle(void)
+{
+ gpio_toggle_pin(BOARD_LED_GPIO_CTRL, BOARD_LED_GPIO_INDEX, BOARD_LED_GPIO_PIN);
+}
+
+void board_init_uart(UART_Type *ptr)
+{
+ /* configure uart's pin before opening uart's clock */
+ init_uart_pins(ptr);
+ board_init_uart_clock(ptr);
+}
+
+void board_ungate_mchtmr_at_lp_mode(void)
+{
+ /* Keep cpu clock on wfi, so that mchtmr irq can still work after wfi */
+ sysctl_set_cpu_lp_mode(HPM_SYSCTL, BOARD_RUNNING_CORE, cpu_lp_mode_ungate_cpu_clock);
+}
+
+uint32_t board_init_spi_clock(SPI_Type *ptr)
+{
+ if (ptr == HPM_SPI3) {
+ clock_add_to_group(clock_spi3, 0);
+ return clock_get_frequency(clock_spi3);
+ } else if (ptr == HPM_SPI0) {
+ clock_add_to_group(clock_spi0, 0);
+ return clock_get_frequency(clock_spi0);
+ }
+ return 0;
+}
+
+void board_init_spi_pins(SPI_Type *ptr)
+{
+ init_spi_pins(ptr);
+}
+
+void board_write_spi_cs(uint32_t pin, uint8_t state)
+{
+ gpio_write_pin(BOARD_SPI_CS_GPIO_CTRL, GPIO_GET_PORT_INDEX(pin), GPIO_GET_PIN_INDEX(pin), state);
+}
+
+void board_init_spi_pins_with_gpio_as_cs(SPI_Type *ptr)
+{
+ init_spi_pins_with_gpio_as_cs(ptr);
+ gpio_set_pin_output_with_initial(BOARD_SPI_CS_GPIO_CTRL, GPIO_GET_PORT_INDEX(BOARD_SPI_CS_PIN),
+ GPIO_GET_PIN_INDEX(BOARD_SPI_CS_PIN), !BOARD_SPI_CS_ACTIVE_LEVEL);
+}
+
+uint32_t board_init_adc_clock(void *ptr, bool clk_src_bus)
+{
+ uint32_t freq = 0;
+
+ if (ptr == (void *)HPM_ADC0) {
+ if (clk_src_bus) {
+ /* Configure the ADC clock from AHB */
+ clock_set_adc_source(clock_adc0, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll0_clk0 divided by 2 */
+ clock_set_adc_source(clock_adc0, clk_adc_src_ana0);
+ clock_set_source_divider(clock_ana0, clk_src_pll1_clk2, 2U);
+ }
+ clock_add_to_group(clock_adc0, 0);
+ freq = clock_get_frequency(clock_adc0);
+ } else if (ptr == (void *)HPM_ADC1) {
+ if (clk_src_bus) {
+ /* Configure the ADC clock from AHB */
+ clock_set_adc_source(clock_adc1, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll0_clk0 divided by 2 */
+ clock_set_adc_source(clock_adc1, clk_adc_src_ana1);
+ clock_set_source_divider(clock_ana1, clk_src_pll1_clk2, 2U);
+ }
+ clock_add_to_group(clock_adc1, 0);
+ freq = clock_get_frequency(clock_adc1);
+ }
+
+ return freq;
+}
+
+void board_init_adc16_pins(void)
+{
+ init_adc_pins();
+}
+
+void board_init_acmp_pins(void)
+{
+ init_acmp_pins();
+}
+
+void board_init_acmp_clock(ACMP_Type *ptr)
+{
+ (void)ptr;
+ clock_add_to_group(BOARD_ACMP_CLK, BOARD_RUNNING_CORE & 0x1);
+}
+
+uint32_t board_init_dac_clock(void *ptr, bool clk_src_ahb)
+{
+ (void)ptr;
+ (void)clk_src_ahb;
+ return 0;
+}
+
+void board_init_can(MCAN_Type *ptr)
+{
+ init_can_pins(ptr);
+}
+
+uint32_t board_init_can_clock(MCAN_Type *ptr)
+{
+ uint32_t freq = 0;
+ if (ptr == HPM_MCAN0) {
+ clock_add_to_group(clock_can0, 0);
+ clock_set_source_divider(clock_can0, clk_src_pll1_clk0, 10);
+ freq = clock_get_frequency(clock_can0);
+ }
+ return freq;
+}
+
+void board_init_rgb_pwm_pins(void)
+{
+ init_led_pins_as_pwm();
+}
+
+void board_disable_output_rgb_led(uint8_t color)
+{
+ (void) color;
+}
+
+void board_enable_output_rgb_led(uint8_t color)
+{
+ (void) color;
+}
+
+void board_init_dac_pins(void *ptr)
+{
+ (void)ptr;
+}
+
+uint8_t board_get_led_pwm_off_level(void)
+{
+ return BOARD_LED_OFF_LEVEL;
+}
+
+uint8_t board_get_led_gpio_off_level(void)
+{
+ return BOARD_LED_OFF_LEVEL;
+}
+
+void board_init_pmp(void)
+{
+}
+
+uint32_t board_init_uart_clock(UART_Type *ptr)
+{
+ uint32_t freq = 0U;
+ if (ptr == HPM_UART0) {
+ clock_add_to_group(clock_uart0, 0);
+ freq = clock_get_frequency(clock_uart0);
+ } else if (ptr == HPM_UART2) {
+ clock_add_to_group(clock_uart2, 0);
+ freq = clock_get_frequency(clock_uart2);
+ } else if (ptr == HPM_UART3) {
+ clock_add_to_group(clock_uart3, 0);
+ freq = clock_get_frequency(clock_uart3);
+ }
+
+ return freq;
+}
+
+void board_i2c_bus_clear(I2C_Type *ptr)
+{
+ if (i2c_get_line_scl_status(ptr) == false) {
+ printf("CLK is low, please power cycle the board\n");
+ while (1) {
+ }
+ }
+ if (i2c_get_line_sda_status(ptr) == false) {
+ printf("SDA is low, try to issue I2C bus clear\n");
+ } else {
+ printf("I2C bus is ready\n");
+ return;
+ }
+ i2c_gen_reset_signal(ptr, 9);
+ board_delay_ms(100);
+ printf("I2C bus is cleared\n");
+}
+
+uint32_t board_init_i2c_clock(I2C_Type *ptr)
+{
+ uint32_t freq = 0;
+
+ if (ptr == HPM_I2C0) {
+ clock_add_to_group(clock_i2c0, 0);
+ freq = clock_get_frequency(clock_i2c0);
+ } else if (ptr == HPM_I2C1) {
+ clock_add_to_group(clock_i2c1, 0);
+ freq = clock_get_frequency(clock_i2c1);
+ } else if (ptr == HPM_I2C2) {
+ clock_add_to_group(clock_i2c2, 0);
+ freq = clock_get_frequency(clock_i2c2);
+ } else {
+ ;
+ }
+
+ return freq;
+}
+
+void board_init_i2c(I2C_Type *ptr)
+{
+ i2c_config_t config;
+ hpm_stat_t stat;
+ uint32_t freq;
+
+ freq = board_init_i2c_clock(ptr);
+ init_i2c_pins(ptr);
+ board_i2c_bus_clear(ptr);
+ config.i2c_mode = i2c_mode_normal;
+ config.is_10bit_addressing = false;
+ stat = i2c_init_master(ptr, freq, &config);
+ if (stat != status_success) {
+ printf("failed to initialize i2c 0x%lx\n", (uint32_t) ptr);
+ while (1) {
+ }
+ }
+}
+
+void board_init_adc_qeiv2_pins(void)
+{
+ init_adc_qeiv2_pins();
+}
+
+void board_init_gptmr_channel_pin(GPTMRV2_Type *ptr, uint32_t channel, bool as_comp)
+{
+ init_gptmr_channel_pin(ptr, channel, as_comp);
+}
+
+void board_init_clk_ref_pin(void)
+{
+ init_clk_ref_pin();
+}
+
+uint32_t board_init_gptmr_clock(GPTMRV2_Type *ptr)
+{
+ uint32_t freq = 0U;
+ if (ptr == HPM_GPTMR0) {
+ clock_add_to_group(clock_gptmr0, BOARD_RUNNING_CORE & 0x1);
+ freq = clock_get_frequency(clock_gptmr0);
+ } else if (ptr == HPM_GPTMR1) {
+ clock_add_to_group(clock_gptmr1, BOARD_RUNNING_CORE & 0x1);
+ freq = clock_get_frequency(clock_gptmr1);
+ } else if (ptr == HPM_PTMR) {
+ clock_add_to_group(clock_ptmr, BOARD_RUNNING_CORE & 0x1);
+ freq = clock_get_frequency(clock_ptmr);
+ } else {
+ /* Not supported */
+ }
+ return freq;
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/board.h b/bsp/hpmicro/hpm5100evk/board/board.h
new file mode 100644
index 000000000000..71ca2bea1e19
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/board.h
@@ -0,0 +1,274 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef _HPM_BOARD_H
+#define _HPM_BOARD_H
+#include
+#include "hpm_common.h"
+#include "hpm_soc.h"
+#include "hpm_soc_feature.h"
+#include "hpm_clock_drv.h"
+#include "pinmux.h"
+#if !defined(CONFIG_NDEBUG_CONSOLE) || !CONFIG_NDEBUG_CONSOLE
+#include "hpm_debug_console.h"
+#endif
+
+#define BOARD_NAME "hpm5100evk"
+#define BOARD_UF2_SIGNATURE (0x0A4D5048UL)
+
+#ifndef BOARD_RUNNING_CORE
+#define BOARD_RUNNING_CORE HPM_CORE0
+#endif
+
+/* ACMP desction */
+#define BOARD_ACMP HPM_ACMP0
+#define BOARD_ACMP_CLK clock_acmp0
+#define BOARD_ACMP_CHANNEL ACMP_CHANNEL_CHN0
+#define BOARD_ACMP_IRQ IRQn_ACMP0_0
+#define BOARD_ACMP_PLUS_INPUT ACMP_INPUT_DAC_OUT /* use internal DAC */
+#define BOARD_ACMP_MINUS_INPUT ACMP_INPUT_ANALOG_1 /* align with used pin */
+
+/* dma section */
+#define BOARD_APP_DMA0 HPM_HDMA0
+#define BOARD_APP_DMA1 HPM_HDMA1
+#define BOARD_APP_DMA0_IRQ IRQn_HDMA0
+#define BOARD_APP_DMA1_IRQ IRQn_HDMA1
+#define BOARD_APP_DMAMUX HPM_DMAMUX
+#define TEST_DMA_CONTROLLER HPM_HDMA0
+#define TEST_DMA_IRQ IRQn_HDMA0
+
+/* uart section */
+#ifndef BOARD_APP_UART_BASE
+#define BOARD_APP_UART_BASE HPM_UART2
+#define BOARD_APP_UART_IRQ IRQn_UART2
+#define BOARD_APP_UART_BAUDRATE (115200UL)
+#define BOARD_APP_UART_CLK_NAME clock_uart2
+#define BOARD_APP_UART_RX_DMA_REQ HPM_DMA_SRC_UART2_RX
+#define BOARD_APP_UART_TX_DMA_REQ HPM_DMA_SRC_UART2_TX
+#endif
+
+#define BOARD_APP_UART_BREAK_SIGNAL_PIN IOC_PAD_PC14
+
+#define BOARD_APP_UART_TRIG HPM_TRGM0_OUTPUT_SRC_UART_TRIG1 /* need to match UART instance */
+#define BOARD_UART_TRGM HPM_TRGM0
+#define BOARD_UART_TRGM_GPTMR HPM_GPTMR1
+#define BOARD_UART_TRGM_GPTMR_CLK clock_gptmr1
+#define BOARD_UART_TRGM_GPTMR_CH 2
+#define BOARD_UART_TRGM_GPTMR_INPUT HPM_TRGM0_INPUT_SRC_GPTMR1_OUT2
+
+/* uart lin sample section */
+#define BOARD_UART_LIN HPM_UART3
+#define BOARD_UART_LIN_IRQ IRQn_UART3
+#define BOARD_UART_LIN_CLK_NAME clock_uart3
+#define BOARD_UART_LIN_TX_PORT GPIO_DI_GPIOC
+#define BOARD_UART_LIN_TX_PIN (0U) /* PC00 should align with used pin in pinmux configuration */
+
+#if !defined(CONFIG_NDEBUG_CONSOLE) || !CONFIG_NDEBUG_CONSOLE
+#ifndef BOARD_CONSOLE_TYPE
+#define BOARD_CONSOLE_TYPE CONSOLE_TYPE_UART
+#endif
+
+#if BOARD_CONSOLE_TYPE == CONSOLE_TYPE_UART
+#ifndef BOARD_CONSOLE_UART_BASE
+#define BOARD_CONSOLE_UART_BASE HPM_UART0
+#define BOARD_CONSOLE_UART_CLK_NAME clock_uart0
+#define BOARD_CONSOLE_UART_IRQ IRQn_UART0
+#define BOARD_CONSOLE_UART_TX_DMA_REQ HPM_DMA_SRC_UART0_TX
+#define BOARD_CONSOLE_UART_RX_DMA_REQ HPM_DMA_SRC_UART0_RX
+#endif
+#define BOARD_CONSOLE_UART_BAUDRATE (115200UL)
+#endif
+#endif
+
+/* usb cdc acm uart section */
+#define BOARD_USB_CDC_ACM_UART BOARD_APP_UART_BASE
+#define BOARD_USB_CDC_ACM_UART_CLK_NAME BOARD_APP_UART_CLK_NAME
+#define BOARD_USB_CDC_ACM_UART_TX_DMA_SRC BOARD_APP_UART_TX_DMA_REQ
+#define BOARD_USB_CDC_ACM_UART_RX_DMA_SRC BOARD_APP_UART_RX_DMA_REQ
+
+/* rtthread-nano finsh section */
+#define BOARD_RT_CONSOLE_BASE BOARD_CONSOLE_UART_BASE
+#define BOARD_RT_CONSOLE_CLK_NAME BOARD_CONSOLE_UART_CLK_NAME
+#define BOARD_RT_CONSOLE_IRQ BOARD_CONSOLE_UART_IRQ
+
+/* nor flash section */
+#define BOARD_FLASH_BASE_ADDRESS (0x80000000UL)
+#define BOARD_FLASH_SIZE (SIZE_1MB)
+
+/* i2c section */
+#define BOARD_APP_I2C_BASE HPM_I2C1
+#define BOARD_APP_I2C_IRQ IRQn_I2C1
+#define BOARD_APP_I2C_CLK_NAME clock_i2c1
+#define BOARD_APP_I2C_DMA HPM_HDMA0
+#define BOARD_APP_I2C_DMAMUX HPM_DMAMUX
+#define BOARD_APP_I2C_DMA_SRC HPM_DMA_SRC_I2C1
+
+/* gptmr section */
+#define BOARD_GPTMR HPM_GPTMR0
+#define BOARD_GPTMR_IRQ IRQn_GPTMR0
+#define BOARD_GPTMR_CHANNEL 0
+#define BOARD_GPTMR_DMA_SRC HPM_DMA_SRC_GPTMR0_0
+#define BOARD_GPTMR_CLK_NAME clock_gptmr0
+#define BOARD_GPTMR_PWM HPM_GPTMR0
+#define BOARD_GPTMR_PWM_CHANNEL 0
+#define BOARD_GPTMR_PWM_DMA_SRC HPM_DMA_SRC_GPTMR0_0
+#define BOARD_GPTMR_PWM_CLK_NAME clock_gptmr0
+#define BOARD_GPTMR_PWM_IRQ IRQn_GPTMR0
+#define BOARD_GPTMR_PWM_SYNC HPM_GPTMR0
+#define BOARD_GPTMR_PWM_SYNC_CHANNEL 1
+#define BOARD_GPTMR_PWM_SYNC_CLK_NAME clock_gptmr0
+
+/* User LED */
+#define BOARD_LED_GPIO_CTRL HPM_GPIO0
+#define BOARD_LED_GPIO_INDEX GPIO_DI_GPIOA
+#define BOARD_LED_GPIO_PIN 18
+#define BOARD_LED_GPIO_NAME "PA18"
+
+#define BOARD_LED_OFF_LEVEL 1
+#define BOARD_LED_ON_LEVEL 0
+
+/* gpiom section */
+#define BOARD_APP_GPIOM_BASE HPM_GPIOM
+#define BOARD_APP_GPIOM_USING_CTRL HPM_FGPIO
+#define BOARD_APP_GPIOM_USING_CTRL_NAME gpiom_core0_fast
+
+/* User button */
+#define BOARD_APP_GPIO_CTRL HPM_GPIO0
+#define BOARD_APP_GPIO_INDEX GPIO_DI_GPIOA
+#define BOARD_APP_GPIO_PIN 15
+#define BOARD_APP_GPIO_IRQ IRQn_GPIO0_A
+#define BOARD_BUTTON_PRESSED_VALUE 0
+
+/* spi section */
+#define BOARD_APP_SPI_BASE HPM_SPI3
+#define BOARD_APP_SPI_CLK_NAME clock_spi3
+#define BOARD_APP_SPI_IRQ IRQn_SPI3
+#define BOARD_APP_SPI_SCLK_FREQ (10000000UL)
+#define BOARD_APP_SPI_ADDR_LEN_IN_BYTES (1U)
+#define BOARD_APP_SPI_DATA_LEN_IN_BITS (8U)
+#define BOARD_APP_SPI_RX_DMA HPM_DMA_SRC_SPI3_RX
+#define BOARD_APP_SPI_TX_DMA HPM_DMA_SRC_SPI3_TX
+#define BOARD_SPI_CS_GPIO_CTRL HPM_GPIO0
+#define BOARD_SPI_CS_PIN IOC_PAD_PC06
+#define BOARD_SPI_CS_ACTIVE_LEVEL (0U)
+
+/* ADC section */
+#define BOARD_APP_ADC16_NAME "ADC0"
+#define BOARD_APP_ADC16_BASE HPM_ADC0
+#define BOARD_APP_ADC16_IRQn IRQn_ADC0
+#define BOARD_APP_ADC16_CH_1 (2U)
+#define BOARD_APP_ADC16_CLK_NAME (clock_adc0)
+#define BOARD_APP_ADC16_CLK_BUS (clk_adc_src_ahb0)
+
+#define BOARD_APP_ADC16_HW_TRIG_SRC_CLK_NAME clock_pwm0
+#define BOARD_APP_ADC16_HW_TRIG_SRC HPM_PWM0
+#define BOARD_APP_ADC16_HW_TRGM HPM_TRGM0
+#define BOARD_APP_ADC16_HW_TRGM_IN HPM_TRGM0_INPUT_SRC_PWM0_TRIGO_8
+#define BOARD_APP_ADC16_HW_TRGM_OUT_SEQ TRGM_TRGOCFG_ADC0_STRGI
+#define BOARD_APP_ADC16_HW_TRGM_OUT_PMT TRGM_TRGOCFG_ADCX_PTRGI0A
+
+#define BOARD_APP_ADC16_PMT_TRIG_CH ADC16_CONFIG_TRG0A
+
+/* Flash section */
+#define BOARD_APP_XPI_NOR_XPI_BASE (HPM_XPI0)
+#define BOARD_APP_XPI_NOR_CFG_OPT_HDR (0xfcf90002U)
+#define BOARD_APP_XPI_NOR_CFG_OPT_OPT0 (0x00000006U)
+#define BOARD_APP_XPI_NOR_CFG_OPT_OPT1 (0x00001000U)
+
+/* MCAN section */
+#define BOARD_APP_CAN_BASE HPM_MCAN0
+#define BOARD_APP_CAN_IRQn IRQn_MCAN0
+
+/* CALLBACK TIMER section */
+#define BOARD_CALLBACK_TIMER (HPM_GPTMR0)
+#define BOARD_CALLBACK_TIMER_CH 3
+#define BOARD_CALLBACK_TIMER_IRQ IRQn_GPTMR0
+#define BOARD_CALLBACK_TIMER_CLK_NAME (clock_gptmr0)
+
+/* APP PWM */
+#define BOARD_APP_TRGM HPM_TRGM0
+#define BOARD_APP_PWM HPM_PWM3
+#define BOARD_APP_PWM_CLOCK_NAME clock_pwm3
+#define BOARD_APP_PWM_OUT1 0
+#define BOARD_APP_PWM_OUT2 1
+#define BOARD_APP_PWM_IRQ IRQn_PWM3
+#define BOARD_APP_TRGM_PWM_OUTPUT TRGM_TRGOCFG_PWM3_SYNCI
+#define BOARD_APP_TRGM_PWM_INPUT HPM_TRGM0_INPUT_SRC_PWM3_TRIGO_8
+
+/* moto */
+#define BOARD_MOTOR_CLK_NAME clock_mot0
+
+/* OPAMP */
+#define BOARD_APP_OPAMP HPM_OPAMP3
+#define BOARD_APP_OPAMP_CLOCK clock_opa3
+#define BOARD_APP_OPAMP_INP_PAD inp_pad_vip1
+
+#ifndef BOARD_SHOW_CLOCK
+#define BOARD_SHOW_CLOCK 1
+#endif
+#ifndef BOARD_SHOW_BANNER
+#define BOARD_SHOW_BANNER 1
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef void (*board_timer_cb)(void);
+
+void board_init(void);
+void board_init_console(void);
+void board_init_gpio_pins(void);
+void board_init_led_pins(void);
+void board_init_usb(USB_Type *ptr);
+void board_led_write(uint8_t state);
+void board_led_toggle(void);
+void board_init_uart(UART_Type *ptr);
+void board_init_spi_pins(SPI_Type *ptr);
+void board_write_spi_cs(uint32_t pin, uint8_t state);
+void board_init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
+void board_init_adc16_pins(void);
+void board_init_acmp_pins(void);
+void board_init_acmp_clock(ACMP_Type *ptr);
+void board_init_can(MCAN_Type *ptr);
+void board_init_rgb_pwm_pins(void);
+void board_disable_output_rgb_led(uint8_t color);
+void board_enable_output_rgb_led(uint8_t color);
+void board_init_dac_pins(void *ptr);
+void board_init_usb_dp_dm_pins(void);
+void board_init_clock(void);
+void board_delay_us(uint32_t us);
+void board_delay_ms(uint32_t ms);
+void board_timer_create(uint32_t ms, board_timer_cb cb);
+void board_ungate_mchtmr_at_lp_mode(void);
+uint8_t board_get_led_gpio_off_level(void);
+uint8_t board_get_led_pwm_off_level(void);
+void board_init_pmp(void);
+uint32_t board_init_uart_clock(UART_Type *ptr);
+uint32_t board_init_i2c_clock(I2C_Type *ptr);
+void board_init_i2c(I2C_Type *ptr);
+void board_init_adc_qeiv2_pins(void);
+void board_init_gptmr_channel_pin(GPTMRV2_Type *ptr, uint32_t channel, bool as_comp);
+void board_init_clk_ref_pin(void);
+uint32_t board_init_gptmr_clock(GPTMRV2_Type *ptr);
+
+/* Pin dispatch wrappers (used by RT-Thread drivers) */
+void init_pwm_pins(PWM_Type *ptr);
+void init_py_pins_as_pgpio(void);
+void init_uart_pins(UART_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
+void init_can_pins(MCAN_Type *ptr);
+void init_usb_pins(USB_Type *ptr);
+void init_spi_pins(SPI_Type *ptr);
+void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
+void init_gptmr_channel_pin(GPTMRV2_Type *ptr, uint32_t channel, bool as_comp);
+uint32_t board_init_spi_clock(SPI_Type *ptr);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _HPM_BOARD_H */
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/boards/hpm5100evk.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/boards/hpm5100evk.cfg
new file mode 100644
index 000000000000..f46beeb8eb7e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/boards/hpm5100evk.cfg
@@ -0,0 +1,67 @@
+# Copyright (c) 2026 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# openocd flash driver argument:
+# - option0:
+# [31:28] Flash probe type
+# 0 - SFDP SDR / 1 - SFDP DDR
+# 2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)
+# 4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V
+# 6 - OctaBus DDR (SPI -> OPI DDR)
+# 8 - Xccela DDR (SPI -> OPI DDR)
+# 10 - EcoXiP DDR (SPI -> OPI DDR)
+# [27:24] Command Pads after Power-on Reset
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [23:20] Command Pads after Configuring FLASH
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
+# 0 - Not needed
+# 1 - QE bit is at bit6 in Status Register 1
+# 2 - QE bit is at bit1 in Status Register 2
+# 3 - QE bit is at bit7 in Status Register 2
+# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
+# [15:8] Dummy cycles
+# 0 - Auto-probed / detected / default value
+# Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet
+# [7:4] Misc.
+# 0 - Not used
+# 1 - SPI mode
+# 2 - Internal loopback
+# 3 - External DQS
+# [3:0] Frequency option
+# 1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 120MHz / 7 - 133MHz / 8 - 166MHz
+# - option1:
+# [31:20] Reserved
+# [19:16] IO voltage
+# 0 - 3V / 1 - 1.8V
+# [15:12] Pin group
+# 0 - 1st group / 1 - 2nd group
+# [11:8] Connection selection
+# 0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)
+# [7:0] Drive Strength
+# 0 - Default value
+
+# xpi0 configs
+# - flash driver: hpm_xpi
+# - flash ctrl index: 0xF00E0000
+# - base address: 0x80000000
+# - flash size: 0x2000000
+# - flash option0: 0x5
+# - flash option1: 0x1000
+flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF00E0000 0x5 0x1000
+
+proc init_clock {} {
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
+ echo "clocks has been enabled!"
+}
+
+$_TARGET0 configure -event reset-init {
+ init_clock
+}
+
+$_TARGET0 configure -event gdb-attach {
+ reset halt
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
new file mode 100644
index 000000000000..d8b53cc006ff
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
@@ -0,0 +1,17 @@
+# Copyright (c) 2021-2026 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+bindto 0.0.0.0
+adapter speed 8000
+adapter srst delay 500
+
+source [find interface/cmsis-dap.cfg]
+
+# Transport selection, defaults to jtag
+# Override with e.g.: -c "set TRANSPORT cjtag" BEFORE -f options
+if { ![info exists TRANSPORT] } {
+ set TRANSPORT jtag
+}
+transport select $TRANSPORT
+
+reset_config srst_only
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft2232.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft2232.cfg
new file mode 100644
index 000000000000..580d98ef853f
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft2232.cfg
@@ -0,0 +1,15 @@
+# Copyright 2021 hpmicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+bindto 0.0.0.0
+adapter speed 10000
+reset_config trst_and_srst
+adapter srst delay 50
+
+adapter driver ftdi
+ftdi_vid_pid 0x0403 0x6010
+
+ftdi_layout_init 0x0208 0x020b
+ftdi_layout_signal nTRST -data 0x0200 -noe 0x0400
+ftdi_layout_signal nSRST -data 0x0100 -noe 0x0800
+
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft232.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft232.cfg
new file mode 100644
index 000000000000..4fb0fba2e70e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/ft232.cfg
@@ -0,0 +1,14 @@
+# Copyright 2021 hpmicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+bindto 0.0.0.0
+adapter speed 10000
+reset_config trst_and_srst
+adapter srst delay 50
+
+adapter driver ftdi
+ftdi_vid_pid 0x0403 0x6014
+
+ftdi_layout_init 0x0018 0x001b
+ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
+ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/jlink.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/jlink.cfg
new file mode 100644
index 000000000000..fd8f04428c9b
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/jlink.cfg
@@ -0,0 +1,11 @@
+# Copyright 2021 hpmicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+bindto 0.0.0.0
+adapter speed 10000
+adapter srst delay 500
+
+source [find interface/jlink.cfg]
+
+transport select jtag
+reset_config srst_only
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
new file mode 100644
index 000000000000..e9d6e6d69848
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
@@ -0,0 +1,14 @@
+# Copyright 2021 hpmicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+bindto 0.0.0.0
+adapter speed 10000
+adapter srst delay 500
+reset_config srst_only
+
+adapter driver ftdi
+ftdi_vid_pid 0x0403 0x6010
+
+ftdi_layout_init 0x0008 0x010b
+ftdi_layout_signal nTRST -data 0x0100 -noe 0x0400
+ftdi_layout_signal nSRST -data 0x0200 -noe 0x0800
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/soc/hpm5300.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm5100.cfg
similarity index 50%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/soc/hpm5300.cfg
rename to bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm5100.cfg
index c57a36d0174d..667aa1ae30bf 100644
--- a/bsp/hpmicro/hpm5300evk/board/debug_scripts/soc/hpm5300.cfg
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm5100.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm5301
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm5151
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr_lite.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF410001C 24000000
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/fal_cfg.h b/bsp/hpmicro/hpm5100evk/board/fal_cfg.h
new file mode 100644
index 000000000000..07bb0c9e5318
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/fal_cfg.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2025 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef _FAL_CFG_H_
+#define _FAL_CFG_H_
+
+#include
+#include
+
+#ifdef RT_USING_FAL
+#define NOR_FLASH_DEV_NAME "norflash0"
+#define NOR_FLASH_MEM_BASE 0x80000000UL
+#define NOR_FLASH_SIZE_IN_BYTES 0x100000UL
+
+#define SPI_NOR_FLASH_DEV_NAME "spi_norflash0"
+
+/* ===================== Flash device Configuration ========================= */
+extern const struct fal_flash_dev stm32f2_onchip_flash;
+extern struct fal_flash_dev nor_flash0;
+
+#if defined(RT_USING_SFUD) && defined(BSP_USING_SPI)
+extern struct fal_flash_dev spi_nor_flash0;
+/* flash device table */
+#define FAL_FLASH_DEV_TABLE \
+{ \
+ &nor_flash0, \
+ &spi_nor_flash0, \
+}
+#else
+/* flash device table */
+#define FAL_FLASH_DEV_TABLE \
+{ \
+ &nor_flash0, \
+}
+#endif
+
+/* ====================== Partition Configuration ========================== */
+#ifdef FAL_PART_HAS_TABLE_CFG
+/* partition table */
+// #ifdef (BSP_USING_SPI) && defined(RT_USING_SFUD) &&
+#define FAL_PART_TABLE \
+{ \
+ {FAL_PART_MAGIC_WORD, "app", NOR_FLASH_DEV_NAME, 0, 256*1024, 0}, \
+ {FAL_PART_MAGIC_WORD, "easyflash", NOR_FLASH_DEV_NAME, 256*1024, 256*1024, 0}, \
+ {FAL_PART_MAGIC_WORD, "download", NOR_FLASH_DEV_NAME, 512*1024, 256*1024, 0}, \
+ {FAL_PART_MAGIC_WORD, "flashdb", NOR_FLASH_DEV_NAME, 768*1024, 256*1024, 0}, \
+ {FAL_PART_MAGIC_WORD, "app", SPI_NOR_FLASH_DEV_NAME, 0, 6*1024*1024, 0}, \
+ {FAL_PART_MAGIC_WORD, "fs", SPI_NOR_FLASH_DEV_NAME, 6*1024*1024, 10*1024*1024, 0}, \
+}
+#endif /* FAL_PART_HAS_TABLE_CFG */
+#endif /* RT_USING_FAL */
+
+#endif /* _FAL_CFG_H_ */
diff --git a/bsp/hpmicro/hpm5100evk/board/fal_flash_port.c b/bsp/hpmicro/hpm5100evk/board/fal_flash_port.c
new file mode 100644
index 000000000000..6960ab7f6755
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/fal_flash_port.c
@@ -0,0 +1,268 @@
+/*
+ * Copyright (c) 2022 hpmicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2022-03-09 hpmicro First implementation
+ * 2022-08-01 hpmicro Fixed random crashing during kvdb_init
+ * 2022-08-03 hpmicro Improved erase speed
+ * 2023-05-15 hpmicro Disable global interrupt during FLASH operation for FLASH build
+ *
+ */
+#include
+#include
+#ifdef RT_USING_FAL
+#include "fal.h"
+#include "hpm_romapi.h"
+#include "board.h"
+#include "hpm_l1c_drv.h"
+
+#if defined(FLASH_XIP) && (FLASH_XIP == 1)
+
+static rt_base_t s_interrupt_level;
+#define FAL_ENTER_CRITICAL() do {\
+ rt_exit_critical();\
+ fencei();\
+ s_interrupt_level = rt_hw_interrupt_disable();\
+ } while(0)
+
+#define FAL_EXIT_CRITICAL() do {\
+ ROM_API_TABLE_ROOT->xpi_driver_if->software_reset(BOARD_APP_XPI_NOR_XPI_BASE);\
+ fencei();\
+ rt_exit_critical();\
+ rt_hw_interrupt_enable(s_interrupt_level);\
+ } while(0)
+
+#define FAL_RAMFUNC __attribute__((section(".isr_vector")))
+
+#else
+#define FAL_ENTER_CRITICAL() rt_enter_critical()
+
+#define FAL_EXIT_CRITICAL() rt_exit_critical()
+
+#define FAL_RAMFUNC
+
+#endif
+
+/***************************************************************************************************
+ * FAL Porting Guide
+ *
+ * 1. Most FLASH devices do not support RWW (Read-while-Write), the codes to access the FLASH
+ * must be placed at RAM or ROM code
+ * 2. During FLASH erase/program, it is recommended to disable the interrupt, or place the
+ * interrupt related codes to RAM
+ *
+ ***************************************************************************************************/
+
+static int init(void);
+static int read(long offset, uint8_t *buf, size_t size);
+static int write(long offset, const uint8_t *buf, size_t size);
+static int erase(long offset, size_t size);
+
+static xpi_nor_config_t s_flashcfg;
+
+/**
+ * @brief FAL Flash device context
+ */
+struct fal_flash_dev nor_flash0 =
+ {
+ .name = NOR_FLASH_DEV_NAME,
+ /* If porting this code to the device with FLASH connected to XPI1, the address must be changed to 0x90000000 */
+ .addr = NOR_FLASH_MEM_BASE,
+ .len = 8 * 1024 * 1024,
+ .blk_size = 4096,
+ .ops = { .init = init, .read = read, .write = write, .erase = erase },
+ .write_gran = 1
+ };
+
+/**
+ * @brief FAL initialization
+ * This function probes the FLASH using the ROM API
+ */
+FAL_RAMFUNC static int init(void)
+{
+ int ret = RT_EOK;
+ xpi_nor_config_option_t cfg_option;
+ cfg_option.header.U = BOARD_APP_XPI_NOR_CFG_OPT_HDR;
+ cfg_option.option0.U = BOARD_APP_XPI_NOR_CFG_OPT_OPT0;
+ cfg_option.option1.U = BOARD_APP_XPI_NOR_CFG_OPT_OPT1;
+
+ FAL_ENTER_CRITICAL();
+ hpm_stat_t status = rom_xpi_nor_auto_config(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, &cfg_option);
+ FAL_EXIT_CRITICAL();
+ if (status != status_success)
+ {
+ ret = -RT_ERROR;
+ }
+ else
+ {
+ /* update the flash chip information */
+ uint32_t sector_size;
+ rom_xpi_nor_get_property(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, xpi_nor_property_sector_size, §or_size);
+ uint32_t flash_size;
+ rom_xpi_nor_get_property(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, xpi_nor_property_total_size, &flash_size);
+ nor_flash0.blk_size = sector_size;
+ nor_flash0.len = flash_size;
+ }
+
+ return ret;
+}
+
+/**
+ * @brief FAL read function
+ * Read data from FLASH
+ * @param offset FLASH offset
+ * @param buf Buffer to hold data read by this API
+ * @param size Size of data to be read
+ * @return actual read bytes
+ */
+FAL_RAMFUNC static int read(long offset, uint8_t *buf, size_t size)
+{
+ uint32_t flash_addr = nor_flash0.addr + offset;
+ uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN(flash_addr);
+ uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP(flash_addr + size);
+ uint32_t aligned_size = aligned_end - aligned_start;
+ rt_base_t level = rt_hw_interrupt_disable();
+ l1c_dc_invalidate(aligned_start, aligned_size);
+ rt_hw_interrupt_enable(level);
+
+ (void) rt_memcpy(buf, (void*) flash_addr, size);
+
+ return size;
+}
+
+/**
+ * @brief Write unaligned data to the page
+ * @param offset FLASH offset
+ * @param buf Data buffer
+ * @param size Size of data to be written
+ * @return actual size of written data or error code
+ */
+FAL_RAMFUNC static int write_unaligned_page_data(long offset, const uint32_t *buf, size_t size)
+{
+ hpm_stat_t status;
+
+ FAL_ENTER_CRITICAL();
+ status = rom_xpi_nor_program(BOARD_APP_XPI_NOR_XPI_BASE, xpi_xfer_channel_auto, &s_flashcfg, buf, offset, size);
+ FAL_EXIT_CRITICAL();
+
+ if (status != status_success)
+ {
+ return -RT_ERROR;
+ rt_kprintf("write failed, status=%d\n", status);
+ }
+
+ return size;
+}
+
+/**
+ * @brief FAL write function
+ * Write data to specified FLASH address
+ * @param offset FLASH offset
+ * @param buf Data buffer
+ * @param size Size of data to be written
+ * @return actual size of written data or error code
+ */
+FAL_RAMFUNC static int write(long offset, const uint8_t *buf, size_t size)
+{
+ uint32_t *src = NULL;
+ uint32_t buf_32[64];
+ uint32_t write_size;
+ size_t remaining_size = size;
+ int ret = (int)size;
+
+ uint32_t page_size;
+ rom_xpi_nor_get_property(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, xpi_nor_property_page_size, &page_size);
+ uint32_t offset_in_page = offset % page_size;
+ if (offset_in_page != 0)
+ {
+ uint32_t write_size_in_page = page_size - offset_in_page;
+ uint32_t write_page_size = MIN(write_size_in_page, size);
+ (void) rt_memcpy(buf_32, buf, write_page_size);
+ write_size = write_unaligned_page_data(offset, buf_32, write_page_size);
+ if (write_size < 0)
+ {
+ ret = -RT_ERROR;
+ goto write_quit;
+ }
+
+ remaining_size -= write_page_size;
+ offset += write_page_size;
+ buf += write_page_size;
+ }
+
+ while (remaining_size > 0)
+ {
+ write_size = MIN(remaining_size, sizeof(buf_32));
+ rt_memcpy(buf_32, buf, write_size);
+ src = &buf_32[0];
+
+ FAL_ENTER_CRITICAL();
+ hpm_stat_t status = rom_xpi_nor_program(BOARD_APP_XPI_NOR_XPI_BASE, xpi_xfer_channel_auto, &s_flashcfg, src,
+ offset, write_size);
+ FAL_EXIT_CRITICAL();
+
+ if (status != status_success)
+ {
+ ret = -RT_ERROR;
+ rt_kprintf("write failed, status=%d\n", status);
+ break;
+ }
+
+ remaining_size -= write_size;
+ buf += write_size;
+ offset += write_size;
+ }
+
+write_quit:
+ return ret;
+}
+
+/**
+ * @brief FAL erase function
+ * Erase specified FLASH region
+ * @param offset the start FLASH address to be erased
+ * @param size size of the region to be erased
+ * @ret RT_EOK Erase operation is successful
+ * @retval -RT_ERROR Erase operation failed
+ */
+FAL_RAMFUNC static int erase(long offset, size_t size)
+{
+ uint32_t aligned_size = (size + nor_flash0.blk_size - 1U) & ~(nor_flash0.blk_size - 1U);
+ hpm_stat_t status;
+ int ret = (int)size;
+
+ uint32_t block_size;
+ uint32_t sector_size;
+ (void) rom_xpi_nor_get_property(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, xpi_nor_property_sector_size, §or_size);
+ (void) rom_xpi_nor_get_property(BOARD_APP_XPI_NOR_XPI_BASE, &s_flashcfg, xpi_nor_property_block_size, &block_size);
+ uint32_t erase_unit;
+ while (aligned_size > 0)
+ {
+ FAL_ENTER_CRITICAL();
+ if ((offset % block_size == 0) && (aligned_size >= block_size))
+ {
+ erase_unit = block_size;
+ status = rom_xpi_nor_erase_block(BOARD_APP_XPI_NOR_XPI_BASE, xpi_xfer_channel_auto, &s_flashcfg, offset);
+ }
+ else
+ {
+ erase_unit = sector_size;
+ status = rom_xpi_nor_erase_sector(BOARD_APP_XPI_NOR_XPI_BASE, xpi_xfer_channel_auto, &s_flashcfg, offset);
+ }
+ FAL_EXIT_CRITICAL();
+
+ if (status != status_success)
+ {
+ ret = -RT_ERROR;
+ break;
+ }
+ offset += erase_unit;
+ aligned_size -= erase_unit;
+ }
+
+ return ret;
+}
+#endif /* RT_USING_FAL */
diff --git a/bsp/hpmicro/hpm5100evk/board/fal_spi_flash_sfud_port.c b/bsp/hpmicro/hpm5100evk/board/fal_spi_flash_sfud_port.c
new file mode 100644
index 000000000000..7eb0b417de95
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/fal_spi_flash_sfud_port.c
@@ -0,0 +1,86 @@
+/*
+ * Copyright (c) 2022 hpmicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2026-07-02 hpmicro First implementation
+ *
+ */
+#include
+#if defined(RT_USING_SFUD) && defined(BSP_USING_SPI) && defined(RT_USING_FAL)
+#include
+#include
+#include
+
+static int init(void);
+static int read(long offset, rt_uint8_t *buf, rt_size_t size);
+static int write(long offset, const rt_uint8_t *buf, rt_size_t size);
+static int erase(long offset, rt_size_t size);
+
+static sfud_flash_t sfud_dev = NULL;
+struct fal_flash_dev spi_nor_flash0 =
+{
+ .name = SPI_NOR_FLASH_DEV_NAME,
+ .addr = 0,
+ .len = 16 * 1024 * 1024,
+ .blk_size = 4096,
+ .ops = {init, read, write, erase},
+ .write_gran = 1
+};
+
+static int init(void)
+{
+
+#ifdef RT_USING_SFUD
+ /* RT-Thread RTOS platform */
+ sfud_dev = rt_sfud_flash_find_by_dev_name(SPI_NOR_FLASH_DEV_NAME);
+#endif
+
+ if (NULL == sfud_dev)
+ {
+ return -1;
+ }
+
+ /* update the flash chip information */
+ spi_nor_flash0.blk_size = sfud_dev->chip.erase_gran;
+ spi_nor_flash0.len = sfud_dev->chip.capacity;
+
+ return 0;
+}
+
+static int read(long offset, rt_uint8_t *buf, rt_size_t size)
+{
+ RT_ASSERT(sfud_dev);
+ RT_ASSERT(sfud_dev->init_ok);
+ sfud_read(sfud_dev, spi_nor_flash0.addr + offset, size, buf);
+
+ return size;
+}
+
+static int write(long offset, const rt_uint8_t *buf, rt_size_t size)
+{
+ RT_ASSERT(sfud_dev);
+ RT_ASSERT(sfud_dev->init_ok);
+ if (sfud_write(sfud_dev, spi_nor_flash0.addr + offset, size, buf) != SFUD_SUCCESS)
+ {
+ return -1;
+ }
+
+ return size;
+}
+
+static int erase(long offset, rt_size_t size)
+{
+ RT_ASSERT(sfud_dev);
+ RT_ASSERT(sfud_dev->init_ok);
+ if (sfud_erase(sfud_dev, spi_nor_flash0.addr + offset, size) != SFUD_SUCCESS)
+ {
+ return -1;
+ }
+
+ return size;
+}
+
+#endif
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_usb_nic.ld b/bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/flash_rtt.ld
similarity index 85%
rename from bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_usb_nic.ld
rename to bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/flash_rtt.ld
index 366923d61aff..45bbaf5a2d80 100644
--- a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_usb_nic.ld
+++ b/bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -1,24 +1,20 @@
/*
- * Copyright 2021-2025 HPMicro
+ * Copyright 2025 HPMicro
* SPDX-License-Identifier: BSD-3-Clause
*/
ENTRY(_start)
STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 144K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 0x4000;
+HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 32K;
+FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 1M;
MEMORY
{
XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 128K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x01080000, LENGTH = 64K
- AXI_SRAM (wx) : ORIGIN = 0x01090000, LENGTH = 176K
- SHARE_RAM (w) : ORIGIN = 0x010BC000, LENGTH = 16K
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
+ ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
+ DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K
+ AHB_SRAM (w) : ORIGIN = 0xF0200000, LENGTH = 32k
}
__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
@@ -29,6 +25,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -53,7 +58,6 @@ SECTIONS
__vector_ram_start__ = .;
KEEP(*(.vector_table))
KEEP(*(.isr_vector))
-
. = ALIGN(16);
__vector_ram_end__ = .;
} > ILM
@@ -84,6 +88,9 @@ SECTIONS
KEEP(*mempool.o (.text .text* .rodata .rodata*))
/* RT-Thread Core End */
+ /* HPMicro Driver Wrapper */
+ KEEP(*drv_*.o (.text .text* .rodata .rodata*))
+
. = ALIGN(16);
__ramfunc_end__ = .;
} > ILM
@@ -171,10 +178,10 @@ SECTIONS
.fast_ram (NOLOAD) : {
KEEP(*(.fast_ram))
- } > ILM
+ } > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
+ .fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
KEEP(*(.fast_ram.init))
@@ -183,19 +190,13 @@ SECTIONS
. = ALIGN(8);
} > DLM
- .bss(NOLOAD) : {
+ .fast_ram.bss (NOLOAD) : {
. = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
. = ALIGN(8);
- _end = .;
- __bss_end__ = .;
} > DLM
/* Note: the .tbss and .tdata section should be adjacent */
@@ -274,18 +275,32 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
+ .bss(NOLOAD) : {
+ . = ALIGN(8);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss*)
+ *(.sbss*)
+ *(.scommon)
+ *(.scommon*)
+ *(.dynsbss*)
+ *(COMMON)
+ . = ALIGN(8);
+ _end = .;
+ __bss_end__ = .;
+ } > DLM
.heap(NOLOAD) : {
. = ALIGN(8);
__heap_start__ = .;
. += HEAP_SIZE;
__heap_end__ = .;
- } > AXI_SRAM
-
+ } > DLM
.stack(NOLOAD) : {
. = ALIGN(8);
@@ -297,14 +312,14 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > DLM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
KEEP(*(.noncacheable.init))
__noncacheable_init_end__ = .;
. = ALIGN(8);
- } > NONCACHEABLE_RAM
+ } > DLM
.noncacheable.bss (NOLOAD) : {
. = ALIGN(8);
@@ -316,15 +331,9 @@ SECTIONS
KEEP(*(.noncacheable.bss.*))
__noncacheable_bss_end__ = .;
. = ALIGN(8);
- } > NONCACHEABLE_RAM
+ } > DLM
.ahb_sram (NOLOAD) : {
KEEP(*(.ahb_sram))
} > AHB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
- __share_mem_start__ = ORIGIN(SHARE_RAM);
- __share_mem_end__ = ORIGIN(SHARE_RAM) + LENGTH(SHARE_RAM);
-
}
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_sdram_rtt.ld b/bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/ram_rtt.ld
similarity index 82%
rename from bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
rename to bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/ram_rtt.ld
index 7b04b9be3290..e2e457c583b6 100644
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
+++ b/bsp/hpmicro/hpm5100evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -1,23 +1,18 @@
/*
- * Copyright 2021-2025 HPMicro
+ * Copyright 2025 HPMicro
* SPDX-License-Identifier: BSD-3-Clause
*/
ENTRY(_start)
STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
+HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 32K;
MEMORY
{
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 128K
- AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 512K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
+ ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
+ DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K
+ AHB_SRAM (w) : ORIGIN = 0xF0200000, LENGTH = 32k
}
SECTIONS
@@ -25,14 +20,14 @@ SECTIONS
.start : {
. = ALIGN(8);
KEEP(*(.start))
- } > AXI_SRAM
+ } > ILM
.vectors : {
. = ALIGN(8);
KEEP(*(.isr_vector))
KEEP(*(.vector_table))
. = ALIGN(8);
- } > AXI_SRAM
+ } > ILM
.text : {
. = ALIGN(8);
@@ -91,33 +86,37 @@ SECTIONS
__usbh_class_info_start__ = .;
KEEP(*(.usbh_class_info))
__usbh_class_info_end__ = .;
-
PROVIDE (__etext = .);
PROVIDE (_etext = .);
PROVIDE (etext = .);
- } > AXI_SRAM
+
+ } > ILM
.rel : {
KEEP(*(.rel*))
- } > AXI_SRAM
+ } > DLM
.fast_ram (NOLOAD) : {
KEEP(*(.fast_ram))
} > DLM
- .bss(NOLOAD) : {
+ __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ .fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
+ __fast_ram_init_start__ = .;
+ KEEP(*(.fast_ram.init))
+ KEEP(*(.fast_ram.init.*))
+ __fast_ram_init_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
. = ALIGN(8);
- _end = .;
- __bss_end__ = .;
} > DLM
/* Note: .tbss and .tdata should be adjacent */
@@ -125,6 +124,7 @@ SECTIONS
. = ALIGN(8);
__tbss_start__ = .;
*(.tbss*)
+ *(.gnu.linkonce.tb.*)
*(.tcommon*)
_end = .;
__tbss_end__ = .;
@@ -137,6 +137,7 @@ SECTIONS
__thread_pointer = .;
*(.tdata)
*(.tdata*)
+ *(.gnu.linkonce.td.*)
. = ALIGN(8);
__tdata_end__ = .;
} > DLM
@@ -188,7 +189,6 @@ SECTIONS
KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
KEEP(*(SORT(.dtors.*)))
KEEP(*(.dtors))
-
. = ALIGN(8);
__data_end__ = .;
PROVIDE (__edata = .);
@@ -201,18 +201,51 @@ SECTIONS
. = ALIGN(8);
PROVIDE(__ramfunc_start__ = .);
*(.fast)
+ *(.fast.*)
. = ALIGN(8);
PROVIDE(__ramfunc_end__ = .);
} > ILM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ .bss(NOLOAD) : {
+ . = ALIGN(8);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss*)
+ *(.sbss*)
+ *(.scommon)
+ *(.scommon*)
+ *(.dynsbss*)
+ *(COMMON)
+ . = ALIGN(8);
+ _end = .;
+ __bss_end__ = .;
+ } > DLM
+
+ .heap(NOLOAD) : {
+ . = ALIGN(8);
+ __heap_start__ = .;
+ . += HEAP_SIZE;
+ __heap_end__ = .;
+ } > DLM
+
+ .stack(NOLOAD) : {
+ . = ALIGN(8);
+ __stack_base__ = .;
+ . += STACK_SIZE;
+ . = ALIGN(8);
+ PROVIDE (_stack = .);
+ PROVIDE (_stack_in_dlm = .);
+ PROVIDE( __rt_rvstack = . );
+ } > DLM
+
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
KEEP(*(.noncacheable.init))
__noncacheable_init_end__ = .;
. = ALIGN(8);
- } > NONCACHEABLE_RAM
+ } > DLM
.noncacheable.bss (NOLOAD) : {
. = ALIGN(8);
@@ -224,33 +257,9 @@ SECTIONS
KEEP(*(.noncacheable.bss.*))
__noncacheable_bss_end__ = .;
. = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
+ } > DLM
- .ahb_sram (NOLOAD) : {
+ .ahb_sram (NOLOAD) : {
KEEP(*(.ahb_sram))
} > AHB_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE (__rt_rvstack = .);
- } > DLM
-
- .framebuffer (NOLOAD) : {
- KEEP(*(.framebuffer))
- } > SDRAM
-
- .heap (NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
-
- } > SDRAM
}
diff --git a/bsp/hpmicro/hpm5100evk/board/pinmux.c b/bsp/hpmicro/hpm5100evk/board/pinmux.c
new file mode 100644
index 000000000000..8c372161f5e0
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/pinmux.c
@@ -0,0 +1,345 @@
+
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ *
+ * Automatically generated by HPM Pinmux Tool
+ *
+ *
+ * Note:
+ * PY and PZ IOs: if any SOC pin function needs to be routed to these IOs,
+ * besides of IOC, PIOC/BIOC needs to be configured SOC_GPIO_X_xx, so that
+ * expected SoC function can be enabled on these IOs.
+ */
+
+#include "pinmux.h"
+#include "board.h"
+#include "hpm_trgm_drv.h"
+#include "hpm_gpio_drv.h"
+#include "hpm_gpiom_drv.h"
+
+
+void init_uart0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA01].FUNC_CTL = IOC_PA01_FUNC_CTL_UART0_RXD;
+
+ HPM_IOC->PAD[IOC_PAD_PA00].FUNC_CTL = IOC_PA00_FUNC_CTL_UART0_TXD;
+}
+
+void init_uart2_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PY06].FUNC_CTL = IOC_PY06_FUNC_CTL_UART2_RXD;
+ HPM_PIOC->PAD[IOC_PAD_PY06].FUNC_CTL = PIOC_PY06_FUNC_CTL_SOC_GPIO_Y_06;
+
+ HPM_IOC->PAD[IOC_PAD_PY07].FUNC_CTL = IOC_PY07_FUNC_CTL_UART2_TXD;
+ HPM_PIOC->PAD[IOC_PAD_PY07].FUNC_CTL = PIOC_PY07_FUNC_CTL_SOC_GPIO_Y_07;
+}
+
+void init_uart3_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC05].FUNC_CTL = IOC_PC05_FUNC_CTL_UART3_RXD;
+
+ HPM_IOC->PAD[IOC_PAD_PC00].FUNC_CTL = IOC_PC00_FUNC_CTL_UART3_TXD;
+}
+
+void init_uart3_pin_as_gpio(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC05].FUNC_CTL = IOC_PC05_FUNC_CTL_GPIO_C_05;
+ HPM_IOC->PAD[IOC_PAD_PC05].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
+
+ HPM_IOC->PAD[IOC_PAD_PC00].FUNC_CTL = IOC_PC00_FUNC_CTL_GPIO_C_00;
+ HPM_IOC->PAD[IOC_PAD_PC00].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
+}
+
+void init_i2c0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PY01].FUNC_CTL = IOC_PY01_FUNC_CTL_I2C0_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_PIOC->PAD[IOC_PAD_PY01].FUNC_CTL = PIOC_PY01_FUNC_CTL_SOC_GPIO_Y_01;
+ HPM_IOC->PAD[IOC_PAD_PY01].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);
+
+ HPM_IOC->PAD[IOC_PAD_PY00].FUNC_CTL = IOC_PY00_FUNC_CTL_I2C0_SDA | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_PIOC->PAD[IOC_PAD_PY00].FUNC_CTL = PIOC_PY00_FUNC_CTL_SOC_GPIO_Y_00;
+ HPM_IOC->PAD[IOC_PAD_PY00].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);
+}
+
+void init_i2c1_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PY03].FUNC_CTL = IOC_PY03_FUNC_CTL_I2C1_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_PIOC->PAD[IOC_PAD_PY03].FUNC_CTL = PIOC_PY03_FUNC_CTL_SOC_GPIO_Y_03;
+ HPM_IOC->PAD[IOC_PAD_PY03].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);
+
+ HPM_IOC->PAD[IOC_PAD_PY02].FUNC_CTL = IOC_PY02_FUNC_CTL_I2C1_SDA;
+ HPM_PIOC->PAD[IOC_PAD_PY02].FUNC_CTL = PIOC_PY02_FUNC_CTL_SOC_GPIO_Y_02;
+ HPM_IOC->PAD[IOC_PAD_PY02].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_OD_SET(1);
+}
+
+void init_i2c2_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA23].FUNC_CTL = IOC_PA23_FUNC_CTL_I2C2_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_IOC->PAD[IOC_PAD_PA23].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(0) | IOC_PAD_PAD_CTL_OD_SET(1);
+
+ HPM_IOC->PAD[IOC_PAD_PA22].FUNC_CTL = IOC_PA22_FUNC_CTL_I2C2_SDA;
+ HPM_IOC->PAD[IOC_PAD_PA22].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(0) | IOC_PAD_PAD_CTL_OD_SET(1);
+}
+
+void init_i2s0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB09].FUNC_CTL = IOC_PB09_FUNC_CTL_I2S0_BCLK;
+
+ HPM_IOC->PAD[IOC_PAD_PB10].FUNC_CTL = IOC_PB10_FUNC_CTL_I2S0_FCLK;
+
+ HPM_IOC->PAD[IOC_PAD_PB04].FUNC_CTL = IOC_PB04_FUNC_CTL_I2S0_MCLK;
+
+ HPM_IOC->PAD[IOC_PAD_PB08].FUNC_CTL = IOC_PB08_FUNC_CTL_I2S0_RXD_3;
+
+ HPM_IOC->PAD[IOC_PAD_PB00].FUNC_CTL = IOC_PB00_FUNC_CTL_I2S0_TXD_0;
+}
+
+void init_spi3_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC06].FUNC_CTL = IOC_PC06_FUNC_CTL_SPI3_CS_0;
+ HPM_IOC->PAD[IOC_PAD_PC06].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_SPI3_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_IOC->PAD[IOC_PAD_PC10].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PC15].FUNC_CTL = IOC_PC15_FUNC_CTL_SPI3_MISO;
+ HPM_IOC->PAD[IOC_PAD_PC15].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_SPI3_MOSI;
+ HPM_IOC->PAD[IOC_PAD_PC13].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+}
+
+void init_spi3_pins_with_gpio_as_cs(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC06].FUNC_CTL = IOC_PC06_FUNC_CTL_GPIO_C_06;
+ HPM_IOC->PAD[IOC_PAD_PC06].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3) | IOC_PAD_PAD_CTL_DS_SET(7);
+
+ HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_SPI3_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_IOC->PAD[IOC_PAD_PC10].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_SPI3_MOSI;
+ HPM_IOC->PAD[IOC_PAD_PC13].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PC15].FUNC_CTL = IOC_PC15_FUNC_CTL_SPI3_MISO;
+ HPM_IOC->PAD[IOC_PAD_PC15].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+}
+
+void init_gptmr0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_GPTMR0_CAPT_0;
+
+ HPM_IOC->PAD[IOC_PAD_PC15].FUNC_CTL = IOC_PC15_FUNC_CTL_GPTMR0_COMP_0;
+
+ HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_GPTMR0_COMP_1;
+
+ HPM_IOC->PAD[IOC_PAD_PC11].FUNC_CTL = IOC_PC11_FUNC_CTL_GPTMR0_COMP_3;
+}
+
+void init_gpio_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA15].FUNC_CTL = IOC_PA15_FUNC_CTL_GPIO_A_15;
+ HPM_IOC->PAD[IOC_PAD_PA15].PAD_CTL = IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+}
+
+void init_butn_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA15].FUNC_CTL = IOC_PA15_FUNC_CTL_GPIO_A_15;
+ HPM_IOC->PAD[IOC_PAD_PA15].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1) | IOC_PAD_PAD_CTL_HYS_SET(1);
+}
+
+void init_acmp_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC00].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_pwm0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC14].FUNC_CTL = IOC_PC14_FUNC_CTL_PWM0_P_6;
+
+ HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_PWM0_P_5;
+}
+
+void init_pwm1_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_PWM1_P_6;
+
+ HPM_IOC->PAD[IOC_PAD_PC11].FUNC_CTL = IOC_PC11_FUNC_CTL_PWM1_P_7;
+}
+
+void init_pwm2_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB01].FUNC_CTL = IOC_PB01_FUNC_CTL_PWM2_P_1;
+
+ HPM_IOC->PAD[IOC_PAD_PB05].FUNC_CTL = IOC_PB05_FUNC_CTL_PWM2_P_5;
+}
+
+void init_pwm3_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA16].FUNC_CTL = IOC_PA16_FUNC_CTL_PWM3_P_0;
+
+ HPM_IOC->PAD[IOC_PAD_PA17].FUNC_CTL = IOC_PA17_FUNC_CTL_PWM3_P_1;
+
+ HPM_IOC->PAD[IOC_PAD_PA28].FUNC_CTL = IOC_PA28_FUNC_CTL_PWM3_P_4;
+
+ HPM_IOC->PAD[IOC_PAD_PA29].FUNC_CTL = IOC_PA29_FUNC_CTL_PWM3_P_5;
+
+ HPM_IOC->PAD[IOC_PAD_PA30].FUNC_CTL = IOC_PA30_FUNC_CTL_PWM3_P_6;
+
+ HPM_IOC->PAD[IOC_PAD_PA31].FUNC_CTL = IOC_PA31_FUNC_CTL_PWM3_P_7;
+}
+
+void init_adc_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC05].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_adc16_diff_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_adc_bldc_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PA24].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_adc_qeiv2_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA24].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_usb0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB13].FUNC_CTL = IOC_PB13_FUNC_CTL_USB0_ID;
+
+ HPM_IOC->PAD[IOC_PAD_PB15].FUNC_CTL = IOC_PB15_FUNC_CTL_USB0_OC;
+
+ HPM_IOC->PAD[IOC_PAD_PB14].FUNC_CTL = IOC_PB14_FUNC_CTL_USB0_PWR;
+}
+
+void init_mcan0_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA20].FUNC_CTL = IOC_PA20_FUNC_CTL_MCAN0_RXD;
+
+ HPM_IOC->PAD[IOC_PAD_PA19].FUNC_CTL = IOC_PA19_FUNC_CTL_MCAN0_TXD;
+}
+
+void init_led_pins_as_gpio(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA18].FUNC_CTL = IOC_PA18_FUNC_CTL_GPIO_A_18;
+}
+
+void init_led_pins_as_pwm(void)
+{
+}
+
+void init_opamp_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB02].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PB03].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+
+ HPM_IOC->PAD[IOC_PAD_PC09].FUNC_CTL = IOC_PAD_FUNC_CTL_ANALOG_MASK;
+}
+
+void init_uart_break_signal_pin(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC14].FUNC_CTL = IOC_PC14_FUNC_CTL_GPIO_C_14;
+ HPM_IOC->PAD[IOC_PAD_PC14].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
+}
+
+void init_gptmr0_channel0_pin_as_output(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC15].FUNC_CTL = IOC_PC15_FUNC_CTL_GPTMR0_COMP_0;
+}
+
+void init_gptmr0_channel1_pin_as_output(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_GPTMR0_COMP_1;
+}
+
+void init_gptmr0_channel3_pin_as_output(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC11].FUNC_CTL = IOC_PC11_FUNC_CTL_GPTMR0_COMP_3;
+}
+
+void init_gptmr0_channel0_pin_as_capture(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC10].FUNC_CTL = IOC_PC10_FUNC_CTL_GPTMR0_CAPT_0;
+}
+
+void init_clk_ref_pin(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PB01].FUNC_CTL = IOC_PB01_FUNC_CTL_SOC_REF1;
+}
+
+void init_brownout_indicate_pin(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA27].FUNC_CTL = IOC_PA27_FUNC_CTL_GPIO_A_27;
+}
+
+void init_trgm_gptmr0_cap2_invert_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PC02].FUNC_CTL = IOC_PC02_FUNC_CTL_TRGM_P_02;
+
+ trgm_output_t trgm0_io_config0 = {0};
+ trgm0_io_config0.invert = 1;
+ trgm0_io_config0.type = trgm_output_same_as_input;
+ trgm0_io_config0.input = HPM_TRGM0_INPUT_SRC_TRGM0_P02;
+ trgm_output_config(HPM_TRGM0, HPM_TRGM0_OUTPUT_SRC_GPTMR0_IN2, &trgm0_io_config0);
+}
+
+void init_spi_nor_flash_pins_with_gpio_as_cs(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA14].FUNC_CTL = IOC_PA14_FUNC_CTL_SPI0_DAT2;
+ HPM_IOC->PAD[IOC_PAD_PA14].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA09].FUNC_CTL = IOC_PA09_FUNC_CTL_SPI0_DAT3;
+ HPM_IOC->PAD[IOC_PAD_PA09].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA12].FUNC_CTL = IOC_PA12_FUNC_CTL_SPI0_MISO;
+ HPM_IOC->PAD[IOC_PAD_PA12].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA13].FUNC_CTL = IOC_PA13_FUNC_CTL_SPI0_MOSI;
+ HPM_IOC->PAD[IOC_PAD_PA13].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA10].FUNC_CTL = IOC_PA10_FUNC_CTL_SPI0_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_IOC->PAD[IOC_PAD_PA10].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA11].FUNC_CTL = IOC_PA11_FUNC_CTL_GPIO_A_11;
+
+ gpiom_set_pin_controller(HPM_GPIOM, GPIOM_ASSIGN_GPIOA, 11, gpiom_soc_gpio0);
+ gpio_set_pin_output(HPM_GPIO0, GPIO_OE_GPIOA, 11);
+ gpio_write_pin(HPM_GPIO0, GPIO_DO_GPIOA, 11, 1);
+}
+
+void init_spi_nor_flash_pins(void)
+{
+ HPM_IOC->PAD[IOC_PAD_PA14].FUNC_CTL = IOC_PA14_FUNC_CTL_SPI0_DAT2;
+ HPM_IOC->PAD[IOC_PAD_PA14].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA09].FUNC_CTL = IOC_PA09_FUNC_CTL_SPI0_DAT3;
+ HPM_IOC->PAD[IOC_PAD_PA09].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA12].FUNC_CTL = IOC_PA12_FUNC_CTL_SPI0_MISO;
+ HPM_IOC->PAD[IOC_PAD_PA12].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA13].FUNC_CTL = IOC_PA13_FUNC_CTL_SPI0_MOSI;
+ HPM_IOC->PAD[IOC_PAD_PA13].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA10].FUNC_CTL = IOC_PA10_FUNC_CTL_SPI0_SCLK | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
+ HPM_IOC->PAD[IOC_PAD_PA10].PAD_CTL = IOC_PAD_PAD_CTL_DS_SET(7) | IOC_PAD_PAD_CTL_SR_SET(1) | IOC_PAD_PAD_CTL_SPD_SET(3);
+
+ HPM_IOC->PAD[IOC_PAD_PA11].FUNC_CTL = IOC_PA11_FUNC_CTL_SPI0_CS_0;
+}
diff --git a/bsp/hpmicro/hpm5100evk/board/pinmux.h b/bsp/hpmicro/hpm5100evk/board/pinmux.h
new file mode 100644
index 000000000000..496d97f2e6c0
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/pinmux.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ *
+ * Automatically generated by HPM Pinmux Tool
+ *
+ *
+ * Note:
+ * PY and PZ IOs: if any SOC pin function needs to be routed to these IOs,
+ * besides of IOC, PIOC/BIOC needs to be configured SOC_GPIO_X_xx, so that
+ * expected SoC function can be enabled on these IOs.
+ */
+
+#ifndef HPM_PINMUX_H
+#define HPM_PINMUX_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void init_uart0_pins(void);
+void init_uart2_pins(void);
+void init_uart3_pins(void);
+void init_uart3_pin_as_gpio(void);
+void init_i2c0_pins(void);
+void init_i2c1_pins(void);
+void init_i2c2_pins(void);
+void init_i2s0_pins(void);
+void init_spi3_pins(void);
+void init_spi3_pins_with_gpio_as_cs(void);
+void init_gptmr0_pins(void);
+void init_gpio_pins(void);
+void init_butn_pins(void);
+void init_acmp_pins(void);
+void init_pwm0_pins(void);
+void init_pwm1_pins(void);
+void init_pwm2_pins(void);
+void init_pwm3_pins(void);
+void init_adc_pins(void);
+void init_adc16_diff_pins(void);
+void init_adc_bldc_pins(void);
+void init_adc_qeiv2_pins(void);
+void init_usb0_pins(void);
+void init_mcan0_pins(void);
+void init_led_pins_as_gpio(void);
+void init_led_pins_as_pwm(void);
+void init_opamp_pins(void);
+void init_uart_break_signal_pin(void);
+void init_gptmr0_channel0_pin_as_output(void);
+void init_gptmr0_channel1_pin_as_output(void);
+void init_gptmr0_channel3_pin_as_output(void);
+void init_gptmr0_channel0_pin_as_capture(void);
+void init_clk_ref_pin(void);
+void init_brownout_indicate_pin(void);
+void init_trgm_gptmr0_cap2_invert_pins(void);
+void init_spi_nor_flash_pins(void);
+void init_spi_nor_flash_pins_with_gpio_as_cs(void);
+
+#ifdef __cplusplus
+}
+#endif
+#endif /* HPM_PINMUX_H */
diff --git a/bsp/hpmicro/hpm5100evk/board/rtt_board.c b/bsp/hpmicro/hpm5100evk/board/rtt_board.c
new file mode 100644
index 000000000000..412a10747fbd
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/rtt_board.c
@@ -0,0 +1,187 @@
+/*
+ * Copyright (c) 2023-2025 HPMicro
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "board.h"
+#include "rtt_board.h"
+#include "hpm_uart_drv.h"
+#include "hpm_gpio_drv.h"
+#include "hpm_pmp_drv.h"
+#include "assert.h"
+#include "hpm_clock_drv.h"
+#include "hpm_sysctl_drv.h"
+#include
+#include
+#include "hpm_dma_mgr.h"
+#include "hpm_mchtmr_drv.h"
+
+extern int rt_hw_uart_init(void);
+void os_tick_config(void);
+void rtt_board_init(void);
+
+void rt_hw_board_init(void)
+{
+ rtt_board_init();
+
+ /* Call the RT-Thread Component Board Initialization */
+ rt_components_board_init();
+}
+
+void os_tick_config(void)
+{
+ sysctl_config_clock(HPM_SYSCTL, clock_node_mchtmr0, clock_source_osc0_clk0, 1);
+ sysctl_add_resource_to_cpu0(HPM_SYSCTL, sysctl_resource_mchtmr0);
+ mchtmr_set_compare_value(HPM_MCHTMR, BOARD_MCHTMR_FREQ_IN_HZ / RT_TICK_PER_SECOND);
+ enable_mchtmr_irq();
+}
+
+void rtt_board_init(void)
+{
+ board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
+ board_init_console();
+ board_init_pmp();
+
+ dma_mgr_init();
+
+ /* Configure the OS Tick */
+ os_tick_config();
+
+ /* Configure the USB pins*/
+ board_init_usb(HPM_USB0);
+
+ /* Initialize the UART driver first, because later driver initialization may require the rt_kprintf */
+ rt_hw_uart_init();
+
+ /* Set console device */
+ rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
+}
+
+void app_init_led_pins(void)
+{
+ board_init_led_pins();
+ gpio_set_pin_output(APP_LED0_GPIO_CTRL, APP_LED0_GPIO_INDEX, APP_LED0_GPIO_PIN);
+ gpio_write_pin(APP_LED0_GPIO_CTRL, APP_LED0_GPIO_INDEX, APP_LED0_GPIO_PIN, APP_LED_OFF);
+}
+
+void app_led_write(uint32_t index, bool state)
+{
+ switch (index)
+ {
+ case 0:
+ gpio_write_pin(APP_LED0_GPIO_CTRL, APP_LED0_GPIO_INDEX, APP_LED0_GPIO_PIN, state);
+ break;
+ default:
+ /* Suppress the toolchain warnings */
+ break;
+ }
+}
+
+void rt_hw_console_output(const char *str)
+{
+ while (*str != '\0')
+ {
+ uart_send_byte(BOARD_APP_UART_BASE, *str++);
+ }
+}
+
+void app_init_usb_pins(void)
+{
+ board_init_usb(HPM_USB0);
+}
+
+ATTR_PLACE_AT(".isr_vector") void mchtmr_isr(void)
+{
+ HPM_MCHTMR->MTIMECMP = HPM_MCHTMR->MTIME + BOARD_MCHTMR_FREQ_IN_HZ / RT_TICK_PER_SECOND;
+
+ rt_tick_increase();
+}
+
+void rt_hw_cpu_reset(void)
+{
+ HPM_PPOR->RESET_ENABLE |= (1UL << 31);
+ HPM_PPOR->SOFTWARE_RESET = 1000U;
+ while(1) {
+
+ }
+}
+
+MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reset, reset the board);
+
+#ifdef RT_USING_CACHE
+void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
+{
+ if (ops == RT_HW_CACHE_FLUSH) {
+ l1c_dc_flush((uint32_t)addr, size);
+ } else {
+ l1c_dc_invalidate((uint32_t)addr, size);
+ }
+}
+#endif
+
+uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb)
+{
+ uint32_t freq = 0;
+
+ if (ptr == HPM_ADC0) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc0, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk0 divided by 4 (@200MHz by default) */
+ clock_set_adc_source(clock_adc0, clk_adc_src_ana0);
+ clock_set_source_divider(clock_ana0, clk_src_pll1_clk0, 4U);
+ }
+ clock_add_to_group(clock_adc0, 0);
+ freq = clock_get_frequency(clock_adc0);
+ } else if (ptr == HPM_ADC1) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc1, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk0 divided by 4 (@200MHz by default) */
+ clock_set_adc_source(clock_adc1, clk_adc_src_ana1);
+ clock_set_source_divider(clock_ana0, clk_src_pll1_clk0, 4U);
+ }
+ clock_add_to_group(clock_adc1, 0);
+ freq = clock_get_frequency(clock_adc1);
+ }
+
+ return freq;
+}
+
+uint32_t rtt_board_init_pwm_clock(PWM_Type *ptr)
+{
+ uint32_t freq = 0;
+ if (ptr == HPM_PWM0) {
+ clock_add_to_group(clock_pwm0, 0);
+ freq = clock_get_frequency(clock_pwm0);
+ } else if (ptr == HPM_PWM1) {
+ clock_add_to_group(clock_pwm1, 0);
+ freq = clock_get_frequency(clock_pwm1);
+ } else if (ptr == HPM_PWM2) {
+ clock_add_to_group(clock_pwm2, 0);
+ freq = clock_get_frequency(clock_pwm2);
+ } else if (ptr == HPM_PWM3) {
+ clock_add_to_group(clock_pwm3, 0);
+ freq = clock_get_frequency(clock_pwm3);
+ } else {
+
+ }
+ return freq;
+}
+
+#ifdef CONFIG_CHERRYUSB_CUSTOM_IRQ_HANDLER
+extern void hpm_isr_usb0(void);
+RTT_DECLARE_EXT_ISR_M(IRQn_USB0, hpm_isr_usb0)
+#endif
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/board/rtt_board.h b/bsp/hpmicro/hpm5100evk/board/rtt_board.h
new file mode 100644
index 000000000000..39e627cc8dc8
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/board/rtt_board.h
@@ -0,0 +1,80 @@
+/*
+ * Copyright (c) 2021 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#ifndef _RTT_BOARD_H
+#define _RTT_BOARD_H
+#include "hpm_common.h"
+#include "hpm_soc.h"
+#include "board.h"
+
+/* gpio section */
+#define APP_LED0 (0U)
+#define APP_LED0_GPIO_CTRL HPM_GPIO0
+#define APP_LED0_GPIO_INDEX GPIO_DI_GPIOA
+#define APP_LED0_GPIO_PIN 18
+#define APP_LED_ON (0)
+#define APP_LED_OFF (1)
+
+/* mchtimer section */
+#define BOARD_MCHTMR_FREQ_IN_HZ (24000000UL)
+
+/* gptmr as os_tick */
+#define BOARD_OS_TIMER HPM_GPTMR0
+#define BOARD_OS_TIMER_CH 1
+#define BOARD_OS_TIMER_IRQ IRQn_GPTMR0
+#define BOARD_OS_TIMER_CLK_NAME (clock_gptmr0)
+
+/* UART section */
+#define BOARD_UART_NAME "uart2"
+#define BOARD_UART_RX_BUFFER_SIZE BSP_UART2_RX_BUFSIZE
+
+/* PWM section */
+#define BOARD_PWM_NAME "pwm3"
+#define BOARD_PWM_CHANNEL (0U)
+
+/* ADC section */
+#define BOARD_ADC_NAME BOARD_APP_ADC16_NAME
+#define BOARD_ADC_CHANNEL BOARD_APP_ADC16_CH_1
+
+#define IRQn_PendSV IRQn_DEBUG0
+
+/* CAN section */
+#define BOARD_CAN_NAME "can0"
+#define BOARD_CAN_HWFILTER_INDEX (1U)
+
+/***************************************************************
+ *
+ * RT-Thread related definitions
+ *
+ **************************************************************/
+extern unsigned int __heap_start__;
+extern unsigned int __heap_end__;
+
+#define RT_HW_HEAP_BEGIN ((void*)&__heap_start__)
+#define RT_HW_HEAP_END ((void*)&__heap_end__)
+
+
+typedef struct {
+ uint16_t vdd;
+ uint8_t bus_width;
+ uint8_t drive_strength;
+}sdxc_io_cfg_t;
+
+
+#if defined(__cplusplus)
+extern "C" {
+#endif /* __cplusplus */
+
+
+void app_init_led_pins(void);
+void app_led_write(uint32_t index, bool state);
+void app_init_usb_pins(void);
+
+#if defined(__cplusplus)
+}
+#endif /* __cplusplus */
+#endif /* _RTT_BOARD_H */
diff --git a/bsp/hpmicro/hpm5100evk/figures/board.png b/bsp/hpmicro/hpm5100evk/figures/board.png
new file mode 100644
index 000000000000..6783e4efb685
Binary files /dev/null and b/bsp/hpmicro/hpm5100evk/figures/board.png differ
diff --git a/bsp/hpmicro/hpm5100evk/makefile.targets b/bsp/hpmicro/hpm5100evk/makefile.targets
new file mode 100644
index 000000000000..8469d7d2aaf3
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/rtconfig.h b/bsp/hpmicro/hpm5100evk/rtconfig.h
new file mode 100644
index 000000000000..4ade257d72ff
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/rtconfig.h
@@ -0,0 +1,475 @@
+#ifndef RT_CONFIG_H__
+#define RT_CONFIG_H__
+
+/* RT-Thread Kernel */
+
+/* klibc options */
+
+/* rt_vsnprintf options */
+
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
+/* end of rt_vsnprintf options */
+
+/* rt_vsscanf options */
+
+/* end of rt_vsscanf options */
+
+/* rt_memset options */
+
+/* end of rt_memset options */
+
+/* rt_memcpy options */
+
+/* end of rt_memcpy options */
+
+/* rt_memmove options */
+
+/* end of rt_memmove options */
+
+/* rt_memcmp options */
+
+/* end of rt_memcmp options */
+
+/* rt_strstr options */
+
+/* end of rt_strstr options */
+
+/* rt_strcasecmp options */
+
+/* end of rt_strcasecmp options */
+
+/* rt_strncpy options */
+
+/* end of rt_strncpy options */
+
+/* rt_strcpy options */
+
+/* end of rt_strcpy options */
+
+/* rt_strncmp options */
+
+/* end of rt_strncmp options */
+
+/* rt_strcmp options */
+
+/* end of rt_strcmp options */
+
+/* rt_strlen options */
+
+/* end of rt_strlen options */
+
+/* rt_strnlen options */
+
+/* end of rt_strnlen options */
+/* end of klibc options */
+#define RT_NAME_MAX 16
+#define RT_CPUS_NR 1
+#define RT_ALIGN_SIZE 8
+#define RT_THREAD_PRIORITY_32
+#define RT_THREAD_PRIORITY_MAX 32
+#define RT_TICK_PER_SECOND 1000
+#define RT_USING_OVERFLOW_CHECK
+#define RT_USING_HOOK
+#define RT_HOOK_USING_FUNC_PTR
+#define RT_USING_IDLE_HOOK
+#define RT_IDLE_HOOK_LIST_SIZE 4
+#define IDLE_THREAD_STACK_SIZE 1024
+#define RT_USING_TIMER_SOFT
+#define RT_TIMER_THREAD_PRIO 4
+#define RT_TIMER_THREAD_STACK_SIZE 512
+
+/* kservice options */
+
+/* end of kservice options */
+#define RT_USING_DEBUG
+#define RT_DEBUGING_ASSERT
+#define RT_DEBUGING_COLOR
+#define RT_DEBUGING_CONTEXT
+
+/* Inter-Thread communication */
+
+#define RT_USING_SEMAPHORE
+#define RT_USING_MUTEX
+#define RT_USING_EVENT
+#define RT_USING_MAILBOX
+#define RT_USING_MESSAGEQUEUE
+/* end of Inter-Thread communication */
+
+/* Memory Management */
+
+#define RT_USING_MEMPOOL
+#define RT_USING_SMALL_MEM
+#define RT_USING_SMALL_MEM_AS_HEAP
+#define RT_USING_HEAP
+/* end of Memory Management */
+#define RT_USING_DEVICE
+#define RT_USING_CONSOLE
+#define RT_CONSOLEBUF_SIZE 128
+#define RT_CONSOLE_DEVICE_NAME "uart0"
+#define RT_USING_CONSOLE_OUTPUT_CTL
+#define RT_VER_NUM 0x50301
+#define RT_BACKTRACE_LEVEL_MAX_NR 32
+/* end of RT-Thread Kernel */
+#define ARCH_RISCV
+#define ARCH_RISCV32
+
+/* RT-Thread Components */
+
+#define RT_USING_COMPONENTS_INIT
+#define RT_USING_USER_MAIN
+#define RT_MAIN_THREAD_STACK_SIZE 1024
+#define RT_MAIN_THREAD_PRIORITY 10
+#define RT_USING_MSH
+#define RT_USING_FINSH
+#define FINSH_USING_MSH
+#define FINSH_THREAD_NAME "tshell"
+#define FINSH_THREAD_PRIORITY 20
+#define FINSH_THREAD_STACK_SIZE 4096
+#define FINSH_USING_HISTORY
+#define FINSH_HISTORY_LINES 5
+#define FINSH_USING_SYMTAB
+#define FINSH_CMD_SIZE 80
+#define MSH_USING_BUILT_IN_COMMANDS
+#define FINSH_USING_DESCRIPTION
+#define FINSH_ARG_MAX 10
+#define FINSH_USING_OPTION_COMPLETION
+
+/* DFS: device virtual file system */
+
+/* end of DFS: device virtual file system */
+
+/* Device Drivers */
+
+#define RT_USING_DEVICE_IPC
+#define RT_UNAMED_PIPE_NUMBER 64
+#define RT_USING_SERIAL
+#define RT_USING_SERIAL_V2
+#define RT_SERIAL_BUF_STRATEGY_OVERWRITE
+#define RT_SERIAL_USING_DMA
+#define RT_USING_PIN
+/* end of Device Drivers */
+
+/* C/C++ and POSIX layer */
+
+/* ISO-ANSI C layer */
+
+/* Timezone and Daylight Saving Time */
+
+#define RT_LIBC_USING_LIGHT_TZ_DST
+#define RT_LIBC_TZ_DEFAULT_HOUR 8
+#define RT_LIBC_TZ_DEFAULT_MIN 0
+#define RT_LIBC_TZ_DEFAULT_SEC 0
+/* end of Timezone and Daylight Saving Time */
+/* end of ISO-ANSI C layer */
+
+/* POSIX (Portable Operating System Interface) layer */
+
+
+/* Interprocess Communication (IPC) */
+
+
+/* Socket is in the 'Network' category */
+
+/* end of Interprocess Communication (IPC) */
+/* end of POSIX (Portable Operating System Interface) layer */
+/* end of C/C++ and POSIX layer */
+
+/* Network */
+
+/* end of Network */
+
+/* Memory protection */
+
+/* end of Memory protection */
+
+/* Utilities */
+
+/* end of Utilities */
+
+/* Using USB legacy version */
+
+/* end of Using USB legacy version */
+/* end of RT-Thread Components */
+
+/* RT-Thread Utestcases */
+
+/* end of RT-Thread Utestcases */
+
+/* RT-Thread online packages */
+
+/* IoT - internet of things */
+
+
+/* Wi-Fi */
+
+/* Marvell WiFi */
+
+/* end of Marvell WiFi */
+
+/* Wiced WiFi */
+
+/* end of Wiced WiFi */
+
+/* CYW43012 WiFi */
+
+/* end of CYW43012 WiFi */
+
+/* BL808 WiFi */
+
+/* end of BL808 WiFi */
+
+/* CYW43439 WiFi */
+
+/* end of CYW43439 WiFi */
+/* end of Wi-Fi */
+
+/* IoT Cloud */
+
+/* end of IoT Cloud */
+/* end of IoT - internet of things */
+
+/* security packages */
+
+/* end of security packages */
+
+/* language packages */
+
+/* JSON: JavaScript Object Notation, a lightweight data-interchange format */
+
+/* end of JSON: JavaScript Object Notation, a lightweight data-interchange format */
+
+/* XML: Extensible Markup Language */
+
+/* end of XML: Extensible Markup Language */
+/* end of language packages */
+
+/* multimedia packages */
+
+/* LVGL: powerful and easy-to-use embedded GUI library */
+
+/* end of LVGL: powerful and easy-to-use embedded GUI library */
+
+/* u8g2: a monochrome graphic library */
+
+/* end of u8g2: a monochrome graphic library */
+/* end of multimedia packages */
+
+/* tools packages */
+
+/* end of tools packages */
+
+/* system packages */
+
+/* enhanced kernel services */
+
+/* end of enhanced kernel services */
+
+/* acceleration: Assembly language or algorithmic acceleration packages */
+
+/* end of acceleration: Assembly language or algorithmic acceleration packages */
+
+/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */
+
+/* end of CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */
+
+/* Micrium: Micrium software products porting for RT-Thread */
+
+/* end of Micrium: Micrium software products porting for RT-Thread */
+/* end of system packages */
+
+/* peripheral libraries and drivers */
+
+/* HAL & SDK Drivers */
+
+/* STM32 HAL & SDK Drivers */
+
+/* end of STM32 HAL & SDK Drivers */
+
+/* Infineon HAL Packages */
+
+/* end of Infineon HAL Packages */
+
+/* Kendryte SDK */
+
+/* end of Kendryte SDK */
+
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
+/* WCH HAL & SDK Drivers */
+
+/* end of WCH HAL & SDK Drivers */
+
+/* AT32 HAL & SDK Drivers */
+
+/* end of AT32 HAL & SDK Drivers */
+
+/* HC32 DDL Drivers */
+
+/* end of HC32 DDL Drivers */
+
+/* NXP HAL & SDK Drivers */
+
+/* end of NXP HAL & SDK Drivers */
+
+/* NUVOTON Drivers */
+
+/* end of NUVOTON Drivers */
+
+/* GD32 Drivers */
+
+/* end of GD32 Drivers */
+
+/* HPMicro SDK */
+
+#define PKG_USING_HPM_SDK
+#define PKG_USING_HPM_SDK_V113
+/* end of HPMicro SDK */
+
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
+/* FT32 HAL & SDK Drivers */
+
+/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
+/* end of HAL & SDK Drivers */
+
+/* sensors drivers */
+
+/* end of sensors drivers */
+
+/* touch drivers */
+
+/* end of touch drivers */
+/* end of peripheral libraries and drivers */
+
+/* AI packages */
+
+/* end of AI packages */
+
+/* Signal Processing and Control Algorithm Packages */
+
+/* end of Signal Processing and Control Algorithm Packages */
+
+/* miscellaneous packages */
+
+/* project laboratory */
+
+/* end of project laboratory */
+
+/* samples: kernel and components samples */
+
+/* end of samples: kernel and components samples */
+
+/* entertainment: terminal games and other interesting software packages */
+
+/* end of entertainment: terminal games and other interesting software packages */
+/* end of miscellaneous packages */
+
+/* Arduino libraries */
+
+
+/* Projects and Demos */
+
+/* end of Projects and Demos */
+
+/* Sensors */
+
+/* end of Sensors */
+
+/* Display */
+
+/* end of Display */
+
+/* Timing */
+
+/* end of Timing */
+
+/* Data Processing */
+
+/* end of Data Processing */
+
+/* Data Storage */
+
+/* Communication */
+
+/* end of Communication */
+
+/* Device Control */
+
+/* end of Device Control */
+
+/* Other */
+
+/* end of Other */
+
+/* Signal IO */
+
+/* end of Signal IO */
+
+/* Uncategorized */
+
+/* end of Arduino libraries */
+/* end of RT-Thread online packages */
+#define SOC_SERIES_HPM5100
+
+/* Hardware Drivers Config */
+
+#define SOC_HPM5100
+
+/* On-chip Peripheral Drivers */
+
+#define BSP_USING_GPIO
+#define BSP_GPIO_IRQ_PRIORITY 1
+#define BSP_USING_UART
+#define BSP_USING_UART0
+#define BSP_UART0_RX_BUFSIZE 128
+#define BSP_UART0_TX_BUFSIZE 0
+#define BSP_UART0_IRQ_PRIORITY 1
+/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
+/* end of Hardware Drivers Config */
+
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
+#endif
diff --git a/bsp/hpmicro/hpm5100evk/rtconfig.py b/bsp/hpmicro/hpm5100evk/rtconfig.py
new file mode 100644
index 000000000000..5febf5ae4b35
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/rtconfig.py
@@ -0,0 +1,131 @@
+# Copyright 2021-2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+import os
+import sys
+
+
+if os.getenv('RTT_ROOT'):
+ RTT_ROOT = os.getenv('RTT_ROOT')
+else:
+ RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
+
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
+
+# toolchains options
+ARCH='risc-v'
+CPU='hpmicro'
+SOC_FAMILY='HPM5100'
+CHIP_NAME='HPM5151'
+
+CROSS_TOOL='gcc'
+
+# bsp lib config
+BSP_LIBRARY_TYPE = None
+
+# Fallback toolchain info
+FALLBACK_TOOLCHAIN_VENDOR='RISC-V'
+FALLBACK_TOOLCHAIN_PKG='RISC-V-GCC-RV32'
+FALLBACK_TOOLCHAIN_VER='2022-04-12'
+
+if os.getenv('RTT_CC'):
+ CROSS_TOOL = os.getenv('RTT_CC')
+
+RTT_EXEC_PATH = os.getenv('RTT_EXEC_PATH')
+if RTT_EXEC_PATH != None:
+ folders = RTT_EXEC_PATH.split(os.sep)
+ # If the `RT-Thread Env` is from the RT-Thread Studio, generate the RTT_EXEC_PATH using `FALLBACK_TOOLCHAIN_INFO`
+ if 'arm_gcc' in folders and 'platform' in folders:
+ RTT_EXEC_PATH = ''
+ for path in folders:
+ if path != 'platform':
+ RTT_EXEC_PATH = RTT_EXEC_PATH + path + os.sep
+ else:
+ break
+ RTT_EXEC_PATH = os.path.join(RTT_EXEC_PATH, 'repo', 'Extract', 'ToolChain_Support_Packages', FALLBACK_TOOLCHAIN_VENDOR, FALLBACK_TOOLCHAIN_PKG, FALLBACK_TOOLCHAIN_VER, 'bin')
+ # Override the 'RTT_RISCV_TOOLCHAIN' only if the `RT-Thread ENV` is from the RT-Thread Studio
+ if 'platform' in folders:
+ os.environ['RTT_RISCV_TOOLCHAIN'] = RTT_EXEC_PATH
+
+# cross_tool provides the cross compiler
+# EXEC_PATH is the compiler path, for example, GNU RISC-V toolchain, IAR
+if CROSS_TOOL == 'gcc':
+ PLATFORM = 'gcc'
+ if os.getenv('RTT_RISCV_TOOLCHAIN'):
+ EXEC_PATH = os.getenv('RTT_RISCV_TOOLCHAIN')
+ elif RTT_EXEC_PATH:
+ EXEC_PATH = RTT_EXEC_PATH
+ else:
+ EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
+else:
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
+
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
+
+if PLATFORM == 'gcc':
+ PREFIX = 'riscv32-unknown-elf-'
+ CC = PREFIX + 'gcc'
+ CXX = PREFIX + 'g++'
+ AS = PREFIX + 'gcc'
+ AR = PREFIX + 'ar'
+ LINK = PREFIX + 'gcc'
+ GDB = PREFIX + 'gdb'
+ TARGET_EXT = 'elf'
+ SIZE = PREFIX + 'size'
+ OBJDUMP = PREFIX + 'objdump'
+ OBJCPY = PREFIX + 'objcopy'
+ STRIP = PREFIX + 'strip'
+
+ ARCH_ABI = ' -mcmodel=medlow '
+ DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
+ CFLAGS = DEVICE
+ AFLAGS = CFLAGS
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
+
+ CPATH = ''
+ LPATH = ''
+
+ if BUILD == 'ram_debug':
+ CFLAGS += ' -gdwarf-2'
+ AFLAGS += ' -gdwarf-2'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
+ LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
+ elif BUILD == 'ram_release':
+ CFLAGS += ' -O2'
+ LFLAGS += ' -O2'
+ LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
+ elif BUILD == 'flash_debug':
+ CFLAGS += ' -gdwarf-2'
+ AFLAGS += ' -gdwarf-2'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
+ CFLAGS += ' -DFLASH_XIP=1'
+ LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
+ elif BUILD == 'flash_release':
+ CFLAGS += ' -O2'
+ LFLAGS += ' -O2'
+ CFLAGS += ' -DFLASH_XIP=1'
+ LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
+ else:
+ CFLAGS += ' -O2'
+ LFLAGS += ' -O2'
+ LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
+ LFLAGS += ' -T ' + LINKER_FILE
+
+ POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n'
+
+ # module setting
+ CXXFLAGS = CFLAGS + ' -Woverloaded-virtual -fno-exceptions -fno-rtti '
+ CFLAGS = CFLAGS + ' -std=gnu11'
+
+def dist_handle(BSP_ROOT, dist_dir):
+ import sys
+ cwd_path = os.getcwd()
+ sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools'))
+ from sdk_dist import dist_do_building
+ dist_do_building(BSP_ROOT, dist_dir)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/rtconfig_preinc.h b/bsp/hpmicro/hpm5100evk/rtconfig_preinc.h
new file mode 100644
index 000000000000..4de2806b542e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/rtconfig_preinc.h
@@ -0,0 +1,21 @@
+
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+#define D25
+#define HPM5151
+#define HPMSOC_HAS_HPMSDK_DMAV2
+#define HPM_SDK_L1C_NO_REENTRANT 1
+#define HPM_SOC_ISR_NUM 59
+#define RT_HW_ISR_NUM HPM_SOC_ISR_NUM
+#define RT_USING_LIBC
+#define RT_USING_NEWLIBC
+#define USE_DMA_DECLARE_EXT_ISR_M 1
+#define _POSIX_C_SOURCE 1
+#define _REENT_SMALL
+#define __RTTHREAD__
+
+#endif /*RTCONFIG_PREINC_H__*/
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/SConscript b/bsp/hpmicro/hpm5100evk/startup/HPM5151/SConscript
new file mode 100644
index 000000000000..7ade8d38e433
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/SConscript
@@ -0,0 +1,19 @@
+Import('rtconfig')
+from building import *
+
+cwd = GetCurrentDir()
+
+# add the startup files
+
+src = Glob('*.c')
+
+if rtconfig.PLATFORM == 'gcc':
+ src += [os.path.join('toolchains', 'gcc', 'start.S')]
+ src += [os.path.join('toolchains', 'gcc', 'port_gcc.S')]
+
+CPPPATH = [cwd]
+CPPDEFINES=['D25', rtconfig.CHIP_NAME]
+
+group = DefineGroup('Startup', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
+
+Return('group')
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/startup.c b/bsp/hpmicro/hpm5100evk/startup/HPM5151/startup.c
new file mode 100644
index 000000000000..78705526d884
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/startup.c
@@ -0,0 +1,148 @@
+/*
+ * Copyright (c) 2021-2024 HPMicro
+ *
+ *
+ */
+
+#include "hpm_common.h"
+#include "hpm_soc.h"
+#include "hpm_l1c_drv.h"
+#include
+
+void system_init(void);
+
+extern int entry(void);
+
+extern void __libc_init_array(void);
+extern void __libc_fini_array(void);
+
+void system_init(void)
+{
+ disable_global_irq(CSR_MSTATUS_MIE_MASK);
+ disable_irq_from_intc();
+ enable_irq_from_intc();
+ enable_global_irq(CSR_MSTATUS_MIE_MASK);
+#ifndef CONFIG_NOT_ENABLE_ICACHE
+ l1c_ic_enable();
+#endif
+#ifndef CONFIG_NOT_ENABLE_DCACHE
+ l1c_dc_enable();
+#endif
+}
+
+__attribute__((weak)) void c_startup(void)
+{
+#ifndef __SES_RISCV
+ uint32_t i, size;
+#ifdef FLASH_XIP
+ extern uint8_t __vector_ram_start__[], __vector_ram_end__[], __vector_load_addr__[];
+ size = __vector_ram_end__ - __vector_ram_start__;
+ for (i = 0; i < size; i++) {
+ *(__vector_ram_start__ + i) = *(__vector_load_addr__ + i);
+ }
+#endif
+
+ extern uint8_t __etext[];
+ extern uint8_t __bss_start__[], __bss_end__[];
+ extern uint8_t __tbss_start__[], __tbss_end__[];
+ extern uint8_t __tdata_start__[], __tdata_end__[];
+ extern uint8_t __fast_load_addr__[];
+ extern uint8_t __noncacheable_init_load_addr__[];
+ extern uint8_t __data_load_addr__[];
+ extern uint8_t __tdata_load_addr__[];
+ extern uint8_t __data_start__[], __data_end__[];
+ extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
+ extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
+ extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
+
+ /* tbss section */
+ size = __tbss_end__ - __tbss_start__;
+ for (i = 0; i < size; i++) {
+ *(__tbss_start__ + i) = 0;
+ }
+
+ /* bss section */
+ size = __bss_end__ - __bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__bss_start__ + i) = 0;
+ }
+
+ /* noncacheable bss section */
+ size = __noncacheable_bss_end__ - __noncacheable_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__noncacheable_bss_start__ + i) = 0;
+ }
+
+ /* tdata section LMA: etext */
+ size = __tdata_end__ - __tdata_start__;
+ for (i = 0; i < size; i++) {
+ *(__tdata_start__ + i) = *(__tdata_load_addr__ + i);
+ }
+
+ /* data section LMA: etext */
+ size = __data_end__ - __data_start__;
+ for (i = 0; i < size; i++) {
+ *(__data_start__ + i) = *(__data_load_addr__ + i);
+ }
+
+ /* ramfunc section LMA: etext + data length */
+ size = __ramfunc_end__ - __ramfunc_start__;
+ for (i = 0; i < size; i++) {
+ *(__ramfunc_start__ + i) = *(__fast_load_addr__ + i);
+ }
+
+ /* noncacheable init section LMA: etext + data length + ramfunc length */
+ size = __noncacheable_init_end__ - __noncacheable_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
+ }
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
+#endif
+}
+
+__attribute__((weak)) int main(void)
+{
+ while(1);
+}
+
+void reset_handler(void)
+{
+ /**
+ * Disable preemptive interrupt
+ */
+ HPM_PLIC->FEATURE = 0;
+ /*
+ * Initialize LMA/VMA sections.
+ * Relocation for any sections that need to be copied from LMA to VMA.
+ */
+ c_startup();
+
+ /* Call platform specific hardware initialization */
+ system_init();
+
+#ifndef __SES_RISCV
+ /* Do global constructors */
+ __libc_init_array();
+#endif
+
+ /* Entry function */
+ entry();
+}
+
+
+__attribute__((weak)) void _init(void)
+{
+}
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/port_gcc.S b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/port_gcc.S
new file mode 100644
index 000000000000..fa7e7f9c1cd5
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/port_gcc.S
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2021-2023 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+#include "cpuport.h"
+ .section .text.entry, "ax"
+ .globl rt_hw_do_after_save_above
+ .type rt_hw_do_after_save_above,@function
+rt_hw_do_after_save_above:
+ addi sp, sp, -4
+ STORE ra, 0 * REGBYTES(sp)
+
+ csrr t1, mcause
+ andi t1, t1, 0x3FF
+ /* get ISR */
+ la t2, trap_entry
+ jalr t2
+
+ LOAD ra, 0 * REGBYTES(sp)
+ addi sp, sp, 4
+ ret
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/start.S b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/start.S
new file mode 100644
index 000000000000..4774dbd092b0
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/start.S
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2021-2023 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+ #include
+ #include "hpm_csr_regs.h"
+ .section .start, "ax"
+
+ .global _start
+ .type _start,@function
+
+_start:
+ /* Initialize global pointer */
+ .option push
+ .option norelax
+ la gp, __global_pointer$
+ la tp, __thread_pointer
+ .option pop
+
+ /* Initialize stack pointer */
+ la t0, _stack
+ mv sp, t0
+
+#ifdef __nds_execit
+ /* Initialize EXEC.IT table */
+ la t0, _ITB_BASE_
+ csrw uitb, t0
+#endif
+
+#ifdef __riscv_flen
+ /* Enable FPU */
+ li t0, CSR_MSTATUS_FS_MASK
+ csrrs t0, mstatus, t0
+
+ /* Initialize FCSR */
+ fscsr zero
+#endif
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
+ la t0, SW_handler
+ csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
+
+ /* System reset handler */
+ call reset_handler
+
+ /* Infinite loop, if returned accidently */
+1: j 1b
+
+ .weak nmi_handler
+nmi_handler:
+1: j 1b
+
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ .weak default_irq_handler
+ .align 2
+default_irq_handler:
+1: j 1b
+
+ .macro IRQ_HANDLER irq
+ .weak default_isr_\irq
+ .set default_isr_\irq, default_irq_handler
+ .long default_isr_\irq
+ .endm
+
+#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/vectors.S b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/vectors.S
new file mode 100644
index 000000000000..5703e223309e
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/toolchains/gcc/vectors.S
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2021-2023 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+.section .vector_table, "a"
+.global __vector_table
+.align 9
+
+__vector_table:
+ .weak default_isr_trap
+ .set default_isr_trap, SW_handler
+ .long default_isr_trap
+ IRQ_HANDLER 1 /* GPIO0_A IRQ handler */
+ IRQ_HANDLER 2 /* GPIO0_B IRQ handler */
+ IRQ_HANDLER 3 /* GPIO0_C IRQ handler */
+ IRQ_HANDLER 4 /* GPIO0_D IRQ handler */
+ IRQ_HANDLER 5 /* GPIO0_X IRQ handler */
+ IRQ_HANDLER 6 /* GPIO0_Y IRQ handler */
+ IRQ_HANDLER 7 /* GPIO0_Z IRQ handler */
+ IRQ_HANDLER 8 /* GPIO1_A IRQ handler */
+ IRQ_HANDLER 9 /* GPIO1_B IRQ handler */
+ IRQ_HANDLER 10 /* GPIO1_C IRQ handler */
+ IRQ_HANDLER 11 /* GPIO1_D IRQ handler */
+ IRQ_HANDLER 12 /* GPIO1_X IRQ handler */
+ IRQ_HANDLER 13 /* GPIO1_Y IRQ handler */
+ IRQ_HANDLER 14 /* GPIO1_Z IRQ handler */
+ IRQ_HANDLER 15 /* ADC0 IRQ handler */
+ IRQ_HANDLER 16 /* ADC1 IRQ handler */
+ IRQ_HANDLER 17 /* ADC2 IRQ handler */
+ IRQ_HANDLER 18 /* SDFM IRQ handler */
+ IRQ_HANDLER 19 /* DAC0 IRQ handler */
+ IRQ_HANDLER 20 /* DAC1 IRQ handler */
+ IRQ_HANDLER 21 /* ACMP[0] IRQ handler */
+ IRQ_HANDLER 22 /* ACMP[1] IRQ handler */
+ IRQ_HANDLER 23 /* ACMP[2] IRQ handler */
+ IRQ_HANDLER 24 /* ACMP[3] IRQ handler */
+ IRQ_HANDLER 25 /* SPI0 IRQ handler */
+ IRQ_HANDLER 26 /* SPI1 IRQ handler */
+ IRQ_HANDLER 27 /* SPI2 IRQ handler */
+ IRQ_HANDLER 28 /* SPI3 IRQ handler */
+ IRQ_HANDLER 29 /* UART0 IRQ handler */
+ IRQ_HANDLER 30 /* UART1 IRQ handler */
+ IRQ_HANDLER 31 /* UART2 IRQ handler */
+ IRQ_HANDLER 32 /* UART3 IRQ handler */
+ IRQ_HANDLER 33 /* UART4 IRQ handler */
+ IRQ_HANDLER 34 /* UART5 IRQ handler */
+ IRQ_HANDLER 35 /* UART6 IRQ handler */
+ IRQ_HANDLER 36 /* UART7 IRQ handler */
+ IRQ_HANDLER 37 /* CAN0 IRQ handler */
+ IRQ_HANDLER 38 /* CAN1 IRQ handler */
+ IRQ_HANDLER 39 /* CAN2 IRQ handler */
+ IRQ_HANDLER 40 /* CAN3 IRQ handler */
+ IRQ_HANDLER 41 /* PTPC IRQ handler */
+ IRQ_HANDLER 42 /* WDG0 IRQ handler */
+ IRQ_HANDLER 43 /* WDG1 IRQ handler */
+ IRQ_HANDLER 44 /* TSNS IRQ handler */
+ IRQ_HANDLER 45 /* MBX0A IRQ handler */
+ IRQ_HANDLER 46 /* MBX0B IRQ handler */
+ IRQ_HANDLER 47 /* MBX1A IRQ handler */
+ IRQ_HANDLER 48 /* MBX1B IRQ handler */
+ IRQ_HANDLER 49 /* GPTMR0 IRQ handler */
+ IRQ_HANDLER 50 /* GPTMR1 IRQ handler */
+ IRQ_HANDLER 51 /* GPTMR2 IRQ handler */
+ IRQ_HANDLER 52 /* GPTMR3 IRQ handler */
+ IRQ_HANDLER 53 /* I2C0 IRQ handler */
+ IRQ_HANDLER 54 /* I2C1 IRQ handler */
+ IRQ_HANDLER 55 /* I2C2 IRQ handler */
+ IRQ_HANDLER 56 /* I2C3 IRQ handler */
+ IRQ_HANDLER 57 /* PWM0 IRQ handler */
+ IRQ_HANDLER 58 /* HALL0 IRQ handler */
+ IRQ_HANDLER 59 /* QEI0 IRQ handler */
+ IRQ_HANDLER 60 /* PWM1 IRQ handler */
+ IRQ_HANDLER 61 /* HALL1 IRQ handler */
+ IRQ_HANDLER 62 /* QEI1 IRQ handler */
+ IRQ_HANDLER 63 /* PWM2 IRQ handler */
+ IRQ_HANDLER 64 /* HALL2 IRQ handler */
+ IRQ_HANDLER 65 /* QEI2 IRQ handler */
+ IRQ_HANDLER 66 /* PWM3 IRQ handler */
+ IRQ_HANDLER 67 /* HALL3 IRQ handler */
+ IRQ_HANDLER 68 /* QEI3 IRQ handler */
+ IRQ_HANDLER 69 /* SDP IRQ handler */
+ IRQ_HANDLER 70 /* XPI0 IRQ handler */
+ IRQ_HANDLER 71 /* XDMA IRQ handler */
+ IRQ_HANDLER 72 /* HDMA IRQ handler */
+ IRQ_HANDLER 73 /* RNG IRQ handler */
+ IRQ_HANDLER 74 /* USB0 IRQ handler */
+ IRQ_HANDLER 75 /* PSEC IRQ handler */
+ IRQ_HANDLER 76 /* PGPIO IRQ handler */
+ IRQ_HANDLER 77 /* PWDG IRQ handler */
+ IRQ_HANDLER 78 /* PTMR IRQ handler */
+ IRQ_HANDLER 79 /* PUART IRQ handler */
+ IRQ_HANDLER 80 /* FUSE IRQ handler */
+ IRQ_HANDLER 81 /* SECMON IRQ handler */
+ IRQ_HANDLER 82 /* RTC IRQ handler */
+ IRQ_HANDLER 83 /* BUTN IRQ handler */
+ IRQ_HANDLER 84 /* BGPIO IRQ handler */
+ IRQ_HANDLER 85 /* BVIO IRQ handler */
+ IRQ_HANDLER 86 /* BROWNOUT IRQ handler */
+ IRQ_HANDLER 87 /* SYSCTL IRQ handler */
+ IRQ_HANDLER 88 /* DEBUG[0] IRQ handler */
+ IRQ_HANDLER 89 /* DEBUG[1] IRQ handler */
+ IRQ_HANDLER 90 /* LIN0 IRQ handler */
+ IRQ_HANDLER 91 /* LIN1 IRQ handler */
+ IRQ_HANDLER 92 /* LIN2 IRQ handler */
+ IRQ_HANDLER 93 /* LIN3 IRQ handler */
+
diff --git a/bsp/hpmicro/hpm5100evk/startup/HPM5151/trap.c b/bsp/hpmicro/hpm5100evk/startup/HPM5151/trap.c
new file mode 100644
index 000000000000..470b3fe26627
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/HPM5151/trap.c
@@ -0,0 +1,311 @@
+/*
+ * Copyright (c) 2021-2024 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+#include "hpm_common.h"
+#include "hpm_soc.h"
+#include
+#include "rt_hw_stack_frame.h"
+
+#define MCAUSE_INSTR_ADDR_MISALIGNED (0U) //!< Instruction Address misaligned
+#define MCAUSE_INSTR_ACCESS_FAULT (1U) //!< Instruction access fault
+#define MCAUSE_ILLEGAL_INSTR (2U) //!< Illegal instruction
+#define MCAUSE_BREAKPOINT (3U) //!< Breakpoint
+#define MCAUSE_LOAD_ADDR_MISALIGNED (4U) //!< Load address misaligned
+#define MCAUSE_LOAD_ACCESS_FAULT (5U) //!< Load access fault
+#define MCAUSE_STORE_AMO_ADDR_MISALIGNED (6U) //!< Store/AMO address misaligned
+#define MCAUSE_STORE_AMO_ACCESS_FAULT (7U) //!< Store/AMO access fault
+#define MCAUSE_ECALL_FROM_USER_MODE (8U) //!< Environment call from User mode
+#define MCAUSE_ECALL_FROM_SUPERVISOR_MODE (9U) //!< Environment call from Supervisor mode
+#define MCAUSE_ECALL_FROM_MACHINE_MODE (11U) //!< Environment call from machine mode
+#define MCAUSE_INSTR_PAGE_FAULT (12U) //!< Instruction page fault
+#define MCAUSE_LOAD_PAGE_FAULT (13) //!< Load page fault
+#define MCAUSE_STORE_AMO_PAGE_FAULT (15U) //!< Store/AMO page fault
+
+#define IRQ_S_SOFT 1
+#define IRQ_H_SOFT 2
+#define IRQ_M_SOFT 3
+#define IRQ_S_TIMER 5
+#define IRQ_H_TIMER 6
+#define IRQ_M_TIMER 7
+#define IRQ_S_EXT 9
+#define IRQ_H_EXT 10
+#define IRQ_M_EXT 11
+#define IRQ_COP 12
+#define IRQ_HOST 13
+
+#ifdef DEBUG
+#define RT_EXCEPTION_TRACE rt_kprintf
+#else
+#define RT_EXCEPTION_TRACE(...)
+#endif
+
+typedef void (*isr_func_t)(void);
+
+static volatile rt_hw_stack_frame_t *s_stack_frame;
+
+__attribute((weak)) void mchtmr_isr(void)
+{
+}
+
+__attribute__((weak)) void mswi_isr(void)
+{
+}
+
+__attribute__((weak)) void syscall_handler(uint32_t n, uint32_t a0, uint32_t a1, uint32_t a2, uint32_t a3)
+{
+}
+
+void rt_show_stack_frame(void)
+{
+ RT_EXCEPTION_TRACE("Stack frame:\r\n----------------------------------------\r\n");
+ RT_EXCEPTION_TRACE("ra : 0x%08x\r\n", s_stack_frame->ra);
+ RT_EXCEPTION_TRACE("mstatus : 0x%08x\r\n", read_csr(0x300));//mstatus
+ RT_EXCEPTION_TRACE("t0 : 0x%08x\r\n", s_stack_frame->t0);
+ RT_EXCEPTION_TRACE("t1 : 0x%08x\r\n", s_stack_frame->t1);
+ RT_EXCEPTION_TRACE("t2 : 0x%08x\r\n", s_stack_frame->t2);
+ RT_EXCEPTION_TRACE("a0 : 0x%08x\r\n", s_stack_frame->a0);
+ RT_EXCEPTION_TRACE("a1 : 0x%08x\r\n", s_stack_frame->a1);
+ RT_EXCEPTION_TRACE("a2 : 0x%08x\r\n", s_stack_frame->a2);
+ RT_EXCEPTION_TRACE("a3 : 0x%08x\r\n", s_stack_frame->a3);
+ RT_EXCEPTION_TRACE("a4 : 0x%08x\r\n", s_stack_frame->a4);
+ RT_EXCEPTION_TRACE("a5 : 0x%08x\r\n", s_stack_frame->a5);
+#ifndef __riscv_32e
+ RT_EXCEPTION_TRACE("a6 : 0x%08x\r\n", s_stack_frame->a6);
+ RT_EXCEPTION_TRACE("a7 : 0x%08x\r\n", s_stack_frame->a7);
+ RT_EXCEPTION_TRACE("t3 : 0x%08x\r\n", s_stack_frame->t3);
+ RT_EXCEPTION_TRACE("t4 : 0x%08x\r\n", s_stack_frame->t4);
+ RT_EXCEPTION_TRACE("t5 : 0x%08x\r\n", s_stack_frame->t5);
+ RT_EXCEPTION_TRACE("t6 : 0x%08x\r\n", s_stack_frame->t6);
+#endif
+}
+
+uint32_t exception_handler(uint32_t cause, uint32_t epc)
+{
+ /* Unhandled Trap */
+ uint32_t mdcause = read_csr(CSR_MDCAUSE);
+ uint32_t mtval = read_csr(CSR_MTVAL);
+ rt_uint32_t mscratch = read_csr(0x340);
+
+ s_stack_frame = (rt_hw_stack_frame_t *)mscratch;
+ rt_show_stack_frame();
+
+ switch (cause)
+ {
+ case MCAUSE_INSTR_ADDR_MISALIGNED:
+ RT_EXCEPTION_TRACE("exception: instruction address was mis-aligned, mtval=0x%08x\n", mtval);
+ break;
+ case MCAUSE_INSTR_ACCESS_FAULT:
+ RT_EXCEPTION_TRACE("exception: instruction access fault happened, mtval=0x%08x, epc=0x%08x\n", mtval, epc);
+ switch (mdcause & 0x07)
+ {
+ case 1:
+ RT_EXCEPTION_TRACE("mdcause: ECC/Parity error\r\n");
+ break;
+ case 2:
+ RT_EXCEPTION_TRACE("mdcause: PMP instruction access violation \r\n");
+ break;
+ case 3:
+ RT_EXCEPTION_TRACE("mdcause: BUS error\r\n");
+ break;
+ case 4:
+ RT_EXCEPTION_TRACE("mdcause: PMP empty hole access \r\n");
+ break;
+ default:
+ RT_EXCEPTION_TRACE("mdcause: reserved \r\n");
+ break;
+ }
+ break;
+ case MCAUSE_ILLEGAL_INSTR:
+ RT_EXCEPTION_TRACE("exception: illegal instruction was met, mtval=0x%08x\n", mtval);
+ switch (mdcause & 0x07)
+ {
+ case 0:
+ RT_EXCEPTION_TRACE("mdcause: the actual faulting instruction is stored in the mtval CSR\r\n");
+ break;
+ case 1:
+ RT_EXCEPTION_TRACE("mdcause: FP disabled exception \r\n");
+ break;
+ case 2:
+ RT_EXCEPTION_TRACE("mdcause: ACE disabled exception \r\n");
+ break;
+ default:
+ RT_EXCEPTION_TRACE("mdcause: reserved \r\n");
+ break;
+ }
+ break;
+ case MCAUSE_BREAKPOINT:
+ RT_EXCEPTION_TRACE("exception: breakpoint was hit, mtval=0x%08x\n", mtval);
+ break;
+ case MCAUSE_LOAD_ADDR_MISALIGNED:
+ RT_EXCEPTION_TRACE("exception: load address was mis-aligned, mtval=0x%08x\n", mtval);
+ break;
+ case MCAUSE_LOAD_ACCESS_FAULT:
+ RT_EXCEPTION_TRACE("exception: load access fault happened, epc=%08x, mdcause=0x%x\n", epc, mdcause);
+ switch (mdcause & 0x07)
+ {
+ case 1:
+ RT_EXCEPTION_TRACE("mdcause: ECC/Parity error\r\n");
+ break;
+ case 2:
+ RT_EXCEPTION_TRACE("mdcause: PMP instruction access violation \r\n");
+ break;
+ case 3:
+ RT_EXCEPTION_TRACE("mdcause: BUS error\r\n");
+ break;
+ case 4:
+ RT_EXCEPTION_TRACE("mdcause: Misaligned access \r\n");
+ break;
+ case 5:
+ RT_EXCEPTION_TRACE("mdcause: PMP empty hole access \r\n");
+ break;
+ case 6:
+ RT_EXCEPTION_TRACE("mdcause: PMA attribute inconsistency\r\n");
+ break;
+ default:
+ RT_EXCEPTION_TRACE("mdcause: reserved \r\n");
+ break;
+ }
+ break;
+ case MCAUSE_STORE_AMO_ADDR_MISALIGNED:
+ RT_EXCEPTION_TRACE("exception: store amo address was misaligned, epc=%08x\n", epc);
+ break;
+ case MCAUSE_STORE_AMO_ACCESS_FAULT:
+ RT_EXCEPTION_TRACE("exception: store amo access fault happened, epc=%08x\n", epc);
+ switch (mdcause & 0x07)
+ {
+ case 1:
+ RT_EXCEPTION_TRACE("mdcause: ECC/Parity error\r\n");
+ break;
+ case 2:
+ RT_EXCEPTION_TRACE("mdcause: PMP instruction access violation \r\n");
+ break;
+ case 3:
+ RT_EXCEPTION_TRACE("mdcause: BUS error\r\n");
+ break;
+ case 4:
+ RT_EXCEPTION_TRACE("mdcause: Misaligned access \r\n");
+ break;
+ case 5:
+ RT_EXCEPTION_TRACE("mdcause: PMP empty hole access \r\n");
+ break;
+ case 6:
+ RT_EXCEPTION_TRACE("mdcause: PMA attribute inconsistency\r\n");
+ break;
+ case 7:
+ RT_EXCEPTION_TRACE("mdcause: PMA NAMO exception \r\n");
+ default:
+ RT_EXCEPTION_TRACE("mdcause: reserved \r\n");
+ break;
+ }
+ break;
+ default:
+ RT_EXCEPTION_TRACE("Unknown exception happened, cause=%d\n", cause);
+ break;
+ }
+
+ rt_kprintf("cause=0x%08x, epc=0x%08x, ra=0x%08x\n", cause, epc, s_stack_frame->ra);
+ while(1) {
+ }
+}
+
+void trap_entry(void);
+
+void trap_entry(void)
+{
+ uint32_t mcause = read_csr(CSR_MCAUSE);
+ uint32_t mepc = read_csr(CSR_MEPC);
+ uint32_t mstatus = read_csr(CSR_MSTATUS);
+
+#if SUPPORT_PFT_ARCH
+ uint32_t mxstatus = read_csr(CSR_MXSTATUS);
+#endif
+#ifdef __riscv_dsp
+ int ucode = read_csr(CSR_UCODE);
+#endif
+#ifdef __riscv_flen
+ int fcsr = read_fcsr();
+#endif
+
+ /* clobbers list for ecall */
+#ifdef __riscv_32e
+ __asm volatile("" : : :"t0", "a0", "a1", "a2", "a3");
+#else
+ __asm volatile("" : : :"a7", "a0", "a1", "a2", "a3");
+#endif
+
+ /* Do your trap handling */
+ uint32_t cause_type = mcause & CSR_MCAUSE_EXCEPTION_CODE_MASK;
+ uint32_t irq_index;
+ if (mcause & CSR_MCAUSE_INTERRUPT_MASK)
+ {
+ switch (cause_type)
+ {
+ /* Machine timer interrupt */
+ case IRQ_M_TIMER:
+ mchtmr_isr();
+ break;
+ /* Machine EXT interrupt */
+ case IRQ_M_EXT:
+ /* Claim interrupt */
+ irq_index = __plic_claim_irq(HPM_PLIC_BASE, HPM_PLIC_TARGET_M_MODE);
+ /* Execute EXT interrupt handler */
+ if (irq_index > 0)
+ {
+ ((isr_func_t) __vector_table[irq_index])();
+ /* Complete interrupt */
+ __plic_complete_irq(HPM_PLIC_BASE, HPM_PLIC_TARGET_M_MODE, irq_index);
+ }
+ break;
+ /* Machine SWI interrupt */
+ case IRQ_M_SOFT:
+ mswi_isr();
+ intc_m_complete_swi();
+ break;
+ }
+ }
+ else if (cause_type == MCAUSE_ECALL_FROM_MACHINE_MODE)
+ {
+ /* Machine Syscal call */
+ __asm volatile(
+ "mv a4, a3\n"
+ "mv a3, a2\n"
+ "mv a2, a1\n"
+ "mv a1, a0\n"
+#ifdef __riscv_32e
+ "mv a0, t0\n"
+#else
+ "mv a0, a7\n"
+#endif
+ "call syscall_handler\n"
+ : : : "a4"
+ );
+ mepc += 4;
+ }
+ else
+ {
+ mepc = exception_handler(mcause, mepc);
+ }
+
+ /* Restore CSR */
+ write_csr(CSR_MSTATUS, mstatus);
+ write_csr(CSR_MEPC, mepc);
+#if SUPPORT_PFT_ARCH
+ write_csr(CSR_MXSTATUS, mxstatus);
+#endif
+#ifdef __riscv_dsp
+ write_csr(CSR_UCODE, ucode);
+#endif
+#ifdef __riscv_flen
+ write_fcsr(fcsr);
+#endif
+}
+
+/**
+ * Trap Handler
+ */
+rt_weak void handle_trap(rt_uint32_t mcause, rt_uint32_t mepc, rt_uint32_t sp)
+{
+}
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5100evk/startup/SConscript b/bsp/hpmicro/hpm5100evk/startup/SConscript
new file mode 100644
index 000000000000..11a9d203d4ce
--- /dev/null
+++ b/bsp/hpmicro/hpm5100evk/startup/SConscript
@@ -0,0 +1,12 @@
+# for module compiling
+import os
+Import('rtconfig')
+Import('RTT_ROOT')
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+
+objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
+
+Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5300evk/.config b/bsp/hpmicro/hpm5300evk/.config
index da0ebf1b1f24..81fe5184e513 100644
--- a/bsp/hpmicro/hpm5300evk/.config
+++ b/bsp/hpmicro/hpm5300evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -177,7 +187,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -236,11 +246,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -261,10 +271,10 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -457,6 +467,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -572,6 +583,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -631,6 +643,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -779,6 +793,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -812,7 +828,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -891,11 +921,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -904,6 +941,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -983,6 +1037,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1037,6 +1092,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1087,6 +1143,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1104,6 +1161,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1161,6 +1221,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1186,6 +1248,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1425,12 +1488,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM5300_SERIES=y
+CONFIG_SOC_SERIES_HPM5300=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM5300=y
+CONFIG_SOC_HPM5000=y
#
# On-chip Peripheral Drivers
@@ -1442,12 +1505,14 @@ CONFIG_BSP_USING_UART0=y
CONFIG_BSP_UART0_RX_BUFSIZE=128
CONFIG_BSP_UART0_TX_BUFSIZE=0
CONFIG_BSP_UART0_IRQ_PRIORITY=1
+# CONFIG_BSP_USING_UART1 is not set
# CONFIG_BSP_USING_UART2 is not set
# CONFIG_BSP_USING_UART3 is not set
# CONFIG_BSP_USING_UART4 is not set
# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_GPTMR is not set
# CONFIG_BSP_USING_I2C is not set
@@ -1457,5 +1522,60 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_EWDG is not set
# CONFIG_BSP_USING_MCAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_OPAMP is not set
+# CONFIG_BSP_USING_DAC is not set
+# CONFIG_BSP_USING_QEIV2 is not set
+# CONFIG_BSP_USING_QEO is not set
+# CONFIG_BSP_USING_RDC is not set
+# CONFIG_BSP_USING_SEI is not set
+# CONFIG_BSP_USING_PLB is not set
+# CONFIG_BSP_USING_MMC is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm5300evk/README.md b/bsp/hpmicro/hpm5300evk/README.md
index 4e6ad210a662..b51709900c92 100644
--- a/bsp/hpmicro/hpm5300evk/README.md
+++ b/bsp/hpmicro/hpm5300evk/README.md
@@ -71,7 +71,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -79,7 +79,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5300evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5300evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm5300evk/README_zh.md b/bsp/hpmicro/hpm5300evk/README_zh.md
index 2da65d7f9d75..29d4fb396ecf 100644
--- a/bsp/hpmicro/hpm5300evk/README_zh.md
+++ b/bsp/hpmicro/hpm5300evk/README_zh.md
@@ -71,14 +71,14 @@
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\probes\ft2232.cfg -f board\debug_scripts\soc\hpm5300.cfg -f board\debug_scripts\boards\hpm5300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\probes\ft2232.cfg -f board\debug_scripts\soc\hpm5300.cfg -f board\debug_scripts\boards\hpm5300evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5300evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm5300evk/SConscript b/bsp/hpmicro/hpm5300evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm5300evk/SConscript
+++ b/bsp/hpmicro/hpm5300evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm5300evk/SConstruct b/bsp/hpmicro/hpm5300evk/SConstruct
index 601a33ec9183..de5155656d6b 100644
--- a/bsp/hpmicro/hpm5300evk/SConstruct
+++ b/bsp/hpmicro/hpm5300evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -76,6 +76,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm5300evk/applications/SConscript b/bsp/hpmicro/hpm5300evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm5300evk/applications/SConscript
+++ b/bsp/hpmicro/hpm5300evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm5300evk/applications/main.c b/bsp/hpmicro/hpm5300evk/applications/main.c
index 0bbf6370382c..98ea3be7a378 100644
--- a/bsp/hpmicro/hpm5300evk/applications/main.c
+++ b/bsp/hpmicro/hpm5300evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
{
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm5300evk/board/Kconfig b/bsp/hpmicro/hpm5300evk/board/Kconfig
index ba0d903c261c..5763d1a2b4ba 100644
--- a/bsp/hpmicro/hpm5300evk/board/Kconfig
+++ b/bsp/hpmicro/hpm5300evk/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM5300
+config SOC_HPM5000
bool
- select SOC_HPM5300_SERIES
+ select SOC_SERIES_HPM5300
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -51,6 +51,43 @@ menu "On-chip Peripheral Drivers"
int "UART0 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART0_DMA_PINGPONG_BUFSIZE
+ int "Set UART0 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART1
+ bool "Enable UART1"
+ default y
+ if BSP_USING_UART1
+ config BSP_UART1_RX_USING_DMA
+ bool "Enable UART1 RX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_TX_USING_DMA
+ bool "Enable UART1 TX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_RX_BUFSIZE
+ int "Set UART1 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_UART1_TX_BUFSIZE
+ int "Set UART1 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART1_IRQ_PRIORITY
+ int "UART1 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -78,6 +115,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -105,6 +147,11 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART4
bool "Enable UART4"
@@ -132,6 +179,11 @@ menu "On-chip Peripheral Drivers"
int "UART4 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
@@ -159,6 +211,11 @@ menu "On-chip Peripheral Drivers"
int "UART5 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -186,6 +243,11 @@ menu "On-chip Peripheral Drivers"
int "UART6 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART7
bool "Enable UART7"
@@ -209,6 +271,30 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
@@ -228,7 +314,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -236,7 +322,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -258,7 +344,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -266,7 +352,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -288,7 +374,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -296,7 +382,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -318,7 +404,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -326,7 +412,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -381,6 +467,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -446,7 +541,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWM
+ select RT_USING_PWM
menuconfig BSP_USING_USB
bool "Enable USB"
@@ -521,7 +616,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -535,5 +630,338 @@ menu "On-chip Peripheral Drivers"
default n
endif
endif
+
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_OPAMP
+ bool "Enable OPAMP (Operational Amplifier)"
+ default n
+
+ menuconfig BSP_USING_DAC
+ bool "Enable DAC"
+ default n
+
+ menuconfig BSP_USING_QEIV2
+ bool "Enable QEIV2 (Quadrature Encoder Interface V2)"
+ default n
+
+ menuconfig BSP_USING_QEO
+ bool "Enable QEO (Quadrature Encoder Output)"
+ default n
+
+ menuconfig BSP_USING_RDC
+ bool "Enable RDC (Resolver to Digital Converter)"
+ default n
+
+ menuconfig BSP_USING_SEI
+ bool "Enable SEI (Synchronous Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PLB
+ bool "Enable PLB"
+ default n
+
+ menuconfig BSP_USING_MMC
+ bool "Enable MMC (Motor Control Module)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Maichine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
endmenu
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/boards/hpm5300evk.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/boards/hpm5300evk.cfg
similarity index 78%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/boards/hpm5300evk.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/boards/hpm5300evk.cfg
index 7d495f5b380c..7bb2e8c77344 100644
--- a/bsp/hpmicro/hpm5300evk/board/debug_scripts/boards/hpm5300evk.cfg
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/boards/hpm5300evk.cfg
@@ -46,27 +46,15 @@
# - flash ctrl index: 0xF3000000
# - base address: 0x80000000
# - flash size: 0x2000000
-# - flash option0: 0x7
-flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x6 0x1000
+# - flash option0: 0x5
+# - flash option1: 0x1000
+flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x5 0x1000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/cmsis_dap.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
similarity index 100%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/cmsis_dap.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/ft2232.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/ft2232.cfg
similarity index 100%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/ft2232.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/ft2232.cfg
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/ft232.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/ft232.cfg
similarity index 100%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/ft232.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/ft232.cfg
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/jlink.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/jlink.cfg
similarity index 100%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/jlink.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/jlink.cfg
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/nds_aice_micro.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
similarity index 100%
rename from bsp/hpmicro/hpm5300evk/board/debug_scripts/probes/nds_aice_micro.cfg
rename to bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm5300.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm5300.cfg
new file mode 100644
index 000000000000..935b5e87dd7e
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm5300.cfg
@@ -0,0 +1,24 @@
+# Copyright (c) 2023,2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm5361
+}
+set _CPUTAPID 0x1000563D
+jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
+
+set _TARGET0 $_CHIP.cpu0
+target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
+
+$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
+
+targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr_lite.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF410001C 24000000
+}
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/flash_rtt.ld
index 12af13362ed3..6591432556e5 100644
--- a/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -14,7 +14,7 @@ MEMORY
{
XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
ILM (wx) : ORIGIN = 0x00000000, LENGTH = 128K
- DLM (w) : ORIGIN = 0x00080300, LENGTH = 128K - 768
+ DLM (w) : ORIGIN = 0x00080000, LENGTH = 128K
AHB_SRAM (w) : ORIGIN = 0xf0400000, LENGTH = 32K
}
@@ -26,6 +26,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -165,11 +174,19 @@ SECTIONS
PROVIDE (_etext = .);
PROVIDE (etext = .);
+ /* The first 0x300 bytes of DLM are reserved; keep them as an explicit NOLOAD
+ * placeholder. This also keeps the DLM region 4KB aligned so that the linker does
+ * not emit an extra file-backed PT_LOAD (which made "program rtthread.elf" fail).
+ */
+ .dlm_reserved (NOLOAD) : {
+ . = . + 0x300;
+ } > DLM
+
.fast_ram (NOLOAD) : {
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -179,6 +196,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
/* Note: the .tbss and .tdata section should be adjacent */
.tbss(NOLOAD) : {
. = ALIGN(8);
@@ -256,7 +282,7 @@ SECTIONS
PROVIDE (edata = .);
} > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -295,7 +321,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > DLM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/ram_rtt.ld
index 26d57856025f..6753ecbafdb2 100644
--- a/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm5300evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -112,6 +112,16 @@ SECTIONS
. = ALIGN(8);
} > ILM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > ILM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -213,7 +223,7 @@ SECTIONS
*(.fast)
. = ALIGN(8);
PROVIDE(__ramfunc_end__ = .);
- } > DLM
+ } > ILM
__noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
diff --git a/bsp/hpmicro/hpm5300evk/board/pinmux.c b/bsp/hpmicro/hpm5300evk/board/pinmux.c
index 268926772e92..f4e655a73254 100644
--- a/bsp/hpmicro/hpm5300evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm5300evk/board/pinmux.c
@@ -66,7 +66,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PB02].FUNC_CTL = IOC_PB02_FUNC_CTL_I2C0_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
@@ -79,8 +79,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PB06].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
HPM_IOC->PAD[IOC_PAD_PB07].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
} else {
- ;
+ return status_invalid_argument;
}
+ return status_success;
}
void init_gpio_pins(void)
diff --git a/bsp/hpmicro/hpm5300evk/board/pinmux.h b/bsp/hpmicro/hpm5300evk/board/pinmux.h
index 738593a2b649..aaa5b391cf6b 100644
--- a/bsp/hpmicro/hpm5300evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm5300evk/board/pinmux.h
@@ -14,7 +14,7 @@ extern "C" {
void init_py_pins_as_pgpio(void);
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_gpio_pins(void);
void init_spi_pins(SPI_Type *ptr);
void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
diff --git a/bsp/hpmicro/hpm5300evk/board/rtt_board.c b/bsp/hpmicro/hpm5300evk/board/rtt_board.c
index e5b5d95897ec..d4cd474e10a1 100644
--- a/bsp/hpmicro/hpm5300evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm5300evk/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm5300evk/makefile.targets b/bsp/hpmicro/hpm5300evk/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm5300evk/rtconfig.h b/bsp/hpmicro/hpm5300evk/rtconfig.h
index 1793c387c0cf..b75bcbad96a9 100644
--- a/bsp/hpmicro/hpm5300evk/rtconfig.h
+++ b/bsp/hpmicro/hpm5300evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -102,7 +112,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -288,6 +298,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -315,12 +329,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -400,11 +426,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM5300_SERIES
+#define SOC_SERIES_HPM5300
/* Hardware Drivers Config */
-#define SOC_HPM5300
+#define SOC_HPM5000
/* On-chip Peripheral Drivers */
@@ -416,6 +442,29 @@
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm5300evk/rtconfig.py b/bsp/hpmicro/hpm5300evk/rtconfig.py
index ab7d843770fc..1ea9e310de11 100644
--- a/bsp/hpmicro/hpm5300evk/rtconfig.py
+++ b/bsp/hpmicro/hpm5300evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
@@ -60,9 +59,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -82,7 +85,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -90,8 +93,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -100,8 +103,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm5300evk/rtconfig_preinc.h b/bsp/hpmicro/hpm5300evk/rtconfig_preinc.h
new file mode 100644
index 000000000000..85109511cd3f
--- /dev/null
+++ b/bsp/hpmicro/hpm5300evk/rtconfig_preinc.h
@@ -0,0 +1,20 @@
+
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+#define D25
+#define HPM5361
+#define HPMSOC_HAS_HPMSDK_DMAV2
+#define HPM_SDK_L1C_NO_REENTRANT 1
+#define HPM_SOC_ISR_NUM 73
+#define RT_USING_LIBC
+#define RT_USING_NEWLIBC
+#define USE_DMA_DECLARE_EXT_ISR_M 1
+#define _POSIX_C_SOURCE 1
+#define _REENT_SMALL
+#define __RTTHREAD__
+
+#endif /*RTCONFIG_PREINC_H__*/
diff --git a/bsp/hpmicro/hpm5300evk/startup/HPM5361/startup.c b/bsp/hpmicro/hpm5300evk/startup/HPM5361/startup.c
index 36ec0334321b..96699f5bfd52 100644
--- a/bsp/hpmicro/hpm5300evk/startup/HPM5361/startup.c
+++ b/bsp/hpmicro/hpm5300evk/startup/HPM5361/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm5300evk/startup/HPM5361/toolchains/gcc/start.S b/bsp/hpmicro/hpm5300evk/startup/HPM5361/toolchains/gcc/start.S
index 2ba3169ea4c0..4774dbd092b0 100644
--- a/bsp/hpmicro/hpm5300evk/startup/HPM5361/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm5300evk/startup/HPM5361/toolchains/gcc/start.S
@@ -19,14 +19,6 @@ _start:
la tp, __thread_pointer
.option pop
-#ifdef __riscv_flen
- /* Enable FPU */
- li t0, CSR_MSTATUS_FS_MASK
- csrrs t0, mstatus, t0
-
- /* Initialize FCSR */
- fscsr zero
-#endif
/* Initialize stack pointer */
la t0, _stack
mv sp, t0
@@ -45,12 +37,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
-
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
call reset_handler
@@ -62,6 +62,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -74,3 +75,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm5300evk/startup/SConscript b/bsp/hpmicro/hpm5300evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm5300evk/startup/SConscript
+++ b/bsp/hpmicro/hpm5300evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5301evklite/.config b/bsp/hpmicro/hpm5301evklite/.config
index 19cd38cfbcda..c028e0baa6ef 100644
--- a/bsp/hpmicro/hpm5301evklite/.config
+++ b/bsp/hpmicro/hpm5301evklite/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -262,10 +272,10 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -458,6 +468,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -573,6 +584,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -632,6 +644,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -780,6 +794,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -813,7 +829,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -892,11 +922,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -905,6 +942,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -984,6 +1038,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1038,6 +1093,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1088,6 +1144,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1105,6 +1162,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1162,6 +1222,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1187,6 +1249,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1426,12 +1489,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM5300_SERIES=y
+CONFIG_SOC_SERIES_HPM5300=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM5300=y
+CONFIG_SOC_HPM5000=y
#
# On-chip Peripheral Drivers
@@ -1446,6 +1509,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART1 is not set
# CONFIG_BSP_USING_UART2 is not set
# CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_GPTMR is not set
# CONFIG_BSP_USING_I2C is not set
@@ -1453,5 +1517,49 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_USB is not set
# CONFIG_BSP_USING_EWDG is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm5301evklite/README.md b/bsp/hpmicro/hpm5301evklite/README.md
index ba4ad0b50fbd..f1deec4a81af 100644
--- a/bsp/hpmicro/hpm5301evklite/README.md
+++ b/bsp/hpmicro/hpm5301evklite/README.md
@@ -70,7 +70,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5301evklite.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5301evklite.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -78,7 +78,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5301evklite.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5301evklite.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm5301evklite/README_zh.md b/bsp/hpmicro/hpm5301evklite/README_zh.md
index 905d16490811..a32ce56e57a5 100644
--- a/bsp/hpmicro/hpm5301evklite/README_zh.md
+++ b/bsp/hpmicro/hpm5301evklite/README_zh.md
@@ -70,14 +70,14 @@
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5301evklite.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5301evklite.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm5300.cfg -f boards\debug_scripts\boards\hpm5301evklite.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm5300.cfg -f board\debug_scripts\openocd\boards\hpm5301evklite.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm5301evklite/SConscript b/bsp/hpmicro/hpm5301evklite/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm5301evklite/SConscript
+++ b/bsp/hpmicro/hpm5301evklite/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm5301evklite/SConstruct b/bsp/hpmicro/hpm5301evklite/SConstruct
index d41dbd7584a1..69d7c1ccf70d 100644
--- a/bsp/hpmicro/hpm5301evklite/SConstruct
+++ b/bsp/hpmicro/hpm5301evklite/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -78,6 +78,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm5301evklite/applications/SConscript b/bsp/hpmicro/hpm5301evklite/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm5301evklite/applications/SConscript
+++ b/bsp/hpmicro/hpm5301evklite/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm5301evklite/applications/main.c b/bsp/hpmicro/hpm5301evklite/applications/main.c
index 0bbf6370382c..98ea3be7a378 100644
--- a/bsp/hpmicro/hpm5301evklite/applications/main.c
+++ b/bsp/hpmicro/hpm5301evklite/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
{
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm5301evklite/board/Kconfig b/bsp/hpmicro/hpm5301evklite/board/Kconfig
index b900b8e34e2b..77dec23981a6 100644
--- a/bsp/hpmicro/hpm5301evklite/board/Kconfig
+++ b/bsp/hpmicro/hpm5301evklite/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM5300
+config SOC_HPM5000
bool
- select SOC_HPM5300_SERIES
+ select SOC_SERIES_HPM5300
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -78,6 +78,11 @@ menu "On-chip Peripheral Drivers"
int "UART1 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -105,6 +110,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -132,6 +142,30 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
@@ -151,7 +185,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -159,7 +193,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -181,7 +215,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -189,7 +223,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -211,7 +245,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -219,7 +253,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -241,7 +275,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -249,7 +283,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -262,7 +296,6 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
menuconfig BSP_USING_GPTMR
bool "Enable GPTMR"
default n
@@ -270,6 +303,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -304,6 +338,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -396,7 +439,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -407,6 +450,294 @@ menu "On-chip Peripheral Drivers"
default y
endif
endif
+
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm5301evklite/board/SConscript b/bsp/hpmicro/hpm5301evklite/board/SConscript
index dcd1e3543fd7..31b197126b7d 100644
--- a/bsp/hpmicro/hpm5301evklite/board/SConscript
+++ b/bsp/hpmicro/hpm5301evklite/board/SConscript
@@ -11,7 +11,7 @@ src = Split("""
""")
CPPPATH = [cwd]
-CPPDEFINES=['D25', 'HPM5361']
+CPPDEFINES=['D25', 'HPM5301']
group = DefineGroup('Board', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/boards/hpm5301evklite.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/boards/hpm5301evklite.cfg
index 7d495f5b380c..fbe2379e96ff 100644
--- a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/boards/hpm5301evklite.cfg
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/boards/hpm5301evklite.cfg
@@ -16,7 +16,7 @@
# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
# 0 - Not needed
-# 1 - QE bit is at bit 6 in Status Register 1
+# 1 - QE bit is at bit6 in Status Register 1
# 2 - QE bit is at bit1 in Status Register 2
# 3 - QE bit is at bit7 in Status Register 2
# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
@@ -46,27 +46,15 @@
# - flash ctrl index: 0xF3000000
# - base address: 0x80000000
# - flash size: 0x2000000
-# - flash option0: 0x7
-flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x6 0x1000
+# - flash option0: 0x5
+# - flash option1: 0x1000
+flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x5 0x1000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm5300.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm5300.cfg
index c57a36d0174d..935b5e87dd7e 100644
--- a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm5300.cfg
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm5300.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2023,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm5301
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm5361
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr_lite.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF410001C 24000000
+}
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/flash_rtt.ld
index 12af13362ed3..6591432556e5 100644
--- a/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/flash_rtt.ld
@@ -14,7 +14,7 @@ MEMORY
{
XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
ILM (wx) : ORIGIN = 0x00000000, LENGTH = 128K
- DLM (w) : ORIGIN = 0x00080300, LENGTH = 128K - 768
+ DLM (w) : ORIGIN = 0x00080000, LENGTH = 128K
AHB_SRAM (w) : ORIGIN = 0xf0400000, LENGTH = 32K
}
@@ -26,6 +26,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -165,11 +174,19 @@ SECTIONS
PROVIDE (_etext = .);
PROVIDE (etext = .);
+ /* The first 0x300 bytes of DLM are reserved; keep them as an explicit NOLOAD
+ * placeholder. This also keeps the DLM region 4KB aligned so that the linker does
+ * not emit an extra file-backed PT_LOAD (which made "program rtthread.elf" fail).
+ */
+ .dlm_reserved (NOLOAD) : {
+ . = . + 0x300;
+ } > DLM
+
.fast_ram (NOLOAD) : {
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -179,6 +196,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
/* Note: the .tbss and .tdata section should be adjacent */
.tbss(NOLOAD) : {
. = ALIGN(8);
@@ -256,7 +282,7 @@ SECTIONS
PROVIDE (edata = .);
} > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -295,7 +321,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > DLM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/ram_rtt.ld
index 26d57856025f..6753ecbafdb2 100644
--- a/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm5301evklite/board/linker_scripts/gcc/ram_rtt.ld
@@ -112,6 +112,16 @@ SECTIONS
. = ALIGN(8);
} > ILM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > ILM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -213,7 +223,7 @@ SECTIONS
*(.fast)
. = ALIGN(8);
PROVIDE(__ramfunc_end__ = .);
- } > DLM
+ } > ILM
__noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
diff --git a/bsp/hpmicro/hpm5301evklite/board/pinmux.c b/bsp/hpmicro/hpm5301evklite/board/pinmux.c
index 439a57dd452e..596b052e2a2e 100644
--- a/bsp/hpmicro/hpm5301evklite/board/pinmux.c
+++ b/bsp/hpmicro/hpm5301evklite/board/pinmux.c
@@ -53,7 +53,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C2) {
HPM_IOC->PAD[IOC_PAD_PB08].FUNC_CTL = IOC_PB08_FUNC_CTL_I2C2_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
@@ -65,7 +65,10 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PB12].FUNC_CTL = IOC_PB12_FUNC_CTL_I2C3_SDA | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
HPM_IOC->PAD[IOC_PAD_PB13].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
HPM_IOC->PAD[IOC_PAD_PB12].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
+ } else {
+ return status_invalid_argument;
}
+ return status_success;
}
void init_gpio_pins(void)
diff --git a/bsp/hpmicro/hpm5301evklite/board/pinmux.h b/bsp/hpmicro/hpm5301evklite/board/pinmux.h
index 3e37d1bf1bcf..f78644611756 100644
--- a/bsp/hpmicro/hpm5301evklite/board/pinmux.h
+++ b/bsp/hpmicro/hpm5301evklite/board/pinmux.h
@@ -14,7 +14,7 @@ extern "C" {
void init_py_pins_as_pgpio(void);
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_gpio_pins(void);
void init_spi_pins(SPI_Type *ptr);
void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
diff --git a/bsp/hpmicro/hpm5301evklite/board/rtt_board.c b/bsp/hpmicro/hpm5301evklite/board/rtt_board.c
index 3c1ef45f2b59..ac7edf6d44e2 100644
--- a/bsp/hpmicro/hpm5301evklite/board/rtt_board.c
+++ b/bsp/hpmicro/hpm5301evklite/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm5301evklite/makefile.targets b/bsp/hpmicro/hpm5301evklite/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm5301evklite/rtconfig.h b/bsp/hpmicro/hpm5301evklite/rtconfig.h
index a2b1da3c1637..77da4e4121b5 100644
--- a/bsp/hpmicro/hpm5301evklite/rtconfig.h
+++ b/bsp/hpmicro/hpm5301evklite/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,7 +114,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -290,6 +300,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -317,12 +331,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -402,11 +428,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM5300_SERIES
+#define SOC_SERIES_HPM5300
/* Hardware Drivers Config */
-#define SOC_HPM5300
+#define SOC_HPM5000
/* On-chip Peripheral Drivers */
@@ -418,6 +444,29 @@
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm5301evklite/rtconfig.py b/bsp/hpmicro/hpm5301evklite/rtconfig.py
index dc209cee21f5..b7720eadf3ee 100644
--- a/bsp/hpmicro/hpm5301evklite/rtconfig.py
+++ b/bsp/hpmicro/hpm5301evklite/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm5301evklite/rtconfig_preinc.h b/bsp/hpmicro/hpm5301evklite/rtconfig_preinc.h
new file mode 100644
index 000000000000..f2f33d8ed185
--- /dev/null
+++ b/bsp/hpmicro/hpm5301evklite/rtconfig_preinc.h
@@ -0,0 +1,20 @@
+
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+#define D25
+#define HPM5301
+#define HPMSOC_HAS_HPMSDK_DMAV2
+#define HPM_SDK_L1C_NO_REENTRANT 1
+#define HPM_SOC_ISR_NUM 73
+#define RT_USING_LIBC
+#define RT_USING_NEWLIBC
+#define USE_DMA_DECLARE_EXT_ISR_M 1
+#define _POSIX_C_SOURCE 1
+#define _REENT_SMALL
+#define __RTTHREAD__
+
+#endif /*RTCONFIG_PREINC_H__*/
diff --git a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/SConscript b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/SConscript
index 3e8dd931d383..406b1414099a 100644
--- a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/SConscript
+++ b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/SConscript
@@ -15,7 +15,7 @@ if rtconfig.PLATFORM == 'gcc':
src += [os.path.join('toolchains', 'gcc', 'port_gcc.S')]
CPPPATH = [cwd]
-CPPDEFINES=['D45', rtconfig.CHIP_NAME]
+CPPDEFINES=['D25', rtconfig.CHIP_NAME]
group = DefineGroup('Startup', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES)
diff --git a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/startup.c b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/startup.c
index 36ec0334321b..96699f5bfd52 100644
--- a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/startup.c
+++ b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/start.S b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/start.S
index 76463936442f..d4e7a4fd61b4 100644
--- a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/start.S
@@ -19,14 +19,6 @@ _start:
la tp, __thread_pointer
.option pop
-#ifdef __riscv_flen
- /* Enable FPU */
- li t0, CSR_MSTATUS_FS_MASK
- csrrs t0, mstatus, t0
-
- /* Initialize FCSR */
- fscsr zero
-#endif
/* Initialize stack pointer */
la t0, _stack
mv sp, t0
@@ -45,12 +37,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
-
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
call reset_handler
@@ -62,7 +62,7 @@ _start:
nmi_handler:
1: j 1b
- .global default_irq_handler
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -75,3 +75,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/vectors.S b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/vectors.S
index 8f10ab7bddf3..5703e223309e 100644
--- a/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/vectors.S
+++ b/bsp/hpmicro/hpm5301evklite/startup/HPM5301/toolchains/gcc/vectors.S
@@ -20,74 +20,90 @@ __vector_table:
IRQ_HANDLER 5 /* GPIO0_X IRQ handler */
IRQ_HANDLER 6 /* GPIO0_Y IRQ handler */
IRQ_HANDLER 7 /* GPIO0_Z IRQ handler */
- IRQ_HANDLER 8 /* ADC0 IRQ handler */
- IRQ_HANDLER 9 /* ADC1 IRQ handler */
- IRQ_HANDLER 10 /* ADC2 IRQ handler */
- IRQ_HANDLER 11 /* DAC IRQ handler */
- IRQ_HANDLER 12 /* ACMP[0] IRQ handler */
- IRQ_HANDLER 13 /* ACMP[1] IRQ handler */
- IRQ_HANDLER 14 /* SPI0 IRQ handler */
- IRQ_HANDLER 15 /* SPI1 IRQ handler */
- IRQ_HANDLER 16 /* SPI2 IRQ handler */
- IRQ_HANDLER 17 /* SPI3 IRQ handler */
- IRQ_HANDLER 18 /* UART0 IRQ handler */
- IRQ_HANDLER 19 /* UART1 IRQ handler */
- IRQ_HANDLER 20 /* UART2 IRQ handler */
- IRQ_HANDLER 21 /* UART3 IRQ handler */
- IRQ_HANDLER 22 /* UART4 IRQ handler */
- IRQ_HANDLER 23 /* UART5 IRQ handler */
- IRQ_HANDLER 24 /* UART6 IRQ handler */
- IRQ_HANDLER 25 /* UART7 IRQ handler */
- IRQ_HANDLER 26 /* CAN0 IRQ handler */
- IRQ_HANDLER 27 /* CAN1 IRQ handler */
- IRQ_HANDLER 28 /* PTPC IRQ handler */
- IRQ_HANDLER 29 /* WDG0 IRQ handler */
- IRQ_HANDLER 30 /* WDG1 IRQ handler */
- IRQ_HANDLER 31 /* TSNS IRQ handler */
- IRQ_HANDLER 32 /* MBX0A IRQ handler */
- IRQ_HANDLER 33 /* MBX0B IRQ handler */
- IRQ_HANDLER 34 /* GPTMR0 IRQ handler */
- IRQ_HANDLER 35 /* GPTMR1 IRQ handler */
- IRQ_HANDLER 36 /* GPTMR2 IRQ handler */
- IRQ_HANDLER 37 /* GPTMR3 IRQ handler */
- IRQ_HANDLER 38 /* I2C0 IRQ handler */
- IRQ_HANDLER 39 /* I2C1 IRQ handler */
- IRQ_HANDLER 40 /* I2C2 IRQ handler */
- IRQ_HANDLER 41 /* I2C3 IRQ handler */
- IRQ_HANDLER 42 /* PWM0 IRQ handler */
- IRQ_HANDLER 43 /* HALL0 IRQ handler */
- IRQ_HANDLER 44 /* QEI0 IRQ handler */
- IRQ_HANDLER 45 /* PWM1 IRQ handler */
- IRQ_HANDLER 46 /* HALL1 IRQ handler */
- IRQ_HANDLER 47 /* QEI1 IRQ handler */
- IRQ_HANDLER 48 /* SDP IRQ handler */
- IRQ_HANDLER 49 /* XPI0 IRQ handler */
- IRQ_HANDLER 50 /* XPI1 IRQ handler */
- IRQ_HANDLER 51 /* XDMA IRQ handler */
- IRQ_HANDLER 52 /* HDMA IRQ handler */
- IRQ_HANDLER 53 /* DRAM IRQ handler */
- IRQ_HANDLER 54 /* RNG IRQ handler */
- IRQ_HANDLER 55 /* I2S0 IRQ handler */
- IRQ_HANDLER 56 /* I2S1 IRQ handler */
- IRQ_HANDLER 57 /* DAO IRQ handler */
- IRQ_HANDLER 58 /* PDM IRQ handler */
- IRQ_HANDLER 59 /* FFA IRQ handler */
- IRQ_HANDLER 60 /* NTMR0 IRQ handler */
- IRQ_HANDLER 61 /* USB0 IRQ handler */
- IRQ_HANDLER 62 /* ENET0 IRQ handler */
- IRQ_HANDLER 63 /* SDXC0 IRQ handler */
- IRQ_HANDLER 64 /* PSEC IRQ handler */
- IRQ_HANDLER 65 /* PGPIO IRQ handler */
- IRQ_HANDLER 66 /* PWDG IRQ handler */
- IRQ_HANDLER 67 /* PTMR IRQ handler */
- IRQ_HANDLER 68 /* PUART IRQ handler */
- IRQ_HANDLER 69 /* FUSE IRQ handler */
- IRQ_HANDLER 70 /* SECMON IRQ handler */
- IRQ_HANDLER 71 /* RTC IRQ handler */
- IRQ_HANDLER 72 /* BUTN IRQ handler */
- IRQ_HANDLER 73 /* BGPIO IRQ handler */
- IRQ_HANDLER 74 /* BVIO IRQ handler */
- IRQ_HANDLER 75 /* BROWNOUT IRQ handler */
- IRQ_HANDLER 76 /* SYSCTL IRQ handler */
- IRQ_HANDLER 77 /* DEBUG[0] IRQ handler */
- IRQ_HANDLER 78 /* DEBUG[1] IRQ handler */
+ IRQ_HANDLER 8 /* GPIO1_A IRQ handler */
+ IRQ_HANDLER 9 /* GPIO1_B IRQ handler */
+ IRQ_HANDLER 10 /* GPIO1_C IRQ handler */
+ IRQ_HANDLER 11 /* GPIO1_D IRQ handler */
+ IRQ_HANDLER 12 /* GPIO1_X IRQ handler */
+ IRQ_HANDLER 13 /* GPIO1_Y IRQ handler */
+ IRQ_HANDLER 14 /* GPIO1_Z IRQ handler */
+ IRQ_HANDLER 15 /* ADC0 IRQ handler */
+ IRQ_HANDLER 16 /* ADC1 IRQ handler */
+ IRQ_HANDLER 17 /* ADC2 IRQ handler */
+ IRQ_HANDLER 18 /* SDFM IRQ handler */
+ IRQ_HANDLER 19 /* DAC0 IRQ handler */
+ IRQ_HANDLER 20 /* DAC1 IRQ handler */
+ IRQ_HANDLER 21 /* ACMP[0] IRQ handler */
+ IRQ_HANDLER 22 /* ACMP[1] IRQ handler */
+ IRQ_HANDLER 23 /* ACMP[2] IRQ handler */
+ IRQ_HANDLER 24 /* ACMP[3] IRQ handler */
+ IRQ_HANDLER 25 /* SPI0 IRQ handler */
+ IRQ_HANDLER 26 /* SPI1 IRQ handler */
+ IRQ_HANDLER 27 /* SPI2 IRQ handler */
+ IRQ_HANDLER 28 /* SPI3 IRQ handler */
+ IRQ_HANDLER 29 /* UART0 IRQ handler */
+ IRQ_HANDLER 30 /* UART1 IRQ handler */
+ IRQ_HANDLER 31 /* UART2 IRQ handler */
+ IRQ_HANDLER 32 /* UART3 IRQ handler */
+ IRQ_HANDLER 33 /* UART4 IRQ handler */
+ IRQ_HANDLER 34 /* UART5 IRQ handler */
+ IRQ_HANDLER 35 /* UART6 IRQ handler */
+ IRQ_HANDLER 36 /* UART7 IRQ handler */
+ IRQ_HANDLER 37 /* CAN0 IRQ handler */
+ IRQ_HANDLER 38 /* CAN1 IRQ handler */
+ IRQ_HANDLER 39 /* CAN2 IRQ handler */
+ IRQ_HANDLER 40 /* CAN3 IRQ handler */
+ IRQ_HANDLER 41 /* PTPC IRQ handler */
+ IRQ_HANDLER 42 /* WDG0 IRQ handler */
+ IRQ_HANDLER 43 /* WDG1 IRQ handler */
+ IRQ_HANDLER 44 /* TSNS IRQ handler */
+ IRQ_HANDLER 45 /* MBX0A IRQ handler */
+ IRQ_HANDLER 46 /* MBX0B IRQ handler */
+ IRQ_HANDLER 47 /* MBX1A IRQ handler */
+ IRQ_HANDLER 48 /* MBX1B IRQ handler */
+ IRQ_HANDLER 49 /* GPTMR0 IRQ handler */
+ IRQ_HANDLER 50 /* GPTMR1 IRQ handler */
+ IRQ_HANDLER 51 /* GPTMR2 IRQ handler */
+ IRQ_HANDLER 52 /* GPTMR3 IRQ handler */
+ IRQ_HANDLER 53 /* I2C0 IRQ handler */
+ IRQ_HANDLER 54 /* I2C1 IRQ handler */
+ IRQ_HANDLER 55 /* I2C2 IRQ handler */
+ IRQ_HANDLER 56 /* I2C3 IRQ handler */
+ IRQ_HANDLER 57 /* PWM0 IRQ handler */
+ IRQ_HANDLER 58 /* HALL0 IRQ handler */
+ IRQ_HANDLER 59 /* QEI0 IRQ handler */
+ IRQ_HANDLER 60 /* PWM1 IRQ handler */
+ IRQ_HANDLER 61 /* HALL1 IRQ handler */
+ IRQ_HANDLER 62 /* QEI1 IRQ handler */
+ IRQ_HANDLER 63 /* PWM2 IRQ handler */
+ IRQ_HANDLER 64 /* HALL2 IRQ handler */
+ IRQ_HANDLER 65 /* QEI2 IRQ handler */
+ IRQ_HANDLER 66 /* PWM3 IRQ handler */
+ IRQ_HANDLER 67 /* HALL3 IRQ handler */
+ IRQ_HANDLER 68 /* QEI3 IRQ handler */
+ IRQ_HANDLER 69 /* SDP IRQ handler */
+ IRQ_HANDLER 70 /* XPI0 IRQ handler */
+ IRQ_HANDLER 71 /* XDMA IRQ handler */
+ IRQ_HANDLER 72 /* HDMA IRQ handler */
+ IRQ_HANDLER 73 /* RNG IRQ handler */
+ IRQ_HANDLER 74 /* USB0 IRQ handler */
+ IRQ_HANDLER 75 /* PSEC IRQ handler */
+ IRQ_HANDLER 76 /* PGPIO IRQ handler */
+ IRQ_HANDLER 77 /* PWDG IRQ handler */
+ IRQ_HANDLER 78 /* PTMR IRQ handler */
+ IRQ_HANDLER 79 /* PUART IRQ handler */
+ IRQ_HANDLER 80 /* FUSE IRQ handler */
+ IRQ_HANDLER 81 /* SECMON IRQ handler */
+ IRQ_HANDLER 82 /* RTC IRQ handler */
+ IRQ_HANDLER 83 /* BUTN IRQ handler */
+ IRQ_HANDLER 84 /* BGPIO IRQ handler */
+ IRQ_HANDLER 85 /* BVIO IRQ handler */
+ IRQ_HANDLER 86 /* BROWNOUT IRQ handler */
+ IRQ_HANDLER 87 /* SYSCTL IRQ handler */
+ IRQ_HANDLER 88 /* DEBUG[0] IRQ handler */
+ IRQ_HANDLER 89 /* DEBUG[1] IRQ handler */
+ IRQ_HANDLER 90 /* LIN0 IRQ handler */
+ IRQ_HANDLER 91 /* LIN1 IRQ handler */
+ IRQ_HANDLER 92 /* LIN2 IRQ handler */
+ IRQ_HANDLER 93 /* LIN3 IRQ handler */
+
diff --git a/bsp/hpmicro/hpm5301evklite/startup/SConscript b/bsp/hpmicro/hpm5301evklite/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm5301evklite/startup/SConscript
+++ b/bsp/hpmicro/hpm5301evklite/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5e00evk/.config b/bsp/hpmicro/hpm5e00evk/.config
index 56353cc1ce3c..a5e80f410516 100644
--- a/bsp/hpmicro/hpm5e00evk/.config
+++ b/bsp/hpmicro/hpm5e00evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -262,10 +272,10 @@ CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -458,6 +468,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -573,6 +584,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -632,6 +644,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -780,6 +794,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -813,7 +829,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -892,11 +922,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -905,6 +942,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -984,6 +1038,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1038,6 +1093,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1088,6 +1144,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1105,6 +1162,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1162,6 +1222,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1187,6 +1249,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1426,7 +1489,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM5E00_SERIES=y
+CONFIG_SOC_SERIES_HPM5E00=y
#
# Hardware Drivers Config
@@ -1452,15 +1515,72 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_ETH is not set
# CONFIG_BSP_USING_GPTMR is not set
# CONFIG_BSP_USING_I2C is not set
# CONFIG_BSP_USING_XPI_FLASH is not set
+# CONFIG_BSP_USING_DAO is not set
+# CONFIG_BSP_USING_PDM is not set
+# CONFIG_BSP_USING_I2S is not set
# CONFIG_BSP_USING_USB is not set
# CONFIG_BSP_USING_EWDG is not set
# CONFIG_BSP_USING_PWMV2 is not set
# CONFIG_BSP_USING_MCAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_OWR is not set
+# CONFIG_BSP_USING_QEIV2 is not set
+# CONFIG_BSP_USING_QEOV2 is not set
+# CONFIG_BSP_USING_SDM is not set
+# CONFIG_BSP_USING_PLB is not set
+# CONFIG_BSP_USING_PPI is not set
+# CONFIG_BSP_USING_LOBS is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_ESC is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm5e00evk/.cproject b/bsp/hpmicro/hpm5e00evk/.cproject
index eafefd8ef55a..437444787bf8 100644
--- a/bsp/hpmicro/hpm5e00evk/.cproject
+++ b/bsp/hpmicro/hpm5e00evk/.cproject
@@ -20,7 +20,7 @@
-
+
@@ -70,9 +70,9 @@
-
-
-
+
+
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -111,7 +111,7 @@
-
+
@@ -135,7 +135,7 @@
-
+
@@ -168,9 +168,9 @@
-
-
-
+
+
+
@@ -185,18 +185,18 @@
-
+
-
+
-
+
diff --git a/bsp/hpmicro/hpm5e00evk/.settings/projcfg.ini b/bsp/hpmicro/hpm5e00evk/.settings/projcfg.ini
index 421ec3853eed..3b5f39d9dc3f 100644
--- a/bsp/hpmicro/hpm5e00evk/.settings/projcfg.ini
+++ b/bsp/hpmicro/hpm5e00evk/.settings/projcfg.ini
@@ -17,4 +17,4 @@ project_type=rt-thread
os_branch=master
os_version=latest
project_name=blink_led
-output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm6e00evk
\ No newline at end of file
+output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm5e00evk
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5e00evk/README.md b/bsp/hpmicro/hpm5e00evk/README.md
index 1852f9e539da..5af90b2054d9 100644
--- a/bsp/hpmicro/hpm5e00evk/README.md
+++ b/bsp/hpmicro/hpm5e00evk/README.md
@@ -72,7 +72,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5e00.cfg -f boards\debug_scripts\boards\hpm5e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5e00.cfg -f board\debug_scripts\openocd\boards\hpm5e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -80,7 +80,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5e00.cfg -f boards\debug_scripts\boards\hpm5e00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5e00.cfg -f board\debug_scripts\openocd\boards\hpm5e00evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm5e00evk/README_zh.md b/bsp/hpmicro/hpm5e00evk/README_zh.md
index c22d6f2c068c..9ef19f76bfbd 100644
--- a/bsp/hpmicro/hpm5e00evk/README_zh.md
+++ b/bsp/hpmicro/hpm5e00evk/README_zh.md
@@ -72,14 +72,14 @@ HPM5E00EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5e00.cfg -f boards\debug_scripts\boards\hpm5e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5e00.cfg -f board\debug_scripts\openocd\boards\hpm5e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm5e00.cfg -f boards\debug_scripts\boards\hpm5e00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm5e00.cfg -f board\debug_scripts\openocd\boards\hpm5e00evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm5e00evk/SConscript b/bsp/hpmicro/hpm5e00evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm5e00evk/SConscript
+++ b/bsp/hpmicro/hpm5e00evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm5e00evk/SConstruct b/bsp/hpmicro/hpm5e00evk/SConstruct
index d41dbd7584a1..69d7c1ccf70d 100644
--- a/bsp/hpmicro/hpm5e00evk/SConstruct
+++ b/bsp/hpmicro/hpm5e00evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -78,6 +78,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm5e00evk/applications/SConscript b/bsp/hpmicro/hpm5e00evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm5e00evk/applications/SConscript
+++ b/bsp/hpmicro/hpm5e00evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm5e00evk/applications/main.c b/bsp/hpmicro/hpm5e00evk/applications/main.c
index a5a7f07c7373..8aff6b812685 100644
--- a/bsp/hpmicro/hpm5e00evk/applications/main.c
+++ b/bsp/hpmicro/hpm5e00evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm5e00evk/board/Kconfig b/bsp/hpmicro/hpm5e00evk/board/Kconfig
index e07e937b3775..0c4568edfb63 100644
--- a/bsp/hpmicro/hpm5e00evk/board/Kconfig
+++ b/bsp/hpmicro/hpm5e00evk/board/Kconfig
@@ -2,7 +2,7 @@ menu "Hardware Drivers Config"
config SOC_HPM5E00
bool
- select SOC_HPM5E00_SERIES
+ select SOC_SERIES_HPM5E00
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -61,6 +61,7 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+
menuconfig BSP_USING_UART1
bool "Enable UART1"
default n
@@ -87,6 +88,11 @@ menu "On-chip Peripheral Drivers"
int "UART1 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -114,6 +120,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -141,10 +152,15 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART4
bool "Enable UART4"
- default n
+ default y
if BSP_USING_UART4
config BSP_UART4_RX_USING_DMA
bool "Enable UART4 RX DMA"
@@ -168,6 +184,11 @@ menu "On-chip Peripheral Drivers"
int "UART4 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
@@ -195,6 +216,11 @@ menu "On-chip Peripheral Drivers"
int "UART5 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -222,6 +248,11 @@ menu "On-chip Peripheral Drivers"
int "UART6 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART7
bool "Enable UART7"
@@ -249,10 +280,33 @@ menu "On-chip Peripheral Drivers"
int "UART7 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
@@ -269,7 +323,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -277,7 +331,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -290,7 +344,7 @@ menu "On-chip Peripheral Drivers"
endif
config BSP_USING_SPI1
bool "Enable SPI1"
- default n
+ default y
if BSP_USING_SPI1
config BSP_SPI1_USING_DMA
bool "Enable SPI1 DMA"
@@ -299,7 +353,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -307,7 +361,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -323,13 +377,13 @@ menu "On-chip Peripheral Drivers"
default n
if BSP_USING_SPI2
config BSP_SPI2_USING_DMA
- bool "Enable SPI2 DMA"
- default n
+ bool "Enable SPI2 DMA"
+ default n
config BSP_SPI2_IRQ_PRIORITY
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -337,7 +391,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -353,13 +407,13 @@ menu "On-chip Peripheral Drivers"
default n
if BSP_USING_SPI3
config BSP_SPI3_USING_DMA
- bool "Enable SPI3 DMA"
- default n
+ bool "Enable SPI3 DMA"
+ default n
config BSP_SPI3_IRQ_PRIORITY
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -367,7 +421,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -388,7 +442,7 @@ menu "On-chip Peripheral Drivers"
select RT_USING_PHY if BSP_USING_ETH
if BSP_USING_ETH
- choice BSP_ETH0_SEL
+ choice
prompt "ETH"
default BSP_USING_ETH0
@@ -405,6 +459,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -439,6 +494,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -496,12 +560,33 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
select RT_USING_FAL if BSP_USING_XPI_FLASH
+ menuconfig BSP_USING_DAO
+ bool "Enable Audio DAO play"
+ default n
+ select RT_USING_AUDIO if BSP_USING_DAO
+
+ menuconfig BSP_USING_PDM
+ bool "Enable Audio PDM record"
+ default n
+ select RT_USING_AUDIO if BSP_USING_PDM
+
+ menuconfig BSP_USING_I2S
+ bool "Enable Audio I2S device"
+ default n
+ select RT_USING_AUDIO if BSP_USING_I2S
+ if BSP_USING_I2S
+ config BSP_USING_I2S3
+ bool "Enable I2S3"
+ default y
+ config BSP_USING_AUDIO_CODEC_WM8960
+ bool "Enable audio codec on board"
+ default y
+ endif
menuconfig BSP_USING_USB
bool "Enable USB"
@@ -517,7 +602,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_EWDG
bool "Enable EWDG"
default n
@@ -534,7 +618,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWMV2
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWMV2
+ select RT_USING_PWM
menuconfig BSP_USING_MCAN
bool "Enable MCAN"
@@ -582,7 +666,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -597,10 +681,329 @@ menu "On-chip Peripheral Drivers"
endif
endif
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_OWR
+ bool "Enable OWR (One Wire)"
+ default n
+
+ menuconfig BSP_USING_QEIV2
+ bool "Enable QEIV2 (Quadrature Encoder Interface V2)"
+ default n
+
+ menuconfig BSP_USING_QEOV2
+ bool "Enable QEOV2 (Quadrature Encoder Output V2)"
+ default n
+
+ menuconfig BSP_USING_SDM
+ bool "Enable SDM (Sigma-Delta Modulator)"
+ default n
+
+ menuconfig BSP_USING_PLB
+ bool "Enable PLB"
+ default n
+
+ menuconfig BSP_USING_PPI
+ bool "Enable PPI (Parallel Port Interface)"
+ default n
+
+ menuconfig BSP_USING_LOBS
+ bool "Enable LOBS"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_ESC
+ bool "Enable ESC (EtherCAT Slave Controller)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
endmenu
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+menu "Third-Party Add-ons"
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
endmenu
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+endmenu
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/boards/hpm5e00evk.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/boards/hpm5e00evk.cfg
index e3c75108fc87..cb3b6e0e9aeb 100644
--- a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/boards/hpm5e00evk.cfg
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/boards/hpm5e00evk.cfg
@@ -60,23 +60,10 @@ flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x5 0x1000
flash bank xpi0_hybrid hpm_xpi 0xB0000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x5 0x1000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm5e00.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm5e00.cfg
index 2f4045a40627..04377ea25a40 100644
--- a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm5e00.cfg
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm5e00.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2024 HPMicro
+# Copyright (c) 2024-2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm5e00
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm5e00
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -12,7 +16,9 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
proc reset_soc {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF410001C
- $::_TARGET0 riscv dmi_write 0x3C 24000000
+ sba_write_mem 0xF410001C 24000000
}
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm5e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.c b/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.c
deleted file mode 100644
index bbb1b25beb48..000000000000
--- a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.c
+++ /dev/null
@@ -1,543 +0,0 @@
-/*
- * Copyright (c) 2015, Freescale Semiconductor, Inc.
- * Copyright 2016-2021 NXP
- * Copyright (c) 2022 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#include
-#include "hpm_wm8960.h"
-
-#ifndef HPM_WM8960_MCLK_TOLERANCE
-#define HPM_WM8960_MCLK_TOLERANCE (4U)
-#endif
-
-/* wm8960 register default value */
-static const uint16_t wm8960_default_reg_val[WM8960_REG_NUM] = {
- 0x0097, 0x0097, 0x0000, 0x0000, 0x0000, 0x0008, 0x0000, 0x000a, 0x01c0, 0x0000, 0x00ff, 0x00ff, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x007b, 0x0100, 0x0032, 0x0000, 0x00c3, 0x00c3, 0x01c0, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0100, 0x0100, 0x0050, 0x0050, 0x0050, 0x0050, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0040, 0x0000, 0x0000, 0x0050, 0x0050, 0x0000, 0x0002, 0x0037, 0x004d, 0x0080, 0x0008, 0x0031, 0x0026, 0x00e9,
-};
-
-/* store reg value */
-static uint16_t wm8960_reg_val[WM8960_REG_NUM];
-
-hpm_stat_t wm8960_init(wm8960_control_t *control, wm8960_config_t *config)
-{
- assert(control != NULL);
- assert(config != NULL);
-
- hpm_stat_t stat = status_success;
-
- (void)memcpy(wm8960_reg_val, wm8960_default_reg_val, sizeof(wm8960_default_reg_val));
-
- /* Reset */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RESET, 0x00));
-
- /* Power on input modules */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, 0xFE));
- /* Power on output modules */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER2, 0x1F8));
- /* Power on PGA and mixer */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER3, 0x3C));
-
- /* ADC and DAC uses same clock */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_IFACE2, 0x40));
-
- /* set data protocol */
- HPM_CHECK_RET(wm8960_set_protocol(control, config->bus));
-
- /* set wm8960 as slave */
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_MS_MASK, WM8960_IFACE1_MS_SET(0)));
-
- /* invert LRCLK */
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_LRP_MASK, WM8960_IFACE1_LRP_SET(1)));
-
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ADDCTL1, 0xC0));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ADDCTL4, 0x40));
-
- /* ADC volume, 8dB */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LADC, 0x1D3));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RADC, 0x1D3));
-
- /* Digital DAC volume, 0dB */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LDAC, 0x1E0));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RDAC, 0x1E0));
-
- /* Headphone volume, LOUT1 and ROUT1, 6dB */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT1, 0x17F));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT1, 0x17F));
-
- /* speaker volume 6dB */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT2, 0x1ff));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT2, 0x1ff));
- /* enable class D output */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_CLASSD1, 0xf7));
-
- /* Unmute DAC. */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_DACCTL1, 0x0000));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, 0x117));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, 0x117));
-
- HPM_CHECK_RET(wm8960_set_data_format(control, config->format.mclk_hz, config->format.sample_rate, config->format.bit_width));
-
- /* set data route */
- HPM_CHECK_RET(wm8960_set_data_route(control, config));
-
- return status_success;
-}
-
-hpm_stat_t wm8960_deinit(wm8960_control_t *control)
-{
- hpm_stat_t stat = status_success;
-
- /* power off all modules */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, 0x00U));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER2, 0x00U));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER3, 0x00U));
-
- return status_success;
-}
-
-hpm_stat_t wm8960_set_protocol(wm8960_control_t *control, wm8960_protocol_t protocol)
-{
- return wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_FORMAT_MASK, (uint16_t)protocol);
-}
-
-hpm_stat_t wm8960_set_module(wm8960_control_t *control, wm8960_module_t module, bool enable)
-{
- hpm_stat_t stat = status_success;
- switch (module) {
- case wm8960_module_adc:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_ADCL_MASK,
- ((uint16_t)enable << WM8960_POWER1_ADCL_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_ADCR_MASK,
- ((uint16_t)enable << WM8960_POWER1_ADCR_SHIFT)));
- break;
- case wm8960_module_dac:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_DACL_MASK,
- ((uint16_t)enable << WM8960_POWER2_DACL_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_DACR_MASK,
- ((uint16_t)enable << WM8960_POWER2_DACR_SHIFT)));
- break;
- case wm8960_module_vref:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_VREF_MASK,
- ((uint16_t)enable << WM8960_POWER1_VREF_SHIFT)));
- break;
- case wm8960_module_ana_in:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_AINL_MASK,
- ((uint16_t)enable << WM8960_POWER1_AINL_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_AINR_MASK,
- ((uint16_t)enable << WM8960_POWER1_AINR_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER3, WM8960_POWER3_LMIC_MASK,
- ((uint16_t)enable << WM8960_POWER3_LMIC_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER3, WM8960_POWER3_RMIC_MASK,
- ((uint16_t)enable << WM8960_POWER3_RMIC_SHIFT)));
- break;
- case wm8960_module_lineout:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_LOUT1_MASK,
- ((uint16_t)enable << WM8960_POWER2_LOUT1_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_ROUT1_MASK,
- ((uint16_t)enable << WM8960_POWER2_ROUT1_SHIFT)));
- break;
- case wm8960_module_micbais:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER1, WM8960_POWER1_MICB_MASK,
- ((uint16_t)enable << WM8960_POWER1_MICB_SHIFT)));
- break;
- case wm8960_module_speaker:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_SPKL_MASK,
- ((uint16_t)enable << WM8960_POWER2_SPKL_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER2, WM8960_POWER2_SPKR_MASK,
- ((uint16_t)enable << WM8960_POWER2_SPKR_SHIFT)));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_CLASSD1, 0xF7));
- break;
- case wm8960_module_output_mixer:
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER3, WM8960_POWER3_LOMIX_MASK,
- ((uint16_t)enable << WM8960_POWER3_LOMIX_SHIFT)));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_POWER3, WM8960_POWER3_ROMIX_MASK,
- ((uint16_t)enable << WM8960_POWER3_ROMIX_SHIFT)));
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
- return stat;
-}
-
-hpm_stat_t wm8960_set_data_route(wm8960_control_t *control, wm8960_config_t *config)
-{
- hpm_stat_t stat = status_success;
-
- /* select left input */
- HPM_CHECK_RET(wm8960_set_left_input(control, config->left_input));
- /* select right input */
- HPM_CHECK_RET(wm8960_set_right_input(control, config->right_input));
- /* select source to output mixer */
- HPM_CHECK_RET(wm8960_config_input_to_output_mixer(control, config->play_source));
-
- switch (config->route) {
- case wm8960_route_bypass:
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_micbais, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_ana_in, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_output_mixer, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_lineout, true));
- break;
- case wm8960_route_playback:
- /* I2S_IN-> DAC-> HP */
- /* Set power for DAC */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER3, 0x0C));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_dac, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_output_mixer, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_lineout, true));
- break;
- case wm8960_route_playback_and_record:
- /* Set power */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER3, 0x3C));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_adc, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_micbais, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_ana_in, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_dac, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_output_mixer, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_lineout, true));
- break;
- case wm8960_route_record:
- /* ANA_IN->ADC->I2S_OUT */
- /* Power up ADC and AIN */
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER3, 0x30));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_micbais, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_ana_in, true));
- HPM_CHECK_RET(wm8960_set_module(control, wm8960_module_adc, true));
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
- return stat;
-}
-
-hpm_stat_t wm8960_set_left_input(wm8960_control_t *control, wm8960_input_t input)
-{
- hpm_stat_t stat = status_success;
- uint16_t val = 0;
-
- switch (input) {
- case wm8960_input_closed:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val &= (uint16_t) ~(WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- break;
- case wm8960_input_single_ended_mic:
- /* Only LMN1 enabled, LMICBOOST to 13db, LMIC2B enabled */
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINPATH, 0x138));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, 0x117));
- break;
- case wm8960_input_differential_mic_input2:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINPATH, 0x178));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, 0x117));
- break;
- case wm8960_input_differential_mic_input3:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINPATH, 0x1B8));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, 0x117));
- break;
- case wm8960_input_line_input2:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_read_reg(WM8960_INBMIX1, &val));
- val |= 0xEU;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_INBMIX1, val));
- break;
- case wm8960_input_line_input3:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINL_MASK | WM8960_POWER1_ADCL_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_read_reg(WM8960_INBMIX1, &val));
- val |= 0x70U;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_INBMIX1, val));
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
-
- return stat;
-}
-
-hpm_stat_t wm8960_set_right_input(wm8960_control_t *control, wm8960_input_t input)
-{
- hpm_stat_t stat = status_success;
- uint16_t val = 0;
-
- switch (input) {
- case wm8960_input_closed:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val &= (uint16_t) ~(WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- break;
- case wm8960_input_single_ended_mic:
- /* Only LMN1 enabled, LMICBOOST to 13db, LMIC2B enabled */
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINPATH, 0x138));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, 0x117));
- break;
- case wm8960_input_differential_mic_input2:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINPATH, 0x178));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, 0x117));
- break;
- case wm8960_input_differential_mic_input3:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK | WM8960_POWER1_MICB_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINPATH, 0x1B8));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, 0x117));
- break;
- case wm8960_input_line_input2:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_read_reg(WM8960_INBMIX2, &val));
- val |= 0xEU;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_INBMIX2, val));
- break;
- case wm8960_input_line_input3:
- HPM_CHECK_RET(wm8960_read_reg(WM8960_POWER1, &val));
- val |= (WM8960_POWER1_AINR_MASK | WM8960_POWER1_ADCR_MASK);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_POWER1, val));
- HPM_CHECK_RET(wm8960_read_reg(WM8960_INBMIX2, &val));
- val |= 0x70U;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_INBMIX2, val));
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
-
- return stat;
-}
-
-hpm_stat_t wm8960_set_volume(wm8960_control_t *control, wm8960_module_t module, uint32_t volume)
-{
- uint16_t vol = 0;
- hpm_stat_t stat = status_success;
- switch (module) {
- case wm8960_module_adc:
- if (volume > 255U) {
- stat = status_invalid_argument;
- } else {
- vol = (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LADC, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RADC, vol));
- /* Update volume */
- vol = (uint16_t)(0x100U | volume);
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LADC, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RADC, vol));
- }
- break;
- case wm8960_module_dac:
- if (volume > 255U) {
- stat = status_invalid_argument;
- } else {
- vol = (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LDAC, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RDAC, vol));
- vol = 0x100U | (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LDAC, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RDAC, vol));
- }
- break;
- case wm8960_module_headphone:
- if (volume > 0x7FU) {
- stat = status_invalid_argument;
- } else {
- vol = (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT1, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT1, vol));
- vol = 0x100U | (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT1, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT1, vol));
- }
- break;
- case wm8960_module_ana_in:
- if (volume > 0x3FU) {
- stat = status_invalid_argument;
- } else {
- vol = (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, vol));
- vol = 0x100U | (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LINVOL, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_RINVOL, vol));
- }
- break;
- case wm8960_module_speaker:
- if (volume > 0x7FU) {
- stat = status_invalid_argument;
- } else {
- vol = (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT2, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT2, vol));
- vol = 0x100U | (uint16_t)volume;
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_LOUT2, vol));
- HPM_CHECK_RET(wm8960_write_reg(control, WM8960_ROUT2, vol));
- }
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
- return stat;
-}
-
-static bool wm8960_check_clock_tolerance(uint32_t source, uint32_t target)
-{
- uint32_t delta = (source >= target) ? (source - target) : (target - source);
- if (delta * 100 <= HPM_WM8960_MCLK_TOLERANCE * target) {
- return true;
- }
- return false;
-}
-
-hpm_stat_t wm8960_set_data_format(wm8960_control_t *control, uint32_t sysclk, uint32_t sample_rate, uint32_t bits)
-{
- hpm_stat_t stat = status_success;
- uint16_t val = 0;
- uint32_t ratio[7] = {256, 256 * 1.5, 256 * 2, 256 * 3, 256 * 4, 256 * 5.5, 256 * 6};
- bool clock_meet_requirement = false;
-
- if (sysclk / sample_rate > 256 * 6) {
- sysclk = sysclk / 2;
- val = WM8960_CLOCK1_SYSCLKDIV_SET(2U); /* SYSCLK Pre-divider */
- }
-
- for (uint8_t i = 0; i < 7; i++) {
- if (wm8960_check_clock_tolerance(sysclk, sample_rate * ratio[i])) {
- val |= ((i << WM8960_CLOCK1_ADCDIV_SHIFT) | (i << WM8960_CLOCK1_DACDIV_SHIFT));
- clock_meet_requirement = true;
- break;
- }
- }
-
- if (!clock_meet_requirement) {
- return status_invalid_argument;
- }
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_CLOCK1, 0x1FEU, val));
-
- /* set sample bit */
- switch (bits) {
- case 16:
- stat = wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_WL_MASK, WM8960_IFACE1_WL_SET(0U));
- break;
- case 20:
- stat = wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_WL_MASK, WM8960_IFACE1_WL_SET(1U));
- break;
- case 24:
- stat = wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_WL_MASK, WM8960_IFACE1_WL_SET(2U));
- break;
- case 32:
- stat = wm8960_modify_reg(control, WM8960_IFACE1, WM8960_IFACE1_WL_MASK, WM8960_IFACE1_WL_SET(3U));
- break;
- default:
- stat = status_invalid_argument;
- break;
- }
-
- return stat;
-}
-
-hpm_stat_t wm8960_config_input_to_output_mixer(wm8960_control_t *control, uint32_t play_source)
-{
- hpm_stat_t stat = status_success;
-
- if ((play_source & (uint32_t)wm8960_play_source_input_mixer) != 0U) {
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS1, 0x80U, 0x80U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS2, 0x80U, 0x80U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_LOUTMIX, 0x180U, 0U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_ROUTMIX, 0x180U, 0U));
- }
-
- if ((play_source & (uint32_t)wm8960_play_source_dac) != 0U) {
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS1, 0x80U, 0x00U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS2, 0x80U, 0x00U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_LOUTMIX, 0x180U, 0x100U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_ROUTMIX, 0x180U, 0x100U));
- }
-
- if ((play_source & (uint32_t)wm8960_play_source_input3) != 0U) {
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS1, 0x80U, 0x0U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_BYPASS2, 0x80U, 0x0U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_LOUTMIX, 0x180U, 0x80U));
- HPM_CHECK_RET(wm8960_modify_reg(control, WM8960_ROUTMIX, 0x180U, 0x80U));
- }
-
- return stat;
-}
-
-
-hpm_stat_t wm8960_write_reg(wm8960_control_t *control, uint8_t reg, uint16_t val)
-{
- /* The first 7 bits (B15 to B9) are address bits that select which control register */
- /* is accessed. The remaining 9 bits (B8 to B0) are data bits */
- rt_size_t size;
- rt_uint8_t data[2];
- data[0] = (reg << 1) | (uint8_t)((val >> 8U) & 0x0001U);
- data[1] = (uint8_t)(val & 0xFFU);
-
- size = rt_i2c_master_send(control->i2c_bus, control->slave_address, RT_I2C_WR, data, 2U);
- if (size != 2) {
- return status_fail;
- }
-
- wm8960_reg_val[reg] = val;
- return status_success;
-}
-
-hpm_stat_t wm8960_read_reg(uint8_t reg, uint16_t *val)
-{
- if (reg >= WM8960_REG_NUM) {
- return status_invalid_argument;
- }
- *val = wm8960_reg_val[reg];
-
- return status_success;
-}
-
-hpm_stat_t wm8960_modify_reg(wm8960_control_t *control, uint8_t reg, uint16_t mask, uint16_t val)
-{
- hpm_stat_t stat = 0;
- uint16_t reg_val;
-
- /* Read the register value out */
- stat = wm8960_read_reg(reg, ®_val);
- if (stat != status_success) {
- return status_fail;
- }
-
- /* Modify the value */
- reg_val &= (uint16_t)~mask;
- reg_val |= val;
-
- /* Write the data to register */
- stat = wm8960_write_reg(control, reg, reg_val);
- if (stat != status_success) {
- return status_fail;
- }
-
- return status_success;
-}
diff --git a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.h b/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.h
deleted file mode 100644
index a163a52390ac..000000000000
--- a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960.h
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (c) 2015, Freescale Semiconductor, Inc.
- * Copyright 2016-2021 NXP
- * Copyright (c) 2022 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef _HPM_WM8960_H_
-#define _HPM_WM8960_H_
-
-//#include "hpm_i2c_drv.h"
-//#include "hpm_common.h"
-#include
-#include
-#include "rtt_board.h"
-#include "drivers/dev_i2c.h"
-#include "hpm_wm8960_regs.h"
-
-#define WM8960_I2C_ADDR 0x1A
-
-typedef enum wm8960_module {
- wm8960_module_adc = 0, /* ADC module in WM8960 */
- wm8960_module_dac = 1, /* DAC module in WM8960 */
- wm8960_module_vref = 2, /* VREF module */
- wm8960_module_headphone = 3, /* Headphone */
- wm8960_module_micbais = 4, /* Mic bias */
- wm8960_module_ana_in = 6, /* Analog in PGA */
- wm8960_module_lineout = 7, /* Line out module */
- wm8960_module_speaker = 8, /* Speaker module */
- wm8960_module_output_mixer = 9, /* Output mixer */
-} wm8960_module_t;
-
-/* wm8960 play source for output mixer */
-typedef enum wm8960_play_source {
- wm8960_play_source_input_mixer = 1, /* Input Boost Mixer to Output Mixer */
- wm8960_play_source_input3 = 2, /* L/RINPUT3 to Output Mixer */
- wm8960_play_source_dac = 4, /* DAC to Output Mixer */
-} wm8960_play_source_t;
-
-/* WM8960 data route */
-typedef enum wm8960_route {
- wm8960_route_bypass = 0, /* ANA_IN->Headphone. */
- wm8960_route_playback = 1, /* I2SIN->DAC->Headphone. */
- wm8960_route_playback_and_record = 2, /* I2SIN->DAC->Headphone, ANA_IN->ADC->I2SOUT. */
- wm8960_route_record = 5 /* ANA_IN->ADC->I2SOUT. */
-} wm8960_route_t;
-
-/* The audio data transfer protocol choice */
-typedef enum wm8960_protocol {
- wm8960_bus_i2s = 2, /* I2S type */
- wm8960_bus_left_justified = 1, /* Left justified mode */
- wm8960_bus_right_justified = 0, /* Right justified mode */
- wm8960_bus_pcma = 3, /* PCM A mode */
- wm8960_bus_pcmb = 3 | (1 << 4) /* PCM B mode */
-} wm8960_protocol_t;
-
-/* wm8960 input source */
-typedef enum wm8960_input {
- wm8960_input_closed = 0, /* Input device is closed */
- wm8960_input_single_ended_mic = 1, /* Input as single ended mic, only use L/RINPUT1 */
- wm8960_input_differential_mic_input2 = 2, /* Input as differential mic, use L/RINPUT1 and L/RINPUT2 */
- wm8960_input_differential_mic_input3 = 3, /* Input as differential mic, use L/RINPUT1 and L/RINPUT3*/
- wm8960_input_line_input2 = 4, /* Input as line input, only use L/RINPUT2 */
- wm8960_input_line_input3 = 5 /* Input as line input, only use L/RINPUT3 */
-} wm8960_input_t;
-
-/* wm8960 audio format */
-typedef struct wm8960_audio_format {
- uint32_t mclk_hz; /* master clock frequency */
- uint32_t sample_rate; /* sample rate */
- uint32_t bit_width; /* bit width */
-} wm8960_audio_format_t;
-
-/* configure structure of WM8960 */
-typedef struct wm8960_config {
- wm8960_route_t route; /* Audio data route.*/
- wm8960_protocol_t bus; /* Audio transfer protocol */
- bool enable_speaker; /* True means enable class D speaker as output, false means no */
- wm8960_input_t left_input; /* Left input source for WM8960 */
- wm8960_input_t right_input; /* Right input source for wm8960 */
- wm8960_play_source_t play_source; /* play source */
- wm8960_audio_format_t format; /* Audio format */
-} wm8960_config_t;
-
-typedef struct {
- struct rt_i2c_bus_device *i2c_bus; /* I2C bus device */
- uint8_t slave_address; /* code device address */
-} wm8960_control_t;
-
-
-#if defined(__cplusplus)
-extern "C" {
-#endif
-
-/**
- * @brief WM8960 initialize function.
- *
- * @param control WM8960 control structure.
- * @param config WM8960 configuration structure.
- */
-hpm_stat_t wm8960_init(wm8960_control_t *control, wm8960_config_t *config);
-
-/**
- * @brief Deinit the WM8960 codec.
- *
- * This function close all modules in WM8960 to save power.
- *
- * @param control WM8960 control structure pointer.
- */
-hpm_stat_t wm8960_deinit(wm8960_control_t *control);
-
-/**
- * @brief Set audio data route in WM8960.
- *
- * This function would set the data route according to route.
- *
- * @param control WM8960 control structure.
- * @param config Audio configure structure in WM8960.
- */
-hpm_stat_t wm8960_set_data_route(wm8960_control_t *control, wm8960_config_t *config);
-
-/**
- * @brief Set left audio input source in WM8960.
- *
- * @param control WM8960 control structure.
- * @param input Audio input source.
- */
-hpm_stat_t wm8960_set_left_input(wm8960_control_t *control, wm8960_input_t input);
-
-/**
- * @brief Set right audio input source in WM8960.
- *
- * @param control WM8960 control structure.
- * @param input Audio input source.
- */
-hpm_stat_t wm8960_set_right_input(wm8960_control_t *control, wm8960_input_t input);
-
-/**
- * @brief Set the audio transfer protocol.
- *
- * @param control WM8960 control structure.
- * @param protocol Audio data transfer protocol.
- */
-hpm_stat_t wm8960_set_protocol(wm8960_control_t *control, wm8960_protocol_t protocol);
-
-/**
- * @brief Set the volume of different modules in WM8960.
- *
- * This function would set the volume of WM8960 modules. Uses need to appoint the module.
- * The function assume that left channel and right channel has the same volume.
- *
- * Module:wm8960_module_adc, volume range value: 0 is mute, 1-255 is -97db to 30db
- * Module:wm8960_module_dac, volume range value: 0 is mute, 1-255 is -127db to 0db
- * Module:wm8960_module_headphone, volume range value: 0 - 2F is mute, 0x30 - 0x7F is -73db to 6db
- * Module:wm8960_module_ana_in, volume range value: 0 - 0x3F is -17.25db to 30db
- * Module:wm8960_module_speaker, volume range value: 0 - 2F is mute, 0x30 - 0x7F is -73db to 6db
- *
- *
- * @param control WM8960 control structure.
- * @param module Module to set volume, it can be ADC, DAC, Headphone and so on.
- * @param volume Volume value need to be set.
- */
-hpm_stat_t wm8960_set_volume(wm8960_control_t *control, wm8960_module_t module, uint32_t volume);
-
-/**
- * @brief Enable/disable expected module.
- *
- * @param control WM8960 control structure.
- * @param module Module expected to enable.
- * @param enable Enable or disable moudles.
- */
-hpm_stat_t wm8960_set_module(wm8960_control_t *control, wm8960_module_t module, bool enable);
-
-/**
- * @brief SET the WM8960 play source.
- *
- * @param control WM8960 control structure.
- * @param play_source play source
- *
- * @return kStatus_WM8904_Success if successful, different code otherwise..
- */
-hpm_stat_t wm8960_config_input_to_output_mixer(wm8960_control_t *control, uint32_t play_source);
-
-/**
- * @brief Configure the data format of audio data.
- *
- * This function would configure the registers about the sample rate, bit depths.
- *
- * @param control WM8960 control structure pointer.
- * @param sysclk system clock of the codec which can be generated by MCLK or PLL output.
- * @param sample_rate Sample rate of audio file running in WM8960. WM8960 now
- * supports 8k, 11.025k, 12k, 16k, 22.05k, 24k, 32k, 44.1k, 48k and 96k sample rate.
- * @param bits Bit depth of audio file (WM8960 only supports 16bit, 20bit, 24bit
- * and 32 bit in HW).
- */
-hpm_stat_t wm8960_set_data_format(wm8960_control_t *control, uint32_t sysclk, uint32_t sample_rate, uint32_t bits);
-
-
-/**
- * @brief Write register to WM8960 using I2C.
- *
- * @param control WM8960 control structure.
- * @param reg The register address in WM8960.
- * @param val Value needs to write into the register.
- */
-hpm_stat_t wm8960_write_reg(wm8960_control_t *control, uint8_t reg, uint16_t val);
-
-/**
- * @brief Read register from WM8960 using I2C.
- * @param reg The register address in WM8960.
- * @param val Value written to.
- */
-hpm_stat_t wm8960_read_reg(uint8_t reg, uint16_t *val);
-
-/**
- * @brief Modify some bits in the register using I2C.
- * @param control WM8960 control structure.
- * @param reg The register address in WM8960.
- * @param mask The mask code for the bits want to write. The bit you want to write should be 0.
- * @param val Value needs to write into the register.
- */
-hpm_stat_t wm8960_modify_reg(wm8960_control_t *control, uint8_t reg, uint16_t mask, uint16_t val);
-
-
-#endif /* _HPM_WM8960_H_ */
diff --git a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960_regs.h b/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960_regs.h
deleted file mode 100644
index a484f2937c1b..000000000000
--- a/bsp/hpmicro/hpm5e00evk/board/hpm_wm8960_regs.h
+++ /dev/null
@@ -1,2139 +0,0 @@
-/*
- * Copyright (c) 2022 HPMicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef _HPM_WM8960_REG_H_
-#define _HPM_WM8960_REG_H_
-
-/* WM8960 register number */
-#define WM8960_REG_NUM 56U
-
-/* Define the register address of WM8960 */
-#define WM8960_LINVOL 0x0U /* Left Input Volume */
-#define WM8960_RINVOL 0x1U /* Right Input Volume */
-#define WM8960_LOUT1 0x2U /* LOUT1 Volume */
-#define WM8960_ROUT1 0x3U /* ROUT1 Volume */
-#define WM8960_CLOCK1 0x4U /* Clocking(1) */
-#define WM8960_DACCTL1 0x5U /* ADC and DAC Control (1) */
-#define WM8960_DACCTL2 0x6U /* ADC and DAC Control (2) */
-#define WM8960_IFACE1 0x7U /* Audio Interface */
-#define WM8960_CLOCK2 0x8U /* Clocking(2) */
-#define WM8960_IFACE2 0x9U /* Audio Interface */
-#define WM8960_LDAC 0xaU /* Left DAC */
-#define WM8960_RDAC 0xbU /* Right DAC Volume */
-#define WM8960_RESET 0xfU /* RESET */
-#define WM8960_3D 0x10U /* 3D Control */
-#define WM8960_ALC1 0x11U /* ALC (1) */
-#define WM8960_ALC2 0x12U /* ALC (2) */
-#define WM8960_ALC3 0x13U /* ALC (3) */
-#define WM8960_NOISEG 0x14U /* Noise Gate */
-#define WM8960_LADC 0x15U /* Left ADC Volume */
-#define WM8960_RADC 0x16U /* Right ADC Volume */
-#define WM8960_ADDCTL1 0x17U /* Additional Control (1) */
-#define WM8960_ADDCTL2 0x18U /* Additional Control (2) */
-#define WM8960_POWER1 0x19U /* Power Mgmt (1) */
-#define WM8960_POWER2 0x1aU /* Power Mgmt (2) */
-#define WM8960_ADDCTL3 0x1bU /* Additional Control (3) */
-#define WM8960_APOP1 0x1cU /* Anti-Pop 1 */
-#define WM8960_APOP2 0x1dU /* Anti-pop 2 */
-#define WM8960_LINPATH 0x20U /* ADCL Signal Path */
-#define WM8960_RINPATH 0x21U /* ADCR Signal Path */
-#define WM8960_LOUTMIX 0x22U /* Left Out Mix */
-#define WM8960_ROUTMIX 0x25U /* Right Out Mix */
-#define WM8960_MONOMIX1 0x26U /* Mono Out Mix (1) */
-#define WM8960_MONOMIX2 0x27U /* Mono Out Mix (2) */
-#define WM8960_LOUT2 0x28U /* Left Speaker Volume */
-#define WM8960_ROUT2 0x29U /* Right Speaker Volume */
-#define WM8960_MONO 0x2aU /* OUT3 Volume */
-#define WM8960_INBMIX1 0x2bU /* Left Input Boost Mixer */
-#define WM8960_INBMIX2 0x2cU /* Right Input Boost Mixer */
-#define WM8960_BYPASS1 0x2dU /* Left Bypass */
-#define WM8960_BYPASS2 0x2eU /* Right Bypass */
-#define WM8960_POWER3 0x2fU /* Power Mgmt (3) */
-#define WM8960_ADDCTL4 0x30U /* Additional Control (4) */
-#define WM8960_CLASSD1 0x31U /* Class D Control (1) */
-#define WM8960_CLASSD3 0x33U /* Class D Control (2) */
-#define WM8960_PLL1 0x34U /* PLL (1) */
-#define WM8960_PLL2 0x35U /* PLL (2) */
-#define WM8960_PLL3 0x36U /* PLL (3) */
-#define WM8960_PLL4 0x37U /* PLL (4) */
-
-/* Bitfield definition for register: LINVO */
-/*
- * IPVU (RW)
- *
- * Input PGA Volume Update
- * Writing a 1 to this bit will cause left and right input PGA volumes to be updated (LINVOL and RINVOL)
- */
-#define WM8960_LINVO_IPVU_MASK (0x100U)
-#define WM8960_LINVO_IPVU_SHIFT (8U)
-#define WM8960_LINVO_IPVU_SET(x) (((uint16_t)(x) << WM8960_LINVO_IPVU_SHIFT) & WM8960_LINVO_IPVU_MASK)
-#define WM8960_LINVO_IPVU_GET(x) (((uint16_t)(x) & WM8960_LINVO_IPVU_MASK) >> WM8960_LINVO_IPVU_SHIFT)
-
-/*
- * LINMUTE (RW)
- *
- * Left Input PGA Analogue Mute 1 = Enable Mute 0 = Disable Mute Note: IPVU must be set to un-mute.
- */
-#define WM8960_LINVO_LINMUTE_MASK (0x80U)
-#define WM8960_LINVO_LINMUTE_SHIFT (7U)
-#define WM8960_LINVO_LINMUTE_SET(x) (((uint16_t)(x) << WM8960_LINVO_LINMUTE_SHIFT) & WM8960_LINVO_LINMUTE_MASK)
-#define WM8960_LINVO_LINMUTE_GET(x) (((uint16_t)(x) & WM8960_LINVO_LINMUTE_MASK) >> WM8960_LINVO_LINMUTE_SHIFT)
-
-/*
- * LIZC (RW)
- *
- * Left Input PGA Zero Cross Detector 1 = Change gain on zero cross only 0 = Change gain immediately
- */
-#define WM8960_LINVO_LIZC_MASK (0x40U)
-#define WM8960_LINVO_LIZC_SHIFT (6U)
-#define WM8960_LINVO_LIZC_SET(x) (((uint16_t)(x) << WM8960_LINVO_LIZC_SHIFT) & WM8960_LINVO_LIZC_MASK)
-#define WM8960_LINVO_LIZC_GET(x) (((uint16_t)(x) & WM8960_LINVO_LIZC_MASK) >> WM8960_LINVO_LIZC_SHIFT)
-
-/*
- * LINVOL (RW)
- *
- * Left Input PGA Volume Control
- * 111111 = +30dB
- * 111110 = +29.25dB
- * . . 0.75dB steps down to
- * 000000 = -17.25dB
- */
-#define WM8960_LINVO_LINVOL_MASK (0x3FU)
-#define WM8960_LINVO_LINVOL_SHIFT (0U)
-#define WM8960_LINVO_LINVOL_SET(x) (((uint16_t)(x) << WM8960_LINVO_LINVOL_SHIFT) & WM8960_LINVO_LINVOL_MASK)
-#define WM8960_LINVO_LINVOL_GET(x) (((uint16_t)(x) & WM8960_LINVO_LINVOL_MASK) >> WM8960_LINVO_LINVOL_SHIFT)
-
-/* Bitfield definition for register: RINVOL */
-/*
- * IPVU (RW)
- *
- * Input PGA Volume Update
- * Writing a 1 to this bit will cause left and right
- * input PGA volumes to be updated (LINVOL and RINVOL)
- */
-#define WM8960_RINVOL_IPVU_MASK (0x100U)
-#define WM8960_RINVOL_IPVU_SHIFT (8U)
-#define WM8960_RINVOL_IPVU_SET(x) (((uint16_t)(x) << WM8960_RINVOL_IPVU_SHIFT) & WM8960_RINVOL_IPVU_MASK)
-#define WM8960_RINVOL_IPVU_GET(x) (((uint16_t)(x) & WM8960_RINVOL_IPVU_MASK) >> WM8960_RINVOL_IPVU_SHIFT)
-
-/*
- * RINMUTE (RW)
- *
- * Right Input PGA Analogue Mute
- * 1 = Enable Mute
- * 0 = Disable Mute
- * Note: IPVU must be set to un-mute.
- */
-#define WM8960_RINVOL_RINMUTE_MASK (0x80U)
-#define WM8960_RINVOL_RINMUTE_SHIFT (7U)
-#define WM8960_RINVOL_RINMUTE_SET(x) (((uint16_t)(x) << WM8960_RINVOL_RINMUTE_SHIFT) & WM8960_RINVOL_RINMUTE_MASK)
-#define WM8960_RINVOL_RINMUTE_GET(x) (((uint16_t)(x) & WM8960_RINVOL_RINMUTE_MASK) >> WM8960_RINVOL_RINMUTE_SHIFT)
-
-/*
- * RIZC (RW)
- *
- * Right Input PGA Zero Cross Detector
- * 1 = Change gain on zero cross only
- * 0 = Change gain immediately
- */
-#define WM8960_RINVOL_RIZC_MASK (0x40U)
-#define WM8960_RINVOL_RIZC_SHIFT (6U)
-#define WM8960_RINVOL_RIZC_SET(x) (((uint16_t)(x) << WM8960_RINVOL_RIZC_SHIFT) & WM8960_RINVOL_RIZC_MASK)
-#define WM8960_RINVOL_RIZC_GET(x) (((uint16_t)(x) & WM8960_RINVOL_RIZC_MASK) >> WM8960_RINVOL_RIZC_SHIFT)
-
-/*
- * RINVOL (RW)
- *
- * Right Input PGA Volume Control
- * 111111 = +30dB
- * 111110 = +29.25dB
- * . . 0.75dB steps down to
- * 000000 = -17.25dB
- */
-#define WM8960_RINVOL_RINVOL_MASK (0x3FU)
-#define WM8960_RINVOL_RINVOL_SHIFT (0U)
-#define WM8960_RINVOL_RINVOL_SET(x) (((uint16_t)(x) << WM8960_RINVOL_RINVOL_SHIFT) & WM8960_RINVOL_RINVOL_MASK)
-#define WM8960_RINVOL_RINVOL_GET(x) (((uint16_t)(x) & WM8960_RINVOL_RINVOL_MASK) >> WM8960_RINVOL_RINVOL_SHIFT)
-
-/* Bitfield definition for register: LOUT1 */
-/*
- * OUT1VU (RW)
- *
- * Headphone Output PGA Volume Update
- * Writing a 1 to this bit will cause left and right
- * headphone output volumes to be updated
- * (LOUT1VOL and ROUT1VOL)
- */
-#define WM8960_LOUT1_OUT1VU_MASK (0x100U)
-#define WM8960_LOUT1_OUT1VU_SHIFT (8U)
-#define WM8960_LOUT1_OUT1VU_SET(x) (((uint16_t)(x) << WM8960_LOUT1_OUT1VU_SHIFT) & WM8960_LOUT1_OUT1VU_MASK)
-#define WM8960_LOUT1_OUT1VU_GET(x) (((uint16_t)(x) & WM8960_LOUT1_OUT1VU_MASK) >> WM8960_LOUT1_OUT1VU_SHIFT)
-
-/*
- * LO1ZC (RW)
- *
- * Left Headphone Output Zero Cross Enable
- * 0 = Change gain immediately
- * 1 = Change gain on zero cross only
- */
-#define WM8960_LOUT1_LO1ZC_MASK (0x80U)
-#define WM8960_LOUT1_LO1ZC_SHIFT (7U)
-#define WM8960_LOUT1_LO1ZC_SET(x) (((uint16_t)(x) << WM8960_LOUT1_LO1ZC_SHIFT) & WM8960_LOUT1_LO1ZC_MASK)
-#define WM8960_LOUT1_LO1ZC_GET(x) (((uint16_t)(x) & WM8960_LOUT1_LO1ZC_MASK) >> WM8960_LOUT1_LO1ZC_SHIFT)
-
-/*
- * LOUT1VOL (RW)
- *
- * LOUT1 Volume
- * 1111111 = +6dB
- * … 1dB steps down to
- * 0110000 = -73dB
- * 0101111 to 0000000 = Analogue MUTE
- */
-#define WM8960_LOUT1_LOUT1VOL_MASK (0x7FU)
-#define WM8960_LOUT1_LOUT1VOL_SHIFT (0U)
-#define WM8960_LOUT1_LOUT1VOL_SET(x) (((uint16_t)(x) << WM8960_LOUT1_LOUT1VOL_SHIFT) & WM8960_LOUT1_LOUT1VOL_MASK)
-#define WM8960_LOUT1_LOUT1VOL_GET(x) (((uint16_t)(x) & WM8960_LOUT1_LOUT1VOL_MASK) >> WM8960_LOUT1_LOUT1VOL_SHIFT)
-
-/* Bitfield definition for register: ROUT1 */
-/*
- * OUT1VU (RW)
- *
- * Headphone Output PGA Volume Update
- * Writing a 1 to this bit will cause left and right
- * headphone output volumes to be updated
- * (LOUT1VOL and ROUT1VOL)
- */
-#define WM8960_ROUT1_OUT1VU_MASK (0x100U)
-#define WM8960_ROUT1_OUT1VU_SHIFT (8U)
-#define WM8960_ROUT1_OUT1VU_SET(x) (((uint16_t)(x) << WM8960_ROUT1_OUT1VU_SHIFT) & WM8960_ROUT1_OUT1VU_MASK)
-#define WM8960_ROUT1_OUT1VU_GET(x) (((uint16_t)(x) & WM8960_ROUT1_OUT1VU_MASK) >> WM8960_ROUT1_OUT1VU_SHIFT)
-
-/*
- * RO1ZC (RW)
- *
- * Right Headphone Output Zero Cross Enable
- * 0 = Change gain immediately
- * 1 = Change gain on zero cross only
- */
-#define WM8960_ROUT1_RO1ZC_MASK (0x80U)
-#define WM8960_ROUT1_RO1ZC_SHIFT (7U)
-#define WM8960_ROUT1_RO1ZC_SET(x) (((uint16_t)(x) << WM8960_ROUT1_RO1ZC_SHIFT) & WM8960_ROUT1_RO1ZC_MASK)
-#define WM8960_ROUT1_RO1ZC_GET(x) (((uint16_t)(x) & WM8960_ROUT1_RO1ZC_MASK) >> WM8960_ROUT1_RO1ZC_SHIFT)
-
-/*
- * ROUT1VOL (RW)
- *
- * ROUT1 Volume
- * 1111111 = +6dB
- * … 1dB steps down to
- * 0110000 = -73dB
- * 0101111 to 0000000 = Analogue MUTE
- */
-#define WM8960_ROUT1_ROUT1VOL_MASK (0x7FU)
-#define WM8960_ROUT1_ROUT1VOL_SHIFT (0U)
-#define WM8960_ROUT1_ROUT1VOL_SET(x) (((uint16_t)(x) << WM8960_ROUT1_ROUT1VOL_SHIFT) & WM8960_ROUT1_ROUT1VOL_MASK)
-#define WM8960_ROUT1_ROUT1VOL_GET(x) (((uint16_t)(x) & WM8960_ROUT1_ROUT1VOL_MASK) >> WM8960_ROUT1_ROUT1VOL_SHIFT)
-
-/* Bitfield definition for register: CLOCK1 */
-/*
- * ADCDIV (RW)
- *
- * ADC Sample rate divider (Also determines
- * ADCLRC in master mode)
- * 000 = SYSCLK / (1.0 * 256)
- * 001 = SYSCLK / (1.5 * 256)
- * 010 = SYSCLK / (2 * 256)
- * 011 = SYSCLK / (3 * 256)
- * 100 = SYSCLK / (4 * 256)
- * 101 = SYSCLK / (5.5 * 256)
- * 110 = SYSCLK / (6 * 256)
- * 111 = Reserved
- */
-#define WM8960_CLOCK1_ADCDIV_MASK (0x1C0U)
-#define WM8960_CLOCK1_ADCDIV_SHIFT (6U)
-#define WM8960_CLOCK1_ADCDIV_SET(x) (((uint16_t)(x) << WM8960_CLOCK1_ADCDIV_SHIFT) & WM8960_CLOCK1_ADCDIV_MASK)
-#define WM8960_CLOCK1_ADCDIV_GET(x) (((uint16_t)(x) & WM8960_CLOCK1_ADCDIV_MASK) >> WM8960_CLOCK1_ADCDIV_SHIFT)
-
-/*
- * DACDIV (RW)
- *
- * DAC Sample rate divider (Also determines
- * DACLRC in master mode)
- * 000 = SYSCLK / (1.0 * 256)
- * 001 = SYSCLK / (1.5 * 256)
- * 010 = SYSCLK / (2 * 256)
- * 011 = SYSCLK / (3 * 256)
- * 100 = SYSCLK / (4 * 256)
- * 101 = SYSCLK / (5.5 * 256)
- * 110 = SYSCLK / (6 * 256)
- * 111 = Reserved
- */
-#define WM8960_CLOCK1_DACDIV_MASK (0x38U)
-#define WM8960_CLOCK1_DACDIV_SHIFT (3U)
-#define WM8960_CLOCK1_DACDIV_SET(x) (((uint16_t)(x) << WM8960_CLOCK1_DACDIV_SHIFT) & WM8960_CLOCK1_DACDIV_MASK)
-#define WM8960_CLOCK1_DACDIV_GET(x) (((uint16_t)(x) & WM8960_CLOCK1_DACDIV_MASK) >> WM8960_CLOCK1_DACDIV_SHIFT)
-
-/*
- * SYSCLKDIV (RW)
- *
- * SYSCLK Pre-divider. Clock source (MCLK or
- * PLL output) will be divided by this value to
- * generate SYSCLK.
- * 00 = Divide SYSCLK by 1
- * 01 = Reserved
- * 10 = Divide SYSCLK by 2
- * 11 = Reserved
- */
-#define WM8960_CLOCK1_SYSCLKDIV_MASK (0x6U)
-#define WM8960_CLOCK1_SYSCLKDIV_SHIFT (1U)
-#define WM8960_CLOCK1_SYSCLKDIV_SET(x) (((uint16_t)(x) << WM8960_CLOCK1_SYSCLKDIV_SHIFT) & WM8960_CLOCK1_SYSCLKDIV_MASK)
-#define WM8960_CLOCK1_SYSCLKDIV_GET(x) (((uint16_t)(x) & WM8960_CLOCK1_SYSCLKDIV_MASK) >> WM8960_CLOCK1_SYSCLKDIV_SHIFT)
-
-/*
- * CLKSEL (RW)
- *
- * SYSCLK Selection
- * 0 = SYSCLK derived from MCLK
- * 1 = SYSCLK derived from PLL output
- */
-#define WM8960_CLOCK1_CLKSEL_MASK (0x1U)
-#define WM8960_CLOCK1_CLKSEL_SHIFT (0U)
-#define WM8960_CLOCK1_CLKSEL_SET(x) (((uint16_t)(x) << WM8960_CLOCK1_CLKSEL_SHIFT) & WM8960_CLOCK1_CLKSEL_MASK)
-#define WM8960_CLOCK1_CLKSEL_GET(x) (((uint16_t)(x) & WM8960_CLOCK1_CLKSEL_MASK) >> WM8960_CLOCK1_CLKSEL_SHIFT)
-
-/* Bitfield definition for register: DACCTL1 */
-/*
- * DACDIV2 (RW)
- *
- * DAC 6dB Attenuate Enable
- * 0 = Disabled (0dB)
- * 1 = -6dB Enabled
- */
-#define WM8960_DACCTL1_DACDIV2_MASK (0x80U)
-#define WM8960_DACCTL1_DACDIV2_SHIFT (7U)
-#define WM8960_DACCTL1_DACDIV2_SET(x) (((uint16_t)(x) << WM8960_DACCTL1_DACDIV2_SHIFT) & WM8960_DACCTL1_DACDIV2_MASK)
-#define WM8960_DACCTL1_DACDIV2_GET(x) (((uint16_t)(x) & WM8960_DACCTL1_DACDIV2_MASK) >> WM8960_DACCTL1_DACDIV2_SHIFT)
-
-/*
- * ADCPOL (RW)
- *
- * ADC polarity control:
- * 00 = Polarity not inverted
- * 01 = ADC L inverted
- * 10 = ADC R inverted
- * 11 = ADC L and R inverted
- */
-#define WM8960_DACCTL1_ADCPOL_MASK (0x60U)
-#define WM8960_DACCTL1_ADCPOL_SHIFT (5U)
-#define WM8960_DACCTL1_ADCPOL_SET(x) (((uint16_t)(x) << WM8960_DACCTL1_ADCPOL_SHIFT) & WM8960_DACCTL1_ADCPOL_MASK)
-#define WM8960_DACCTL1_ADCPOL_GET(x) (((uint16_t)(x) & WM8960_DACCTL1_ADCPOL_MASK) >> WM8960_DACCTL1_ADCPOL_SHIFT)
-
-/*
- * DACMU (RW)
- *
- * DAC Digital Soft Mute
- * 1 = Mute
- * 0 = No mute (signal active)
- */
-#define WM8960_DACCTL1_DACMU_MASK (0x8U)
-#define WM8960_DACCTL1_DACMU_SHIFT (3U)
-#define WM8960_DACCTL1_DACMU_SET(x) (((uint16_t)(x) << WM8960_DACCTL1_DACMU_SHIFT) & WM8960_DACCTL1_DACMU_MASK)
-#define WM8960_DACCTL1_DACMU_GET(x) (((uint16_t)(x) & WM8960_DACCTL1_DACMU_MASK) >> WM8960_DACCTL1_DACMU_SHIFT)
-
-/*
- * DEEMPH (RW)
- *
- * De-emphasis Control
- * 11 = 48kHz sample rate
- * 10 = 44.1kHz sample rate
- * 01 = 32kHz sample rate
- * 00 = No de-emphasis
- */
-#define WM8960_DACCTL1_DEEMPH_MASK (0x6U)
-#define WM8960_DACCTL1_DEEMPH_SHIFT (1U)
-#define WM8960_DACCTL1_DEEMPH_SET(x) (((uint16_t)(x) << WM8960_DACCTL1_DEEMPH_SHIFT) & WM8960_DACCTL1_DEEMPH_MASK)
-#define WM8960_DACCTL1_DEEMPH_GET(x) (((uint16_t)(x) & WM8960_DACCTL1_DEEMPH_MASK) >> WM8960_DACCTL1_DEEMPH_SHIFT)
-
-/*
- * ADCHPD (RW)
- *
- * ADC High Pass Filter Disable
- * 0 = Enable high pass filter on left and right channels
- * 1 = Disable high pass filter on left and right channels
- */
-#define WM8960_DACCTL1_ADCHPD_MASK (0x1U)
-#define WM8960_DACCTL1_ADCHPD_SHIFT (0U)
-#define WM8960_DACCTL1_ADCHPD_SET(x) (((uint16_t)(x) << WM8960_DACCTL1_ADCHPD_SHIFT) & WM8960_DACCTL1_ADCHPD_MASK)
-#define WM8960_DACCTL1_ADCHPD_GET(x) (((uint16_t)(x) & WM8960_DACCTL1_ADCHPD_MASK) >> WM8960_DACCTL1_ADCHPD_SHIFT)
-
-/* Bitfield definition for register: DACCTL2 */
-/*
- * DACPOL (RW)
- *
- * DAC polarity control:
- * 00 = Polarity not inverted
- * 01 = DAC L inverted
- * 10 = DAC R inverted
- * 11 = DAC L and R inverted
- */
-#define WM8960_DACCTL2_DACPOL_MASK (0x60U)
-#define WM8960_DACCTL2_DACPOL_SHIFT (5U)
-#define WM8960_DACCTL2_DACPOL_SET(x) (((uint16_t)(x) << WM8960_DACCTL2_DACPOL_SHIFT) & WM8960_DACCTL2_DACPOL_MASK)
-#define WM8960_DACCTL2_DACPOL_GET(x) (((uint16_t)(x) & WM8960_DACCTL2_DACPOL_MASK) >> WM8960_DACCTL2_DACPOL_SHIFT)
-
-/*
- * DACSMM (RW)
- *
- * DAC Soft Mute Mode
- * 0 = Disabling soft-mute (DACMU=0) will cause
- * the volume to change immediately to the
- * LDACVOL / RDACVOL settings
- * 1 = Disabling soft-mute (DACMU=0) will cause
- * the volume to ramp up gradually to the
- * LDACVOL / RDACVOL settings
- */
-#define WM8960_DACCTL2_DACSMM_MASK (0x8U)
-#define WM8960_DACCTL2_DACSMM_SHIFT (3U)
-#define WM8960_DACCTL2_DACSMM_SET(x) (((uint16_t)(x) << WM8960_DACCTL2_DACSMM_SHIFT) & WM8960_DACCTL2_DACSMM_MASK)
-#define WM8960_DACCTL2_DACSMM_GET(x) (((uint16_t)(x) & WM8960_DACCTL2_DACSMM_MASK) >> WM8960_DACCTL2_DACSMM_SHIFT)
-
-/*
- * DACMR (RW)
- *
- * DAC Soft Mute Ramp Rate
- * 0 = Fast ramp (24kHz at fs=48k, providing
- * maximum delay of 10.7ms)
- * 1 = Slow ramp (1.5kHz at fs=48k, providing
- * maximum delay of 171ms)
- */
-#define WM8960_DACCTL2_DACMR_MASK (0x4U)
-#define WM8960_DACCTL2_DACMR_SHIFT (2U)
-#define WM8960_DACCTL2_DACMR_SET(x) (((uint16_t)(x) << WM8960_DACCTL2_DACMR_SHIFT) & WM8960_DACCTL2_DACMR_MASK)
-#define WM8960_DACCTL2_DACMR_GET(x) (((uint16_t)(x) & WM8960_DACCTL2_DACMR_MASK) >> WM8960_DACCTL2_DACMR_SHIFT)
-
-/*
- * DACSLOPE (RW)
- *
- * Selects DAC filter characteristics
- * 0 = Normal mode
- * 1 = Sloping stopband
- */
-#define WM8960_DACCTL2_DACSLOPE_MASK (0x2U)
-#define WM8960_DACCTL2_DACSLOPE_SHIFT (1U)
-#define WM8960_DACCTL2_DACSLOPE_SET(x) (((uint16_t)(x) << WM8960_DACCTL2_DACSLOPE_SHIFT) & WM8960_DACCTL2_DACSLOPE_MASK)
-#define WM8960_DACCTL2_DACSLOPE_GET(x) (((uint16_t)(x) & WM8960_DACCTL2_DACSLOPE_MASK) >> WM8960_DACCTL2_DACSLOPE_SHIFT)
-
-/* Bitfield definition for register: IFACE1 */
-/*
- * ALRSWAP (RW)
- *
- * Left/Right ADC Channel Swap
- * 1 = Swap left and right ADC data in audio
- * interface
- * 0 = Output left and right data as normal
- */
-#define WM8960_IFACE1_ALRSWAP_MASK (0x100U)
-#define WM8960_IFACE1_ALRSWAP_SHIFT (8U)
-#define WM8960_IFACE1_ALRSWAP_SET(x) (((uint16_t)(x) << WM8960_IFACE1_ALRSWAP_SHIFT) & WM8960_IFACE1_ALRSWAP_MASK)
-#define WM8960_IFACE1_ALRSWAP_GET(x) (((uint16_t)(x) & WM8960_IFACE1_ALRSWAP_MASK) >> WM8960_IFACE1_ALRSWAP_SHIFT)
-
-/*
- * BCLKINV (RW)
- *
- * BCLK invert bit (for master and slave modes)
- * 0 = BCLK not inverted
- * 1 = BCLK inverted
- */
-#define WM8960_IFACE1_BCLKINV_MASK (0x80U)
-#define WM8960_IFACE1_BCLKINV_SHIFT (7U)
-#define WM8960_IFACE1_BCLKINV_SET(x) (((uint16_t)(x) << WM8960_IFACE1_BCLKINV_SHIFT) & WM8960_IFACE1_BCLKINV_MASK)
-#define WM8960_IFACE1_BCLKINV_GET(x) (((uint16_t)(x) & WM8960_IFACE1_BCLKINV_MASK) >> WM8960_IFACE1_BCLKINV_SHIFT)
-
-/*
- * MS (RW)
- *
- * Master / Slave Mode Control
- * 0 = Enable slave mode
- * 1 = Enable master mode
- */
-#define WM8960_IFACE1_MS_MASK (0x40U)
-#define WM8960_IFACE1_MS_SHIFT (6U)
-#define WM8960_IFACE1_MS_SET(x) (((uint16_t)(x) << WM8960_IFACE1_MS_SHIFT) & WM8960_IFACE1_MS_MASK)
-#define WM8960_IFACE1_MS_GET(x) (((uint16_t)(x) & WM8960_IFACE1_MS_MASK) >> WM8960_IFACE1_MS_SHIFT)
-
-/*
- * DLRSWAP (RW)
- *
- * Left/Right DAC Channel Swap
- * 0 = Output left and right data as normal
- * 1 = Swap left and right DAC data in audio interface
- */
-#define WM8960_IFACE1_DLRSWAP_MASK (0x20U)
-#define WM8960_IFACE1_DLRSWAP_SHIFT (5U)
-#define WM8960_IFACE1_DLRSWAP_SET(x) (((uint16_t)(x) << WM8960_IFACE1_DLRSWAP_SHIFT) & WM8960_IFACE1_DLRSWAP_MASK)
-#define WM8960_IFACE1_DLRSWAP_GET(x) (((uint16_t)(x) & WM8960_IFACE1_DLRSWAP_MASK) >> WM8960_IFACE1_DLRSWAP_SHIFT)
-
-/*
- * LRP (RW)
- *
- * Right, left and I2S modes – LRCLK polarity
- * 0 = normal LRCLK polarity
- * 1 = invert LRCLK polarity
- * DSP Mode – mode A/B select
- * 0 = MSB is available on 2nd BCLK rising edge after LRC rising edge (mode A)
- * 1 = MSB is available on 1st BCLK rising edge after LRC rising edge (mode B)
- */
-#define WM8960_IFACE1_LRP_MASK (0x10U)
-#define WM8960_IFACE1_LRP_SHIFT (4U)
-#define WM8960_IFACE1_LRP_SET(x) (((uint16_t)(x) << WM8960_IFACE1_LRP_SHIFT) & WM8960_IFACE1_LRP_MASK)
-#define WM8960_IFACE1_LRP_GET(x) (((uint16_t)(x) & WM8960_IFACE1_LRP_MASK) >> WM8960_IFACE1_LRP_SHIFT)
-
-/*
- * WL (RW)
- *
- * Audio Data Word Length
- * 00 = 16 bits
- * 01 = 20 bits
- * 10 = 24 bits
- * 11 = 32 bits (see Note)
- */
-#define WM8960_IFACE1_WL_MASK (0xCU)
-#define WM8960_IFACE1_WL_SHIFT (2U)
-#define WM8960_IFACE1_WL_SET(x) (((uint16_t)(x) << WM8960_IFACE1_WL_SHIFT) & WM8960_IFACE1_WL_MASK)
-#define WM8960_IFACE1_WL_GET(x) (((uint16_t)(x) & WM8960_IFACE1_WL_MASK) >> WM8960_IFACE1_WL_SHIFT)
-
-/*
- * FORMAT (RW)
- *
- * 00 = Right justified
- * 01 = Left justified
- * 10 = I2S Format
- * 11 = DSP Mode
- */
-#define WM8960_IFACE1_FORMAT_MASK (0x3U)
-#define WM8960_IFACE1_FORMAT_SHIFT (0U)
-#define WM8960_IFACE1_FORMAT_SET(x) (((uint16_t)(x) << WM8960_IFACE1_FORMAT_SHIFT) & WM8960_IFACE1_FORMAT_MASK)
-#define WM8960_IFACE1_FORMAT_GET(x) (((uint16_t)(x) & WM8960_IFACE1_FORMAT_MASK) >> WM8960_IFACE1_FORMAT_SHIFT)
-
-/* Bitfield definition for register: CLOCK2 */
-/*
- * DCLKDIV (RW)
- *
- * Class D switching clock divider.
- * 000 = SYSCLK / 1.5 (Not recommended)
- * 001 = SYSCLK / 2
- * 010 = SYSCLK / 3
- * 011 = SYSCLK / 4
- * 100 = SYSCLK / 6
- * 101 = SYSCLK / 8
- * 110 = SYSCLK / 12
- * 111 = SYSCLK / 16
- */
-#define WM8960_CLOCK2_DCLKDIV_MASK (0x1C0U)
-#define WM8960_CLOCK2_DCLKDIV_SHIFT (6U)
-#define WM8960_CLOCK2_DCLKDIV_SET(x) (((uint16_t)(x) << WM8960_CLOCK2_DCLKDIV_SHIFT) & WM8960_CLOCK2_DCLKDIV_MASK)
-#define WM8960_CLOCK2_DCLKDIV_GET(x) (((uint16_t)(x) & WM8960_CLOCK2_DCLKDIV_MASK) >> WM8960_CLOCK2_DCLKDIV_SHIFT)
-
-/*
- * BCLKDIV (RW)
- *
- * BCLK Frequency (Master Mode)
- * 0000 = SYSCLK
- * 0001 = SYSCLK / 1.5
- * 0010 = SYSCLK / 2
- * 0011 = SYSCLK / 3
- * 0100 = SYSCLK / 4
- * 0101 = SYSCLK / 5.5
- * 0110 = SYSCLK / 6
- * 0111 = SYSCLK / 8
- * 1000 = SYSCLK / 11
- * 1001 = SYSCLK / 12
- * 1010 = SYSCLK / 16
- * 1011 = SYSCLK / 22
- * 1100 = SYSCLK / 24
- * 1101 to 1111 = SYSCLK / 32
- */
-#define WM8960_CLOCK2_BCLKDIV_MASK (0xFU)
-#define WM8960_CLOCK2_BCLKDIV_SHIFT (0U)
-#define WM8960_CLOCK2_BCLKDIV_SET(x) (((uint16_t)(x) << WM8960_CLOCK2_BCLKDIV_SHIFT) & WM8960_CLOCK2_BCLKDIV_MASK)
-#define WM8960_CLOCK2_BCLKDIV_GET(x) (((uint16_t)(x) & WM8960_CLOCK2_BCLKDIV_MASK) >> WM8960_CLOCK2_BCLKDIV_SHIFT)
-
-/* Bitfield definition for register: IFACE2 */
-/*
- * ALRCGPIO (RW)
- *
- * ADCLRC/GPIO1 Pin Function Select
- * 0 = ADCLRC frame clock for ADC
- * 1 = GPIO pin
- */
-#define WM8960_IFACE2_ALRCGPIO_MASK (0x40U)
-#define WM8960_IFACE2_ALRCGPIO_SHIFT (6U)
-#define WM8960_IFACE2_ALRCGPIO_SET(x) (((uint16_t)(x) << WM8960_IFACE2_ALRCGPIO_SHIFT) & WM8960_IFACE2_ALRCGPIO_MASK)
-#define WM8960_IFACE2_ALRCGPIO_GET(x) (((uint16_t)(x) & WM8960_IFACE2_ALRCGPIO_MASK) >> WM8960_IFACE2_ALRCGPIO_SHIFT)
-
-/*
- * WL8 (RW)
- *
- * 8-Bit Word Length Select (Used with
- * companding)
- * 0 = Off
- * 1 = Device operates in 8-bit mode.
- */
-#define WM8960_IFACE2_WL8_MASK (0x20U)
-#define WM8960_IFACE2_WL8_SHIFT (5U)
-#define WM8960_IFACE2_WL8_SET(x) (((uint16_t)(x) << WM8960_IFACE2_WL8_SHIFT) & WM8960_IFACE2_WL8_MASK)
-#define WM8960_IFACE2_WL8_GET(x) (((uint16_t)(x) & WM8960_IFACE2_WL8_MASK) >> WM8960_IFACE2_WL8_SHIFT)
-
-/*
- * DACCOMP (RW)
- *
- * DAC companding
- * 00 = off
- * 01 = reserved
- * 10 = μ-law
- * 11 = A-law
- */
-#define WM8960_IFACE2_DACCOMP_MASK (0x18U)
-#define WM8960_IFACE2_DACCOMP_SHIFT (3U)
-#define WM8960_IFACE2_DACCOMP_SET(x) (((uint16_t)(x) << WM8960_IFACE2_DACCOMP_SHIFT) & WM8960_IFACE2_DACCOMP_MASK)
-#define WM8960_IFACE2_DACCOMP_GET(x) (((uint16_t)(x) & WM8960_IFACE2_DACCOMP_MASK) >> WM8960_IFACE2_DACCOMP_SHIFT)
-
-/*
- * ADCCOMP (RW)
- *
- * ADC companding
- * 00 = off
- * 01 = reserved
- * 10 = μ-law
- * 11 = A-law
- */
-#define WM8960_IFACE2_ADCCOMP_MASK (0x6U)
-#define WM8960_IFACE2_ADCCOMP_SHIFT (1U)
-#define WM8960_IFACE2_ADCCOMP_SET(x) (((uint16_t)(x) << WM8960_IFACE2_ADCCOMP_SHIFT) & WM8960_IFACE2_ADCCOMP_MASK)
-#define WM8960_IFACE2_ADCCOMP_GET(x) (((uint16_t)(x) & WM8960_IFACE2_ADCCOMP_MASK) >> WM8960_IFACE2_ADCCOMP_SHIFT)
-
-/*
- * LOOPBACK (RW)
- *
- * Digital Loopback Function
- * 0 = No loopback.
- * 1 = Loopback enabled, ADC data output is fed
- * directly into DAC data input
- */
-#define WM8960_IFACE2_LOOPBACK_MASK (0x1U)
-#define WM8960_IFACE2_LOOPBACK_SHIFT (0U)
-#define WM8960_IFACE2_LOOPBACK_SET(x) (((uint16_t)(x) << WM8960_IFACE2_LOOPBACK_SHIFT) & WM8960_IFACE2_LOOPBACK_MASK)
-#define WM8960_IFACE2_LOOPBACK_GET(x) (((uint16_t)(x) & WM8960_IFACE2_LOOPBACK_MASK) >> WM8960_IFACE2_LOOPBACK_SHIFT)
-
-/* Bitfield definition for register: LDAC */
-/*
- * DACVU (RW)
- *
- * DAC Volume Update
- * Writing a 1 to this bit will cause left and right
- * DAC volumes to be updated (LDACVOL and RDACVOL)
- */
-#define WM8960_LDAC_DACVU_MASK (0x100U)
-#define WM8960_LDAC_DACVU_SHIFT (8U)
-#define WM8960_LDAC_DACVU_SET(x) (((uint16_t)(x) << WM8960_LDAC_DACVU_SHIFT) & WM8960_LDAC_DACVU_MASK)
-#define WM8960_LDAC_DACVU_GET(x) (((uint16_t)(x) & WM8960_LDAC_DACVU_MASK) >> WM8960_LDAC_DACVU_SHIFT)
-
-/*
- * LDACVOL (RW)
- *
- * Left DAC Digital Volume Control
- * 0000 0000 = Digital Mute
- * 0000 0001 = -127dB
- * 0000 0010 = -126.5dB
- * ... 0.5dB steps up to
- * 1111 1111 = 0dB
- */
-#define WM8960_LDAC_LDACVOL_MASK (0xFFU)
-#define WM8960_LDAC_LDACVOL_SHIFT (0U)
-#define WM8960_LDAC_LDACVOL_SET(x) (((uint16_t)(x) << WM8960_LDAC_LDACVOL_SHIFT) & WM8960_LDAC_LDACVOL_MASK)
-#define WM8960_LDAC_LDACVOL_GET(x) (((uint16_t)(x) & WM8960_LDAC_LDACVOL_MASK) >> WM8960_LDAC_LDACVOL_SHIFT)
-
-/* Bitfield definition for register: RDAC */
-/*
- * DACVU (RW)
- *
- * DAC Volume Update
- * Writing a 1 to this bit will cause left and right
- * DAC volumes to be updated (LDACVOL and RDACVOL)
- */
-#define WM8960_RDAC_DACVU_MASK (0x100U)
-#define WM8960_RDAC_DACVU_SHIFT (8U)
-#define WM8960_RDAC_DACVU_SET(x) (((uint16_t)(x) << WM8960_RDAC_DACVU_SHIFT) & WM8960_RDAC_DACVU_MASK)
-#define WM8960_RDAC_DACVU_GET(x) (((uint16_t)(x) & WM8960_RDAC_DACVU_MASK) >> WM8960_RDAC_DACVU_SHIFT)
-
-/*
- * RDACVOL (RW)
- *
- * Right DAC Digital Volume Control
- * 0000 0000 = Digital Mute
- * 0000 0001 = -127dB
- * 0000 0010 = -126.5dB
- * ... 0.5dB steps up to
- * 1111 1111 = 0dB
- */
-#define WM8960_RDAC_RDACVOL_MASK (0xFFU)
-#define WM8960_RDAC_RDACVOL_SHIFT (0U)
-#define WM8960_RDAC_RDACVOL_SET(x) (((uint16_t)(x) << WM8960_RDAC_RDACVOL_SHIFT) & WM8960_RDAC_RDACVOL_MASK)
-#define WM8960_RDAC_RDACVOL_GET(x) (((uint16_t)(x) & WM8960_RDAC_RDACVOL_MASK) >> WM8960_RDAC_RDACVOL_SHIFT)
-
-/* Bitfield definition for register: RESET */
-/*
- * RESET (RW)
- *
- * Writing to this register resets all registers to their default state.
- */
-#define WM8960_RESET_RESET_MASK (0x1FFU)
-#define WM8960_RESET_RESET_SHIFT (0U)
-#define WM8960_RESET_RESET_SET(x) (((uint16_t)(x) << WM8960_RESET_RESET_SHIFT) & WM8960_RESET_RESET_MASK)
-#define WM8960_RESET_RESET_GET(x) (((uint16_t)(x) & WM8960_RESET_RESET_MASK) >> WM8960_RESET_RESET_SHIFT)
-
-/* Bitfield definition for register: 3D */
-/*
- * 3DUC (RW)
- *
- * 3D Enhance Filter Upper Cut-Off Frequency
- * 0 = High (Recommended for fs>=32kHz)
- * 1 = Low (Recommended for fs<32kHz)
- */
-#define WM8960_3D_3DUC_MASK (0x40U)
-#define WM8960_3D_3DUC_SHIFT (6U)
-#define WM8960_3D_3DUC_SET(x) (((uint16_t)(x) << WM8960_3D_3DUC_SHIFT) & WM8960_3D_3DUC_MASK)
-#define WM8960_3D_3DUC_GET(x) (((uint16_t)(x) & WM8960_3D_3DUC_MASK) >> WM8960_3D_3DUC_SHIFT)
-
-/*
- * 3DLC (RW)
- *
- * 3D Enhance Filter Lower Cut-Off Frequency
- * 0 = Low (Recommended for fs>=32kHz)
- * 1 = High (Recommended for fs<32kHz)
- */
-#define WM8960_3D_3DLC_MASK (0x20U)
-#define WM8960_3D_3DLC_SHIFT (5U)
-#define WM8960_3D_3DLC_SET(x) (((uint16_t)(x) << WM8960_3D_3DLC_SHIFT) & WM8960_3D_3DLC_MASK)
-#define WM8960_3D_3DLC_GET(x) (((uint16_t)(x) & WM8960_3D_3DLC_MASK) >> WM8960_3D_3DLC_SHIFT)
-
-/*
- * 3DDEPTH (RW)
- *
- * 3D Stereo Depth
- * 0000 = 0% (minimum 3D effect)
- * 0001 = 6.67%
- * ....
- * 1110 = 93.3%
- * 1111 = 100% (maximum 3D effect)
- */
-#define WM8960_3D_3DDEPTH_MASK (0x1EU)
-#define WM8960_3D_3DDEPTH_SHIFT (1U)
-#define WM8960_3D_3DDEPTH_SET(x) (((uint16_t)(x) << WM8960_3D_3DDEPTH_SHIFT) & WM8960_3D_3DDEPTH_MASK)
-#define WM8960_3D_3DDEPTH_GET(x) (((uint16_t)(x) & WM8960_3D_3DDEPTH_MASK) >> WM8960_3D_3DDEPTH_SHIFT)
-
-/*
- * 3DEN (RW)
- *
- * 3D Stereo Enhancement Enable
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_3D_3DEN_MASK (0x1U)
-#define WM8960_3D_3DEN_SHIFT (0U)
-#define WM8960_3D_3DEN_SET(x) (((uint16_t)(x) << WM8960_3D_3DEN_SHIFT) & WM8960_3D_3DEN_MASK)
-#define WM8960_3D_3DEN_GET(x) (((uint16_t)(x) & WM8960_3D_3DEN_MASK) >> WM8960_3D_3DEN_SHIFT)
-
-/* Bitfield definition for register: ALC1 */
-/*
- * ALCSEL (RW)
- *
- * ALC Function Select
- * 00 = ALC off (PGA gain set by register)
- * 01 = Right channel only
- * 10 = Left channel only
- * 11 = Stereo (PGA registers unused) Note:
- * ensure that LINVOL and RINVOL settings
- * (reg. 0 and 1) are the same before entering this mode.
- */
-#define WM8960_ALC1_ALCSEL_MASK (0x180U)
-#define WM8960_ALC1_ALCSEL_SHIFT (7U)
-#define WM8960_ALC1_ALCSEL_SET(x) (((uint16_t)(x) << WM8960_ALC1_ALCSEL_SHIFT) & WM8960_ALC1_ALCSEL_MASK)
-#define WM8960_ALC1_ALCSEL_GET(x) (((uint16_t)(x) & WM8960_ALC1_ALCSEL_MASK) >> WM8960_ALC1_ALCSEL_SHIFT)
-
-/*
- * MAXGAIN (RW)
- *
- * Set Maximum Gain of PGA (During ALC
- * operation)
- * 111 : +30dB
- * 110 : +24dB
- * ….(-6dB steps)
- * 001 : -6dB
- * 000 : -12dB
- */
-#define WM8960_ALC1_MAXGAIN_MASK (0x70U)
-#define WM8960_ALC1_MAXGAIN_SHIFT (4U)
-#define WM8960_ALC1_MAXGAIN_SET(x) (((uint16_t)(x) << WM8960_ALC1_MAXGAIN_SHIFT) & WM8960_ALC1_MAXGAIN_MASK)
-#define WM8960_ALC1_MAXGAIN_GET(x) (((uint16_t)(x) & WM8960_ALC1_MAXGAIN_MASK) >> WM8960_ALC1_MAXGAIN_SHIFT)
-
-/*
- * ALCL (RW)
- *
- * ALC Target (Sets signal level at ADC input)
- * 0000 = -22.5dB FS
- * 0001 = -21.0dB FS
- * … (1.5dB steps)
- * 1101 = -3.0dB FS
- * 1110 = -1.5dB FS
- * 1111 = -1.5dB FS
- */
-#define WM8960_ALC1_ALCL_MASK (0xFU)
-#define WM8960_ALC1_ALCL_SHIFT (0U)
-#define WM8960_ALC1_ALCL_SET(x) (((uint16_t)(x) << WM8960_ALC1_ALCL_SHIFT) & WM8960_ALC1_ALCL_MASK)
-#define WM8960_ALC1_ALCL_GET(x) (((uint16_t)(x) & WM8960_ALC1_ALCL_MASK) >> WM8960_ALC1_ALCL_SHIFT)
-
-/* Bitfield definition for register: ALC2 */
-/*
- * MINGAIN (RW)
- *
- * Set Minimum Gain of PGA (During ALC
- * operation)
- * 000 = -17.25dB
- * 001 = -11.25dB
- * 010 = -5.25dB
- * 011 = +0.75dB
- * 100 = +6.75dB
- * 101 = +12.75dB
- * 110 = +18.75dB
- * 111 = +24.75dB
- */
-#define WM8960_ALC2_MINGAIN_MASK (0x70U)
-#define WM8960_ALC2_MINGAIN_SHIFT (4U)
-#define WM8960_ALC2_MINGAIN_SET(x) (((uint16_t)(x) << WM8960_ALC2_MINGAIN_SHIFT) & WM8960_ALC2_MINGAIN_MASK)
-#define WM8960_ALC2_MINGAIN_GET(x) (((uint16_t)(x) & WM8960_ALC2_MINGAIN_MASK) >> WM8960_ALC2_MINGAIN_SHIFT)
-
-/*
- * HLD (RW)
- *
- * ALC hold time before gain is increased.
- * 0000 = 0ms
- * 0001 = 2.67ms
- * 0010 = 5.33ms
- * … (time doubles with every step)
- * 1111 = 43.691s
- */
-#define WM8960_ALC2_HLD_MASK (0xFU)
-#define WM8960_ALC2_HLD_SHIFT (0U)
-#define WM8960_ALC2_HLD_SET(x) (((uint16_t)(x) << WM8960_ALC2_HLD_SHIFT) & WM8960_ALC2_HLD_MASK)
-#define WM8960_ALC2_HLD_GET(x) (((uint16_t)(x) & WM8960_ALC2_HLD_MASK) >> WM8960_ALC2_HLD_SHIFT)
-
-/* Bitfield definition for register: ALC3 */
-/*
- * ALCMODE (RW)
- *
- * Determines the ALC mode of operation:
- * 0 = ALC mode
- * 1 = Limiter mode
- */
-#define WM8960_ALC3_ALCMODE_MASK (0x100U)
-#define WM8960_ALC3_ALCMODE_SHIFT (8U)
-#define WM8960_ALC3_ALCMODE_SET(x) (((uint16_t)(x) << WM8960_ALC3_ALCMODE_SHIFT) & WM8960_ALC3_ALCMODE_MASK)
-#define WM8960_ALC3_ALCMODE_GET(x) (((uint16_t)(x) & WM8960_ALC3_ALCMODE_MASK) >> WM8960_ALC3_ALCMODE_SHIFT)
-
-/*
- * DCY (RW)
- *
- * ALC decay (gain ramp-up) time
- * 0000 = 24ms
- * 0001 = 48ms
- * 0010 = 96ms
- * … (time doubles with every step)
- * 1010 or higher = 24.58s
- */
-#define WM8960_ALC3_DCY_MASK (0xF0U)
-#define WM8960_ALC3_DCY_SHIFT (4U)
-#define WM8960_ALC3_DCY_SET(x) (((uint16_t)(x) << WM8960_ALC3_DCY_SHIFT) & WM8960_ALC3_DCY_MASK)
-#define WM8960_ALC3_DCY_GET(x) (((uint16_t)(x) & WM8960_ALC3_DCY_MASK) >> WM8960_ALC3_DCY_SHIFT)
-
-/*
- * ATK (RW)
- *
- * ALC attack (gain ramp-down) time
- * 0000 = 6ms
- * 0001 = 12ms
- * 0010 = 24ms
- * … (time doubles with every step)
- * 1010 or higher = 6.14s
- */
-#define WM8960_ALC3_ATK_MASK (0xFU)
-#define WM8960_ALC3_ATK_SHIFT (0U)
-#define WM8960_ALC3_ATK_SET(x) (((uint16_t)(x) << WM8960_ALC3_ATK_SHIFT) & WM8960_ALC3_ATK_MASK)
-#define WM8960_ALC3_ATK_GET(x) (((uint16_t)(x) & WM8960_ALC3_ATK_MASK) >> WM8960_ALC3_ATK_SHIFT)
-
-/* Bitfield definition for register: NOISEG */
-/*
- * NGTH (RW)
- *
- * Noise gate threshold
- * 00000 -76.5dBfs
- * 00001 -75dBfs
- * … 1.5 dB steps
- * 11110 -31.5dBfs
- * 11111 -30dBfs
- */
-#define WM8960_NOISEG_NGTH_MASK (0xF8U)
-#define WM8960_NOISEG_NGTH_SHIFT (3U)
-#define WM8960_NOISEG_NGTH_SET(x) (((uint16_t)(x) << WM8960_NOISEG_NGTH_SHIFT) & WM8960_NOISEG_NGTH_MASK)
-#define WM8960_NOISEG_NGTH_GET(x) (((uint16_t)(x) & WM8960_NOISEG_NGTH_MASK) >> WM8960_NOISEG_NGTH_SHIFT)
-
-/*
- * NGAT (RW)
- *
- * Noise gate function enable
- * 0 = disable
- * 1 = enable
- */
-#define WM8960_NOISEG_NGAT_MASK (0x1U)
-#define WM8960_NOISEG_NGAT_SHIFT (0U)
-#define WM8960_NOISEG_NGAT_SET(x) (((uint16_t)(x) << WM8960_NOISEG_NGAT_SHIFT) & WM8960_NOISEG_NGAT_MASK)
-#define WM8960_NOISEG_NGAT_GET(x) (((uint16_t)(x) & WM8960_NOISEG_NGAT_MASK) >> WM8960_NOISEG_NGAT_SHIFT)
-
-/* Bitfield definition for register: LADC */
-/*
- * ADCVU (RW)
- *
- * ADC Volume Update
- * Writing a 1 to this bit will cause left and right
- * ADC volumes to be updated (LADCVOL and
- * RADCVOL)
- */
-#define WM8960_LADC_ADCVU_MASK (0x100U)
-#define WM8960_LADC_ADCVU_SHIFT (8U)
-#define WM8960_LADC_ADCVU_SET(x) (((uint16_t)(x) << WM8960_LADC_ADCVU_SHIFT) & WM8960_LADC_ADCVU_MASK)
-#define WM8960_LADC_ADCVU_GET(x) (((uint16_t)(x) & WM8960_LADC_ADCVU_MASK) >> WM8960_LADC_ADCVU_SHIFT)
-
-/*
- * LADCVOL (RW)
- *
- * Left ADC Digital Volume Control
- * 0000 0000 = Digital Mute
- * 0000 0001 = -97dB
- * 0000 0010 = -96.5dB
- * ... 0.5dB steps up to
- * 1111 1111 = +30dB
- */
-#define WM8960_LADC_LADCVOL_MASK (0xFFU)
-#define WM8960_LADC_LADCVOL_SHIFT (0U)
-#define WM8960_LADC_LADCVOL_SET(x) (((uint16_t)(x) << WM8960_LADC_LADCVOL_SHIFT) & WM8960_LADC_LADCVOL_MASK)
-#define WM8960_LADC_LADCVOL_GET(x) (((uint16_t)(x) & WM8960_LADC_LADCVOL_MASK) >> WM8960_LADC_LADCVOL_SHIFT)
-
-/* Bitfield definition for register: RADC */
-/*
- * ADCVU (RW)
- *
- * ADC Volume Update
- * Writing a 1 to this bit will cause left and right
- * ADC volumes to be updated (LADCVOL and RADCVOL)
- */
-#define WM8960_RADC_ADCVU_MASK (0x100U)
-#define WM8960_RADC_ADCVU_SHIFT (8U)
-#define WM8960_RADC_ADCVU_SET(x) (((uint16_t)(x) << WM8960_RADC_ADCVU_SHIFT) & WM8960_RADC_ADCVU_MASK)
-#define WM8960_RADC_ADCVU_GET(x) (((uint16_t)(x) & WM8960_RADC_ADCVU_MASK) >> WM8960_RADC_ADCVU_SHIFT)
-
-/*
- * RADCVOL (RW)
- *
- * Right ADC Digital Volume Control
- * 0000 0000 = Digital Mute
- * 0000 0001 = -97dB
- * 0000 0010 = -96.5dB
- * ... 0.5dB steps up to
- * 1111 1111 = +30dB
- */
-#define WM8960_RADC_RADCVOL_MASK (0xFFU)
-#define WM8960_RADC_RADCVOL_SHIFT (0U)
-#define WM8960_RADC_RADCVOL_SET(x) (((uint16_t)(x) << WM8960_RADC_RADCVOL_SHIFT) & WM8960_RADC_RADCVOL_MASK)
-#define WM8960_RADC_RADCVOL_GET(x) (((uint16_t)(x) & WM8960_RADC_RADCVOL_MASK) >> WM8960_RADC_RADCVOL_SHIFT)
-
-/* Bitfield definition for register: ADDCTL1 */
-/*
- * TSDEN (RW)
- *
- * Thermal Shutdown Enable
- * 0 = Thermal shutdown disabled
- * 1 = Thermal shutdown enabled
- * (TSENSEN must be enabled for this function to work)
- */
-#define WM8960_ADDCTL1_TSDEN_MASK (0x100U)
-#define WM8960_ADDCTL1_TSDEN_SHIFT (8U)
-#define WM8960_ADDCTL1_TSDEN_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_TSDEN_SHIFT) & WM8960_ADDCTL1_TSDEN_MASK)
-#define WM8960_ADDCTL1_TSDEN_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_TSDEN_MASK) >> WM8960_ADDCTL1_TSDEN_SHIFT)
-
-/*
- * VSEL (RW)
- *
- * Analogue Bias Optimisation
- * 00 = Reserved
- * 01 = Increased bias current optimized for
- * AVDD=2.7V
- * 1X = Lowest bias current, optimized for
- * AVDD=3.3V
- */
-#define WM8960_ADDCTL1_VSEL_MASK (0xC0U)
-#define WM8960_ADDCTL1_VSEL_SHIFT (6U)
-#define WM8960_ADDCTL1_VSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_VSEL_SHIFT) & WM8960_ADDCTL1_VSEL_MASK)
-#define WM8960_ADDCTL1_VSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_VSEL_MASK) >> WM8960_ADDCTL1_VSEL_SHIFT)
-
-/*
- * DMONOMIX (RW)
- *
- * DAC Mono Mix
- * 0 = Stereo
- * 1 = Mono (Mono MIX output on enabled DACs
- */
-#define WM8960_ADDCTL1_DMONOMIX_MASK (0x10U)
-#define WM8960_ADDCTL1_DMONOMIX_SHIFT (4U)
-#define WM8960_ADDCTL1_DMONOMIX_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_DMONOMIX_SHIFT) & WM8960_ADDCTL1_DMONOMIX_MASK)
-#define WM8960_ADDCTL1_DMONOMIX_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_DMONOMIX_MASK) >> WM8960_ADDCTL1_DMONOMIX_SHIFT)
-
-/*
- * DATSEL (RW)
- *
- * ADC Data Output Select
- * 00: left data = left ADC; right data =right ADC
- * 01: left data = left ADC; right data = left ADC
- * 10: left data = right ADC; right data =right ADC
- * 11: left data = right ADC; right data = left ADC
- */
-#define WM8960_ADDCTL1_DATSEL_MASK (0xCU)
-#define WM8960_ADDCTL1_DATSEL_SHIFT (2U)
-#define WM8960_ADDCTL1_DATSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_DATSEL_SHIFT) & WM8960_ADDCTL1_DATSEL_MASK)
-#define WM8960_ADDCTL1_DATSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_DATSEL_MASK) >> WM8960_ADDCTL1_DATSEL_SHIFT)
-
-/*
- * TOCLKSEL (RW)
- *
- * Slow Clock Select (Used for volume update
- * timeouts and for jack detect debounce)
- * 0 = SYSCLK / 221 (Slower Response)
- * 1 = SYSCLK / 219 (Faster Response)
- */
-#define WM8960_ADDCTL1_TOCLKSEL_MASK (0x2U)
-#define WM8960_ADDCTL1_TOCLKSEL_SHIFT (1U)
-#define WM8960_ADDCTL1_TOCLKSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_TOCLKSEL_SHIFT) & WM8960_ADDCTL1_TOCLKSEL_MASK)
-#define WM8960_ADDCTL1_TOCLKSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_TOCLKSEL_MASK) >> WM8960_ADDCTL1_TOCLKSEL_SHIFT)
-
-/*
- * TOEN (RW)
- *
- * Enables Slow Clock for Volume Update Timeout
- * and Jack Detect Debounce
- * 0 = Slow clock disabled
- * 1 = Slow clock enabled
- */
-#define WM8960_ADDCTL1_TOEN_MASK (0x1U)
-#define WM8960_ADDCTL1_TOEN_SHIFT (0U)
-#define WM8960_ADDCTL1_TOEN_SET(x) (((uint16_t)(x) << WM8960_ADDCTL1_TOEN_SHIFT) & WM8960_ADDCTL1_TOEN_MASK)
-#define WM8960_ADDCTL1_TOEN_GET(x) (((uint16_t)(x) & WM8960_ADDCTL1_TOEN_MASK) >> WM8960_ADDCTL1_TOEN_SHIFT)
-
-/* Bitfield definition for register: ADDCTL2 */
-/*
- * HPSWEN (RW)
- *
- * Headphone Switch Enable
- * 0 = Headphone switch disabled
- * 1 = Headphone switch enabled
- */
-#define WM8960_ADDCTL2_HPSWEN_MASK (0x40U)
-#define WM8960_ADDCTL2_HPSWEN_SHIFT (6U)
-#define WM8960_ADDCTL2_HPSWEN_SET(x) (((uint16_t)(x) << WM8960_ADDCTL2_HPSWEN_SHIFT) & WM8960_ADDCTL2_HPSWEN_MASK)
-#define WM8960_ADDCTL2_HPSWEN_GET(x) (((uint16_t)(x) & WM8960_ADDCTL2_HPSWEN_MASK) >> WM8960_ADDCTL2_HPSWEN_SHIFT)
-
-/*
- * HPSWPOL (RW)
- *
- * Headphone Switch Polarity
- * 0 = HPDETECT high = headphone
- * 1 = HPDETECT high = speaker
- */
-#define WM8960_ADDCTL2_HPSWPOL_MASK (0x20U)
-#define WM8960_ADDCTL2_HPSWPOL_SHIFT (5U)
-#define WM8960_ADDCTL2_HPSWPOL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL2_HPSWPOL_SHIFT) & WM8960_ADDCTL2_HPSWPOL_MASK)
-#define WM8960_ADDCTL2_HPSWPOL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL2_HPSWPOL_MASK) >> WM8960_ADDCTL2_HPSWPOL_SHIFT)
-
-/*
- * TRIS (RW)
- *
- * Tristates ADCDAT and switches ADCLRC,
- * DACLRC and BCLK to inputs.
- * 0 = ADCDAT is an output; ADCLRC, DACLRC
- * and BCLK are inputs (slave mode) or outputs
- * (master mode)
- * 1 = ADCDAT is tristated; DACLRC and BCLK
- * are inputs; ADCLRC is an input (when not
- * configured as a GPIO)
- */
-#define WM8960_ADDCTL2_TRIS_MASK (0x8U)
-#define WM8960_ADDCTL2_TRIS_SHIFT (3U)
-#define WM8960_ADDCTL2_TRIS_SET(x) (((uint16_t)(x) << WM8960_ADDCTL2_TRIS_SHIFT) & WM8960_ADDCTL2_TRIS_MASK)
-#define WM8960_ADDCTL2_TRIS_GET(x) (((uint16_t)(x) & WM8960_ADDCTL2_TRIS_MASK) >> WM8960_ADDCTL2_TRIS_SHIFT)
-
-/*
- * LRCM (RW)
- *
- * Selects disable mode for ADCLRC and DACLRC
- * (Master mode)
- * 0 = ADCLRC disabled when ADC (Left and
- * Right) disabled; DACLRC disabled when
- * DAC (Left and Right) disabled.
- * 1 = ADCLRC and DACLRC disabled only when
- * ADC (Left and Right) and DAC (Left and Right)
- * are disabled.
- */
-#define WM8960_ADDCTL2_LRCM_MASK (0x4U)
-#define WM8960_ADDCTL2_LRCM_SHIFT (2U)
-#define WM8960_ADDCTL2_LRCM_SET(x) (((uint16_t)(x) << WM8960_ADDCTL2_LRCM_SHIFT) & WM8960_ADDCTL2_LRCM_MASK)
-#define WM8960_ADDCTL2_LRCM_GET(x) (((uint16_t)(x) & WM8960_ADDCTL2_LRCM_MASK) >> WM8960_ADDCTL2_LRCM_SHIFT)
-
-/* Bitfield definition for register: POWER1 */
-/*
- * VMIDSEL (RW)
- *
- * Vmid Divider Enable and Select
- * 00 = Vmid disabled (for OFF mode)
- * 01 = 2 x 50k divider enabled (for playback /
- * record)
- * 10 = 2 x 250k divider enabled (for low-power
- * standby)
- * 11 = 2 x 5k divider enabled (for fast start-up)
- */
-#define WM8960_POWER1_VMIDSEL_MASK (0x180U)
-#define WM8960_POWER1_VMIDSEL_SHIFT (7U)
-#define WM8960_POWER1_VMIDSEL_SET(x) (((uint16_t)(x) << WM8960_POWER1_VMIDSEL_SHIFT) & WM8960_POWER1_VMIDSEL_MASK)
-#define WM8960_POWER1_VMIDSEL_GET(x) (((uint16_t)(x) & WM8960_POWER1_VMIDSEL_MASK) >> WM8960_POWER1_VMIDSEL_SHIFT)
-
-/*
- * VREF (RW)
- *
- * VREF (necessary for all other functions)
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_VREF_MASK (0x40U)
-#define WM8960_POWER1_VREF_SHIFT (6U)
-#define WM8960_POWER1_VREF_SET(x) (((uint16_t)(x) << WM8960_POWER1_VREF_SHIFT) & WM8960_POWER1_VREF_MASK)
-#define WM8960_POWER1_VREF_GET(x) (((uint16_t)(x) & WM8960_POWER1_VREF_MASK) >> WM8960_POWER1_VREF_SHIFT)
-
-/*
- * AINL (RW)
- *
- * Analogue in PGA Left
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_AINL_MASK (0x20U)
-#define WM8960_POWER1_AINL_SHIFT (5U)
-#define WM8960_POWER1_AINL_SET(x) (((uint16_t)(x) << WM8960_POWER1_AINL_SHIFT) & WM8960_POWER1_AINL_MASK)
-#define WM8960_POWER1_AINL_GET(x) (((uint16_t)(x) & WM8960_POWER1_AINL_MASK) >> WM8960_POWER1_AINL_SHIFT)
-
-/*
- * AINR (RW)
- *
- * Analogue in PGA Right
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_AINR_MASK (0x10U)
-#define WM8960_POWER1_AINR_SHIFT (4U)
-#define WM8960_POWER1_AINR_SET(x) (((uint16_t)(x) << WM8960_POWER1_AINR_SHIFT) & WM8960_POWER1_AINR_MASK)
-#define WM8960_POWER1_AINR_GET(x) (((uint16_t)(x) & WM8960_POWER1_AINR_MASK) >> WM8960_POWER1_AINR_SHIFT)
-
-/*
- * ADCL (RW)
- *
- * ADC Left
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_ADCL_MASK (0x8U)
-#define WM8960_POWER1_ADCL_SHIFT (3U)
-#define WM8960_POWER1_ADCL_SET(x) (((uint16_t)(x) << WM8960_POWER1_ADCL_SHIFT) & WM8960_POWER1_ADCL_MASK)
-#define WM8960_POWER1_ADCL_GET(x) (((uint16_t)(x) & WM8960_POWER1_ADCL_MASK) >> WM8960_POWER1_ADCL_SHIFT)
-
-/*
- * ADCR (RW)
- *
- * ADC Right
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_ADCR_MASK (0x4U)
-#define WM8960_POWER1_ADCR_SHIFT (2U)
-#define WM8960_POWER1_ADCR_SET(x) (((uint16_t)(x) << WM8960_POWER1_ADCR_SHIFT) & WM8960_POWER1_ADCR_MASK)
-#define WM8960_POWER1_ADCR_GET(x) (((uint16_t)(x) & WM8960_POWER1_ADCR_MASK) >> WM8960_POWER1_ADCR_SHIFT)
-
-/*
- * MICB (RW)
- *
- * MICBIAS
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER1_MICB_MASK (0x2U)
-#define WM8960_POWER1_MICB_SHIFT (1U)
-#define WM8960_POWER1_MICB_SET(x) (((uint16_t)(x) << WM8960_POWER1_MICB_SHIFT) & WM8960_POWER1_MICB_MASK)
-#define WM8960_POWER1_MICB_GET(x) (((uint16_t)(x) & WM8960_POWER1_MICB_MASK) >> WM8960_POWER1_MICB_SHIFT)
-
-/*
- * DIGENB (RW)
- *
- * Master Clock Disable
- * 0 = Master clock enabled
- * 1 = Master clock disabled
- */
-#define WM8960_POWER1_DIGENB_MASK (0x1U)
-#define WM8960_POWER1_DIGENB_SHIFT (0U)
-#define WM8960_POWER1_DIGENB_SET(x) (((uint16_t)(x) << WM8960_POWER1_DIGENB_SHIFT) & WM8960_POWER1_DIGENB_MASK)
-#define WM8960_POWER1_DIGENB_GET(x) (((uint16_t)(x) & WM8960_POWER1_DIGENB_MASK) >> WM8960_POWER1_DIGENB_SHIFT)
-
-/* Bitfield definition for register: POWER2 */
-/*
- * DACL (RW)
- *
- * DAC Left
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_DACL_MASK (0x100U)
-#define WM8960_POWER2_DACL_SHIFT (8U)
-#define WM8960_POWER2_DACL_SET(x) (((uint16_t)(x) << WM8960_POWER2_DACL_SHIFT) & WM8960_POWER2_DACL_MASK)
-#define WM8960_POWER2_DACL_GET(x) (((uint16_t)(x) & WM8960_POWER2_DACL_MASK) >> WM8960_POWER2_DACL_SHIFT)
-
-/*
- * DACR (RW)
- *
- * DAC Right
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_DACR_MASK (0x80U)
-#define WM8960_POWER2_DACR_SHIFT (7U)
-#define WM8960_POWER2_DACR_SET(x) (((uint16_t)(x) << WM8960_POWER2_DACR_SHIFT) & WM8960_POWER2_DACR_MASK)
-#define WM8960_POWER2_DACR_GET(x) (((uint16_t)(x) & WM8960_POWER2_DACR_MASK) >> WM8960_POWER2_DACR_SHIFT)
-
-/*
- * LOUT1 (RW)
- *
- * LOUT1 Output Buffer
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_LOUT1_MASK (0x40U)
-#define WM8960_POWER2_LOUT1_SHIFT (6U)
-#define WM8960_POWER2_LOUT1_SET(x) (((uint16_t)(x) << WM8960_POWER2_LOUT1_SHIFT) & WM8960_POWER2_LOUT1_MASK)
-#define WM8960_POWER2_LOUT1_GET(x) (((uint16_t)(x) & WM8960_POWER2_LOUT1_MASK) >> WM8960_POWER2_LOUT1_SHIFT)
-
-/*
- * ROUT1 (RW)
- *
- * ROUT1 Output Buffer
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_ROUT1_MASK (0x20U)
-#define WM8960_POWER2_ROUT1_SHIFT (5U)
-#define WM8960_POWER2_ROUT1_SET(x) (((uint16_t)(x) << WM8960_POWER2_ROUT1_SHIFT) & WM8960_POWER2_ROUT1_MASK)
-#define WM8960_POWER2_ROUT1_GET(x) (((uint16_t)(x) & WM8960_POWER2_ROUT1_MASK) >> WM8960_POWER2_ROUT1_SHIFT)
-
-/*
- * SPKL (RW)
- *
- * SPK_LP/SPK_LN Output Buffers
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_SPKL_MASK (0x10U)
-#define WM8960_POWER2_SPKL_SHIFT (4U)
-#define WM8960_POWER2_SPKL_SET(x) (((uint16_t)(x) << WM8960_POWER2_SPKL_SHIFT) & WM8960_POWER2_SPKL_MASK)
-#define WM8960_POWER2_SPKL_GET(x) (((uint16_t)(x) & WM8960_POWER2_SPKL_MASK) >> WM8960_POWER2_SPKL_SHIFT)
-
-/*
- * SPKR (RW)
- *
- * SPK_RP/SPK_RN Output Buffers
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_SPKR_MASK (0x8U)
-#define WM8960_POWER2_SPKR_SHIFT (3U)
-#define WM8960_POWER2_SPKR_SET(x) (((uint16_t)(x) << WM8960_POWER2_SPKR_SHIFT) & WM8960_POWER2_SPKR_MASK)
-#define WM8960_POWER2_SPKR_GET(x) (((uint16_t)(x) & WM8960_POWER2_SPKR_MASK) >> WM8960_POWER2_SPKR_SHIFT)
-
-/*
- * OUT3 (RW)
- *
- * OUT3 Output Buffer
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_OUT3_MASK (0x2U)
-#define WM8960_POWER2_OUT3_SHIFT (1U)
-#define WM8960_POWER2_OUT3_SET(x) (((uint16_t)(x) << WM8960_POWER2_OUT3_SHIFT) & WM8960_POWER2_OUT3_MASK)
-#define WM8960_POWER2_OUT3_GET(x) (((uint16_t)(x) & WM8960_POWER2_OUT3_MASK) >> WM8960_POWER2_OUT3_SHIFT)
-
-/*
- * PLL_EN (RW)
- *
- * PLL Enable
- * 0 = Power down
- * 1 = Power up
- */
-#define WM8960_POWER2_PLL_EN_MASK (0x1U)
-#define WM8960_POWER2_PLL_EN_SHIFT (0U)
-#define WM8960_POWER2_PLL_EN_SET(x) (((uint16_t)(x) << WM8960_POWER2_PLL_EN_SHIFT) & WM8960_POWER2_PLL_EN_MASK)
-#define WM8960_POWER2_PLL_EN_GET(x) (((uint16_t)(x) & WM8960_POWER2_PLL_EN_MASK) >> WM8960_POWER2_PLL_EN_SHIFT)
-
-/* Bitfield definition for register: ADDCTL3 */
-/*
- * VROI (RW)
- *
- * VREF to Analogue Output Resistance (Disabled
- * Outputs)
- * 0 = 500 VMID to output
- * 1 = 20k VMID to output
- */
-#define WM8960_ADDCTL3_VROI_MASK (0x40U)
-#define WM8960_ADDCTL3_VROI_SHIFT (6U)
-#define WM8960_ADDCTL3_VROI_SET(x) (((uint16_t)(x) << WM8960_ADDCTL3_VROI_SHIFT) & WM8960_ADDCTL3_VROI_MASK)
-#define WM8960_ADDCTL3_VROI_GET(x) (((uint16_t)(x) & WM8960_ADDCTL3_VROI_MASK) >> WM8960_ADDCTL3_VROI_SHIFT)
-
-/*
- * OUT3CAP (RW)
- *
- * Capless Mode Headphone Switch Enable
- * 0 = OUT3 unaffected by jack detect events
- * 1 = OUT3 enabled and disabled together with
- * HP_L and HP_R in response to jack detect
- * events
- */
-#define WM8960_ADDCTL3_OUT3CAP_MASK (0x8U)
-#define WM8960_ADDCTL3_OUT3CAP_SHIFT (3U)
-#define WM8960_ADDCTL3_OUT3CAP_SET(x) (((uint16_t)(x) << WM8960_ADDCTL3_OUT3CAP_SHIFT) & WM8960_ADDCTL3_OUT3CAP_MASK)
-#define WM8960_ADDCTL3_OUT3CAP_GET(x) (((uint16_t)(x) & WM8960_ADDCTL3_OUT3CAP_MASK) >> WM8960_ADDCTL3_OUT3CAP_SHIFT)
-
-/*
- * ADC_ALC_SR (RW)
- *
- * ALC Sample Rate
- * 000 = 44.1k / 48k
- * 001 = 32k
- * 010 = 22.05k / 24k
- * 011 = 16k
- * 100 = 11.25k / 12k
- * 101 = 8k
- * 110 and 111 = Reserved
- */
-#define WM8960_ADDCTL3_ADC_ALC_SR_MASK (0x7U)
-#define WM8960_ADDCTL3_ADC_ALC_SR_SHIFT (0U)
-#define WM8960_ADDCTL3_ADC_ALC_SR_SET(x) (((uint16_t)(x) << WM8960_ADDCTL3_ADC_ALC_SR_SHIFT) & WM8960_ADDCTL3_ADC_ALC_SR_MASK)
-#define WM8960_ADDCTL3_ADC_ALC_SR_GET(x) (((uint16_t)(x) & WM8960_ADDCTL3_ADC_ALC_SR_MASK) >> WM8960_ADDCTL3_ADC_ALC_SR_SHIFT)
-
-/* Bitfield definition for register: APOP1 */
-/*
- * POBCTRL (RW)
- *
- * Selects the bias current source for output
- * amplifiers and VMID buffer
- * 0 = VMID / R bias
- * 1 = VGS / R bias
- */
-#define WM8960_APOP1_POBCTRL_MASK (0x80U)
-#define WM8960_APOP1_POBCTRL_SHIFT (7U)
-#define WM8960_APOP1_POBCTRL_SET(x) (((uint16_t)(x) << WM8960_APOP1_POBCTRL_SHIFT) & WM8960_APOP1_POBCTRL_MASK)
-#define WM8960_APOP1_POBCTRL_GET(x) (((uint16_t)(x) & WM8960_APOP1_POBCTRL_MASK) >> WM8960_APOP1_POBCTRL_SHIFT)
-
-/*
- * BUFDCOPEN (RW)
- *
- * Enables the VGS / R current generator
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_APOP1_BUFDCOPEN_MASK (0x10U)
-#define WM8960_APOP1_BUFDCOPEN_SHIFT (4U)
-#define WM8960_APOP1_BUFDCOPEN_SET(x) (((uint16_t)(x) << WM8960_APOP1_BUFDCOPEN_SHIFT) & WM8960_APOP1_BUFDCOPEN_MASK)
-#define WM8960_APOP1_BUFDCOPEN_GET(x) (((uint16_t)(x) & WM8960_APOP1_BUFDCOPEN_MASK) >> WM8960_APOP1_BUFDCOPEN_SHIFT)
-
-/*
- * BUFIOEN (RW)
- *
- * Enables the VGS / R current generator and the
- * analogue input and output bias
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_APOP1_BUFIOEN_MASK (0x8U)
-#define WM8960_APOP1_BUFIOEN_SHIFT (3U)
-#define WM8960_APOP1_BUFIOEN_SET(x) (((uint16_t)(x) << WM8960_APOP1_BUFIOEN_SHIFT) & WM8960_APOP1_BUFIOEN_MASK)
-#define WM8960_APOP1_BUFIOEN_GET(x) (((uint16_t)(x) & WM8960_APOP1_BUFIOEN_MASK) >> WM8960_APOP1_BUFIOEN_SHIFT)
-
-/*
- * SOFT_ST (RW)
- *
- * Enables VMID soft start
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_APOP1_SOFT_ST_MASK (0x4U)
-#define WM8960_APOP1_SOFT_ST_SHIFT (2U)
-#define WM8960_APOP1_SOFT_ST_SET(x) (((uint16_t)(x) << WM8960_APOP1_SOFT_ST_SHIFT) & WM8960_APOP1_SOFT_ST_MASK)
-#define WM8960_APOP1_SOFT_ST_GET(x) (((uint16_t)(x) & WM8960_APOP1_SOFT_ST_MASK) >> WM8960_APOP1_SOFT_ST_SHIFT)
-
-/*
- * HPSTBY (RW)
- *
- * Headphone Amplifier Standby
- * 0 = Standby mode disabled (Normal operation)
- * 1 = Standby mode enabled
- */
-#define WM8960_APOP1_HPSTBY_MASK (0x1U)
-#define WM8960_APOP1_HPSTBY_SHIFT (0U)
-#define WM8960_APOP1_HPSTBY_SET(x) (((uint16_t)(x) << WM8960_APOP1_HPSTBY_SHIFT) & WM8960_APOP1_HPSTBY_MASK)
-#define WM8960_APOP1_HPSTBY_GET(x) (((uint16_t)(x) & WM8960_APOP1_HPSTBY_MASK) >> WM8960_APOP1_HPSTBY_SHIFT)
-
-/* Bitfield definition for register: APOP2 */
-/*
- * DISOP (RW)
- *
- * Discharges the DC-blocking headphone
- * capacitors on HP_L and HP_R
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_APOP2_DISOP_MASK (0x40U)
-#define WM8960_APOP2_DISOP_SHIFT (6U)
-#define WM8960_APOP2_DISOP_SET(x) (((uint16_t)(x) << WM8960_APOP2_DISOP_SHIFT) & WM8960_APOP2_DISOP_MASK)
-#define WM8960_APOP2_DISOP_GET(x) (((uint16_t)(x) & WM8960_APOP2_DISOP_MASK) >> WM8960_APOP2_DISOP_SHIFT)
-
-/*
- * DRES (RW)
- *
- * DRES determines the value of the resistors used
- * to discharge the DC-blocking headphone
- * capacitors when DISOP=1
- * DRES[1:0] Resistance (Ohms)
- * 0 0 400
- * 0 1 200
- * 1 0 600
- * 1 1 150
- */
-#define WM8960_APOP2_DRES_MASK (0x30U)
-#define WM8960_APOP2_DRES_SHIFT (4U)
-#define WM8960_APOP2_DRES_SET(x) (((uint16_t)(x) << WM8960_APOP2_DRES_SHIFT) & WM8960_APOP2_DRES_MASK)
-#define WM8960_APOP2_DRES_GET(x) (((uint16_t)(x) & WM8960_APOP2_DRES_MASK) >> WM8960_APOP2_DRES_SHIFT)
-
-/* Bitfield definition for register: LINPATH */
-/*
- * LMN1 (RW)
- *
- * Connect LINPUT1 to inverting input of Left Input
- * PGA
- * 0 = LINPUT1 not connected to PGA
- * 1 = LINPUT1 connected to PGA
- */
-#define WM8960_LINPATH_LMN1_MASK (0x100U)
-#define WM8960_LINPATH_LMN1_SHIFT (8U)
-#define WM8960_LINPATH_LMN1_SET(x) (((uint16_t)(x) << WM8960_LINPATH_LMN1_SHIFT) & WM8960_LINPATH_LMN1_MASK)
-#define WM8960_LINPATH_LMN1_GET(x) (((uint16_t)(x) & WM8960_LINPATH_LMN1_MASK) >> WM8960_LINPATH_LMN1_SHIFT)
-
-/*
- * LMP3 (RW)
- *
- * Connect LINPUT3 to non-inverting input of Left
- * Input PGA
- * 0 = LINPUT3 not connected to PGA
- * 1 = LINPUT3 connected to PGA (Constant input
- * impedance)
- */
-#define WM8960_LINPATH_LMP3_MASK (0x80U)
-#define WM8960_LINPATH_LMP3_SHIFT (7U)
-#define WM8960_LINPATH_LMP3_SET(x) (((uint16_t)(x) << WM8960_LINPATH_LMP3_SHIFT) & WM8960_LINPATH_LMP3_MASK)
-#define WM8960_LINPATH_LMP3_GET(x) (((uint16_t)(x) & WM8960_LINPATH_LMP3_MASK) >> WM8960_LINPATH_LMP3_SHIFT)
-
-/*
- * LMP2 (RW)
- *
- * Connect LINPUT2 to non-inverting input of Left
- * Input PGA
- * 0 = LINPUT2 not connected to PGA
- * 1 = LINPUT2 connected to PGA (Constant input impedance)
- */
-#define WM8960_LINPATH_LMP2_MASK (0x40U)
-#define WM8960_LINPATH_LMP2_SHIFT (6U)
-#define WM8960_LINPATH_LMP2_SET(x) (((uint16_t)(x) << WM8960_LINPATH_LMP2_SHIFT) & WM8960_LINPATH_LMP2_MASK)
-#define WM8960_LINPATH_LMP2_GET(x) (((uint16_t)(x) & WM8960_LINPATH_LMP2_MASK) >> WM8960_LINPATH_LMP2_SHIFT)
-
-/*
- * LMICBOOST (RW)
- *
- * Left Channel Input PGA Boost Gain
- * 00 = +0dB
- * 01 = +13dB
- * 10 = +20dB
- * 11 = +29dB
- */
-#define WM8960_LINPATH_LMICBOOST_MASK (0x30U)
-#define WM8960_LINPATH_LMICBOOST_SHIFT (4U)
-#define WM8960_LINPATH_LMICBOOST_SET(x) (((uint16_t)(x) << WM8960_LINPATH_LMICBOOST_SHIFT) & WM8960_LINPATH_LMICBOOST_MASK)
-#define WM8960_LINPATH_LMICBOOST_GET(x) (((uint16_t)(x) & WM8960_LINPATH_LMICBOOST_MASK) >> WM8960_LINPATH_LMICBOOST_SHIFT)
-
-/*
- * LMIC2B (RW)
- *
- * Connect Left Input PGA to Left Input Boost Mixer
- * 0 = Not connected
- * 1 = Connected
- */
-#define WM8960_LINPATH_LMIC2B_MASK (0x8U)
-#define WM8960_LINPATH_LMIC2B_SHIFT (3U)
-#define WM8960_LINPATH_LMIC2B_SET(x) (((uint16_t)(x) << WM8960_LINPATH_LMIC2B_SHIFT) & WM8960_LINPATH_LMIC2B_MASK)
-#define WM8960_LINPATH_LMIC2B_GET(x) (((uint16_t)(x) & WM8960_LINPATH_LMIC2B_MASK) >> WM8960_LINPATH_LMIC2B_SHIFT)
-
-/* Bitfield definition for register: RINPATH */
-/*
- * RMN1 (RW)
- *
- * Connect RINPUT1 to inverting input of Right
- * Input PGA
- * 0 = RINPUT1 not connected to PGA
- * 1 = RINPUT1 connected to PGA
- */
-#define WM8960_RINPATH_RMN1_MASK (0x100U)
-#define WM8960_RINPATH_RMN1_SHIFT (8U)
-#define WM8960_RINPATH_RMN1_SET(x) (((uint16_t)(x) << WM8960_RINPATH_RMN1_SHIFT) & WM8960_RINPATH_RMN1_MASK)
-#define WM8960_RINPATH_RMN1_GET(x) (((uint16_t)(x) & WM8960_RINPATH_RMN1_MASK) >> WM8960_RINPATH_RMN1_SHIFT)
-
-/*
- * RMP3 (RW)
- *
- * Connect RINPUT3 to non-inverting input of Right
- * Input PGA
- * 0 = RINPUT3 not connected to PGA
- * 1 = RINPUT3 connected to PGA (Constant input impedance)
- */
-#define WM8960_RINPATH_RMP3_MASK (0x80U)
-#define WM8960_RINPATH_RMP3_SHIFT (7U)
-#define WM8960_RINPATH_RMP3_SET(x) (((uint16_t)(x) << WM8960_RINPATH_RMP3_SHIFT) & WM8960_RINPATH_RMP3_MASK)
-#define WM8960_RINPATH_RMP3_GET(x) (((uint16_t)(x) & WM8960_RINPATH_RMP3_MASK) >> WM8960_RINPATH_RMP3_SHIFT)
-
-/*
- * RMP2 (RW)
- *
- * Connect RINPUT2 to non-inverting input of Right
- * Input PGA
- * 0 = RINPUT2 not connected to PGA
- * 1 = RINPUT2 connected to PGA (Constant input
- * impedance)
- */
-#define WM8960_RINPATH_RMP2_MASK (0x40U)
-#define WM8960_RINPATH_RMP2_SHIFT (6U)
-#define WM8960_RINPATH_RMP2_SET(x) (((uint16_t)(x) << WM8960_RINPATH_RMP2_SHIFT) & WM8960_RINPATH_RMP2_MASK)
-#define WM8960_RINPATH_RMP2_GET(x) (((uint16_t)(x) & WM8960_RINPATH_RMP2_MASK) >> WM8960_RINPATH_RMP2_SHIFT)
-
-/*
- * RMICBOOST (RW)
- *
- * Right Channel Input PGA Boost Gain
- * 00 = +0dB
- * 01 = +13dB
- * 10 = +20dB
- * 11 = +29dB
- */
-#define WM8960_RINPATH_RMICBOOST_MASK (0x30U)
-#define WM8960_RINPATH_RMICBOOST_SHIFT (4U)
-#define WM8960_RINPATH_RMICBOOST_SET(x) (((uint16_t)(x) << WM8960_RINPATH_RMICBOOST_SHIFT) & WM8960_RINPATH_RMICBOOST_MASK)
-#define WM8960_RINPATH_RMICBOOST_GET(x) (((uint16_t)(x) & WM8960_RINPATH_RMICBOOST_MASK) >> WM8960_RINPATH_RMICBOOST_SHIFT)
-
-/*
- * RMIC2B (RW)
- *
- * Connect Right Input PGA to Right Input Boost
- * Mixer
- * 0 = Not connected
- * 1 = Connected
- */
-#define WM8960_RINPATH_RMIC2B_MASK (0x8U)
-#define WM8960_RINPATH_RMIC2B_SHIFT (3U)
-#define WM8960_RINPATH_RMIC2B_SET(x) (((uint16_t)(x) << WM8960_RINPATH_RMIC2B_SHIFT) & WM8960_RINPATH_RMIC2B_MASK)
-#define WM8960_RINPATH_RMIC2B_GET(x) (((uint16_t)(x) & WM8960_RINPATH_RMIC2B_MASK) >> WM8960_RINPATH_RMIC2B_SHIFT)
-
-/* Bitfield definition for register: LOUTMIX */
-/*
- * LD2LO (RW)
- *
- * Left DAC to Left Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_LOUTMIX_LD2LO_MASK (0x100U)
-#define WM8960_LOUTMIX_LD2LO_SHIFT (8U)
-#define WM8960_LOUTMIX_LD2LO_SET(x) (((uint16_t)(x) << WM8960_LOUTMIX_LD2LO_SHIFT) & WM8960_LOUTMIX_LD2LO_MASK)
-#define WM8960_LOUTMIX_LD2LO_GET(x) (((uint16_t)(x) & WM8960_LOUTMIX_LD2LO_MASK) >> WM8960_LOUTMIX_LD2LO_SHIFT)
-
-/*
- * LI2LO (RW)
- *
- * LINPUT3 to Left Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_LOUTMIX_LI2LO_MASK (0x80U)
-#define WM8960_LOUTMIX_LI2LO_SHIFT (7U)
-#define WM8960_LOUTMIX_LI2LO_SET(x) (((uint16_t)(x) << WM8960_LOUTMIX_LI2LO_SHIFT) & WM8960_LOUTMIX_LI2LO_MASK)
-#define WM8960_LOUTMIX_LI2LO_GET(x) (((uint16_t)(x) & WM8960_LOUTMIX_LI2LO_MASK) >> WM8960_LOUTMIX_LI2LO_SHIFT)
-
-/*
- * LI2LOVOL (RW)
- *
- * LINPUT3 to Left Output Mixer Volume
- * 000 = 0dB
- * ...(3dB steps)
- * 111 = -21dB
- */
-#define WM8960_LOUTMIX_LI2LOVOL_MASK (0x70U)
-#define WM8960_LOUTMIX_LI2LOVOL_SHIFT (4U)
-#define WM8960_LOUTMIX_LI2LOVOL_SET(x) (((uint16_t)(x) << WM8960_LOUTMIX_LI2LOVOL_SHIFT) & WM8960_LOUTMIX_LI2LOVOL_MASK)
-#define WM8960_LOUTMIX_LI2LOVOL_GET(x) (((uint16_t)(x) & WM8960_LOUTMIX_LI2LOVOL_MASK) >> WM8960_LOUTMIX_LI2LOVOL_SHIFT)
-
-/* Bitfield definition for register: ROUTMIX */
-/*
- * RD2RO (RW)
- *
- * Right DAC to Right Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_ROUTMIX_RD2RO_MASK (0x100U)
-#define WM8960_ROUTMIX_RD2RO_SHIFT (8U)
-#define WM8960_ROUTMIX_RD2RO_SET(x) (((uint16_t)(x) << WM8960_ROUTMIX_RD2RO_SHIFT) & WM8960_ROUTMIX_RD2RO_MASK)
-#define WM8960_ROUTMIX_RD2RO_GET(x) (((uint16_t)(x) & WM8960_ROUTMIX_RD2RO_MASK) >> WM8960_ROUTMIX_RD2RO_SHIFT)
-
-/*
- * RI2RO (RW)
- *
- * RINPUT3 to Right Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_ROUTMIX_RI2RO_MASK (0x80U)
-#define WM8960_ROUTMIX_RI2RO_SHIFT (7U)
-#define WM8960_ROUTMIX_RI2RO_SET(x) (((uint16_t)(x) << WM8960_ROUTMIX_RI2RO_SHIFT) & WM8960_ROUTMIX_RI2RO_MASK)
-#define WM8960_ROUTMIX_RI2RO_GET(x) (((uint16_t)(x) & WM8960_ROUTMIX_RI2RO_MASK) >> WM8960_ROUTMIX_RI2RO_SHIFT)
-
-/*
- * RI2ROVOL (RW)
- *
- * RINPUT3 to Right Output Mixer Volume
- * 000 = 0dB
- * ...(3dB steps)
- * 111 = -21dB
- */
-#define WM8960_ROUTMIX_RI2ROVOL_MASK (0x70U)
-#define WM8960_ROUTMIX_RI2ROVOL_SHIFT (4U)
-#define WM8960_ROUTMIX_RI2ROVOL_SET(x) (((uint16_t)(x) << WM8960_ROUTMIX_RI2ROVOL_SHIFT) & WM8960_ROUTMIX_RI2ROVOL_MASK)
-#define WM8960_ROUTMIX_RI2ROVOL_GET(x) (((uint16_t)(x) & WM8960_ROUTMIX_RI2ROVOL_MASK) >> WM8960_ROUTMIX_RI2ROVOL_SHIFT)
-
-/* Bitfield definition for register: MONOMIX1 */
-/*
- * L2MO (RW)
- *
- * Left Output Mixer to Mono Output Mixer Control
- * 0 = Left channel mix disabled
- * 1 = Left channel mix enabled
- */
-#define WM8960_MONOMIX1_L2MO_MASK (0x80U)
-#define WM8960_MONOMIX1_L2MO_SHIFT (7U)
-#define WM8960_MONOMIX1_L2MO_SET(x) (((uint16_t)(x) << WM8960_MONOMIX1_L2MO_SHIFT) & WM8960_MONOMIX1_L2MO_MASK)
-#define WM8960_MONOMIX1_L2MO_GET(x) (((uint16_t)(x) & WM8960_MONOMIX1_L2MO_MASK) >> WM8960_MONOMIX1_L2MO_SHIFT)
-
-/* Bitfield definition for register: MONOMIX2 */
-/*
- * R2MO (RW)
- *
- * Right Output Mixer to Mono Output Mixer Control
- * 0 = Right channel mix disabled
- * 1 = Right channel mix enabled
- */
-#define WM8960_MONOMIX2_R2MO_MASK (0x80U)
-#define WM8960_MONOMIX2_R2MO_SHIFT (7U)
-#define WM8960_MONOMIX2_R2MO_SET(x) (((uint16_t)(x) << WM8960_MONOMIX2_R2MO_SHIFT) & WM8960_MONOMIX2_R2MO_MASK)
-#define WM8960_MONOMIX2_R2MO_GET(x) (((uint16_t)(x) & WM8960_MONOMIX2_R2MO_MASK) >> WM8960_MONOMIX2_R2MO_SHIFT)
-
-/* Bitfield definition for register: LOUT2 */
-/*
- * SPKVU (RW)
- *
- * Speaker Volume Update
- * Writing a 1 to this bit will cause left and right speaker volumes to be updated (SPKLVOL and SPKRVOL)
- */
-#define WM8960_LOUT2_SPKVU_MASK (0x100U)
-#define WM8960_LOUT2_SPKVU_SHIFT (8U)
-#define WM8960_LOUT2_SPKVU_SET(x) (((uint16_t)(x) << WM8960_LOUT2_SPKVU_SHIFT) & WM8960_LOUT2_SPKVU_MASK)
-#define WM8960_LOUT2_SPKVU_GET(x) (((uint16_t)(x) & WM8960_LOUT2_SPKVU_MASK) >> WM8960_LOUT2_SPKVU_SHIFT)
-
-/*
- * SPKLZC (RW)
- *
- * Left Speaker Zero Cross Enable
- * 1 = Change gain on zero cross only
- * 0 = Change gain immediately
- */
-#define WM8960_LOUT2_SPKLZC_MASK (0x80U)
-#define WM8960_LOUT2_SPKLZC_SHIFT (7U)
-#define WM8960_LOUT2_SPKLZC_SET(x) (((uint16_t)(x) << WM8960_LOUT2_SPKLZC_SHIFT) & WM8960_LOUT2_SPKLZC_MASK)
-#define WM8960_LOUT2_SPKLZC_GET(x) (((uint16_t)(x) & WM8960_LOUT2_SPKLZC_MASK) >> WM8960_LOUT2_SPKLZC_SHIFT)
-
-/*
- * SPKLVOL (RW)
- *
- * SPK_LP/SPK_LN Volume
- * 1111111 = +6dB
- * … 1dB steps down to
- * 0110000 = -73dB
- * 0101111 to 0000000 = Analogue MUTE
- */
-#define WM8960_LOUT2_SPKLVOL_MASK (0x7FU)
-#define WM8960_LOUT2_SPKLVOL_SHIFT (0U)
-#define WM8960_LOUT2_SPKLVOL_SET(x) (((uint16_t)(x) << WM8960_LOUT2_SPKLVOL_SHIFT) & WM8960_LOUT2_SPKLVOL_MASK)
-#define WM8960_LOUT2_SPKLVOL_GET(x) (((uint16_t)(x) & WM8960_LOUT2_SPKLVOL_MASK) >> WM8960_LOUT2_SPKLVOL_SHIFT)
-
-/* Bitfield definition for register: ROUT2 */
-/*
- * SPKVU (RW)
- *
- * Speaker Volume Update
- * Writing a 1 to this bit will cause left and right
- * speaker volumes to be updated (SPKLVOL and SPKRVOL)
- */
-#define WM8960_ROUT2_SPKVU_MASK (0x100U)
-#define WM8960_ROUT2_SPKVU_SHIFT (8U)
-#define WM8960_ROUT2_SPKVU_SET(x) (((uint16_t)(x) << WM8960_ROUT2_SPKVU_SHIFT) & WM8960_ROUT2_SPKVU_MASK)
-#define WM8960_ROUT2_SPKVU_GET(x) (((uint16_t)(x) & WM8960_ROUT2_SPKVU_MASK) >> WM8960_ROUT2_SPKVU_SHIFT)
-
-/*
- * SPKRZC (RW)
- *
- * Right Speaker Zero Cross Enable
- * 1 = Change gain on zero cross only
- * 0 = Change gain immediately
- */
-#define WM8960_ROUT2_SPKRZC_MASK (0x80U)
-#define WM8960_ROUT2_SPKRZC_SHIFT (7U)
-#define WM8960_ROUT2_SPKRZC_SET(x) (((uint16_t)(x) << WM8960_ROUT2_SPKRZC_SHIFT) & WM8960_ROUT2_SPKRZC_MASK)
-#define WM8960_ROUT2_SPKRZC_GET(x) (((uint16_t)(x) & WM8960_ROUT2_SPKRZC_MASK) >> WM8960_ROUT2_SPKRZC_SHIFT)
-
-/*
- * SPKRVOL (RW)
- *
- * SPK_RP/SPK_RN Volume
- * 1111111 = +6dB
- * … 1dB steps down to
- * 0110000 = -73dB
- * 0101111 to 0000000 = Analogue MUTE
- */
-#define WM8960_ROUT2_SPKRVOL_MASK (0x7FU)
-#define WM8960_ROUT2_SPKRVOL_SHIFT (0U)
-#define WM8960_ROUT2_SPKRVOL_SET(x) (((uint16_t)(x) << WM8960_ROUT2_SPKRVOL_SHIFT) & WM8960_ROUT2_SPKRVOL_MASK)
-#define WM8960_ROUT2_SPKRVOL_GET(x) (((uint16_t)(x) & WM8960_ROUT2_SPKRVOL_MASK) >> WM8960_ROUT2_SPKRVOL_SHIFT)
-
-/* Bitfield definition for register: MONO */
-/*
- * MOUTVOL (RW)
- *
- * Mono Output Mixer Volume Control
- * 0 = 0dB
- * 1 = -6dB
- */
-#define WM8960_MONO_MOUTVOL_MASK (0x40U)
-#define WM8960_MONO_MOUTVOL_SHIFT (6U)
-#define WM8960_MONO_MOUTVOL_SET(x) (((uint16_t)(x) << WM8960_MONO_MOUTVOL_SHIFT) & WM8960_MONO_MOUTVOL_MASK)
-#define WM8960_MONO_MOUTVOL_GET(x) (((uint16_t)(x) & WM8960_MONO_MOUTVOL_MASK) >> WM8960_MONO_MOUTVOL_SHIFT)
-
-/* Bitfield definition for register: INBMIX1 */
-/*
- * LIN3BOOST (RW)
- *
- * LINPUT3 to Boost Mixer Gain
- * 000 = Mute
- * 001 = -12dB
- * ...3dB steps up to
- * 111 = +6dB
- */
-#define WM8960_INBMIX1_LIN3BOOST_MASK (0x70U)
-#define WM8960_INBMIX1_LIN3BOOST_SHIFT (4U)
-#define WM8960_INBMIX1_LIN3BOOST_SET(x) (((uint16_t)(x) << WM8960_INBMIX1_LIN3BOOST_SHIFT) & WM8960_INBMIX1_LIN3BOOST_MASK)
-#define WM8960_INBMIX1_LIN3BOOST_GET(x) (((uint16_t)(x) & WM8960_INBMIX1_LIN3BOOST_MASK) >> WM8960_INBMIX1_LIN3BOOST_SHIFT)
-
-/*
- * LIN2BOOST (RW)
- *
- * LINPUT2 to Boost Mixer Gain
- * 000 = Mute
- * 001 = -12dB
- * ...3dB steps up to
- * 111 = +6dB
- */
-#define WM8960_INBMIX1_LIN2BOOST_MASK (0xEU)
-#define WM8960_INBMIX1_LIN2BOOST_SHIFT (1U)
-#define WM8960_INBMIX1_LIN2BOOST_SET(x) (((uint16_t)(x) << WM8960_INBMIX1_LIN2BOOST_SHIFT) & WM8960_INBMIX1_LIN2BOOST_MASK)
-#define WM8960_INBMIX1_LIN2BOOST_GET(x) (((uint16_t)(x) & WM8960_INBMIX1_LIN2BOOST_MASK) >> WM8960_INBMIX1_LIN2BOOST_SHIFT)
-
-/* Bitfield definition for register: INBMIX2 */
-/*
- * RIN3BOOST (RW)
- *
- * RINPUT3 to Boost Mixer Gain
- * 000 = Mute
- * 001 = -12dB
- * ...3dB steps up to
- * 111 = +6dB
- */
-#define WM8960_INBMIX2_RIN3BOOST_MASK (0x70U)
-#define WM8960_INBMIX2_RIN3BOOST_SHIFT (4U)
-#define WM8960_INBMIX2_RIN3BOOST_SET(x) (((uint16_t)(x) << WM8960_INBMIX2_RIN3BOOST_SHIFT) & WM8960_INBMIX2_RIN3BOOST_MASK)
-#define WM8960_INBMIX2_RIN3BOOST_GET(x) (((uint16_t)(x) & WM8960_INBMIX2_RIN3BOOST_MASK) >> WM8960_INBMIX2_RIN3BOOST_SHIFT)
-
-/*
- * RIN2BOOST (RW)
- *
- * RINPUT2 to Boost Mixer Gain
- * 000 = Mute
- * 001 = -12dB
- * ...3dB steps up to
- * 111 = +6dB
- */
-#define WM8960_INBMIX2_RIN2BOOST_MASK (0xEU)
-#define WM8960_INBMIX2_RIN2BOOST_SHIFT (1U)
-#define WM8960_INBMIX2_RIN2BOOST_SET(x) (((uint16_t)(x) << WM8960_INBMIX2_RIN2BOOST_SHIFT) & WM8960_INBMIX2_RIN2BOOST_MASK)
-#define WM8960_INBMIX2_RIN2BOOST_GET(x) (((uint16_t)(x) & WM8960_INBMIX2_RIN2BOOST_MASK) >> WM8960_INBMIX2_RIN2BOOST_SHIFT)
-
-/* Bitfield definition for register: BYPASS1 */
-/*
- * LB2LO (RW)
- *
- * Left Input Boost Mixer to Left Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_BYPASS1_LB2LO_MASK (0x80U)
-#define WM8960_BYPASS1_LB2LO_SHIFT (7U)
-#define WM8960_BYPASS1_LB2LO_SET(x) (((uint16_t)(x) << WM8960_BYPASS1_LB2LO_SHIFT) & WM8960_BYPASS1_LB2LO_MASK)
-#define WM8960_BYPASS1_LB2LO_GET(x) (((uint16_t)(x) & WM8960_BYPASS1_LB2LO_MASK) >> WM8960_BYPASS1_LB2LO_SHIFT)
-
-/*
- * LB2LOVOL (RW)
- *
- * Left Input Boost Mixer to Left Output Mixer
- * Volume
- * 000 = 0dB
- * ...(3dB steps)
- * 111 = -21dB
- */
-#define WM8960_BYPASS1_LB2LOVOL_MASK (0x70U)
-#define WM8960_BYPASS1_LB2LOVOL_SHIFT (4U)
-#define WM8960_BYPASS1_LB2LOVOL_SET(x) (((uint16_t)(x) << WM8960_BYPASS1_LB2LOVOL_SHIFT) & WM8960_BYPASS1_LB2LOVOL_MASK)
-#define WM8960_BYPASS1_LB2LOVOL_GET(x) (((uint16_t)(x) & WM8960_BYPASS1_LB2LOVOL_MASK) >> WM8960_BYPASS1_LB2LOVOL_SHIFT)
-
-/* Bitfield definition for register: BYPASS2 */
-/*
- * RB2RO (RW)
- *
- * Right Input Boost Mixer to Right Output Mixer
- * 0 = Disable (Mute)
- * 1 = Enable Path
- */
-#define WM8960_BYPASS2_RB2RO_MASK (0x80U)
-#define WM8960_BYPASS2_RB2RO_SHIFT (7U)
-#define WM8960_BYPASS2_RB2RO_SET(x) (((uint16_t)(x) << WM8960_BYPASS2_RB2RO_SHIFT) & WM8960_BYPASS2_RB2RO_MASK)
-#define WM8960_BYPASS2_RB2RO_GET(x) (((uint16_t)(x) & WM8960_BYPASS2_RB2RO_MASK) >> WM8960_BYPASS2_RB2RO_SHIFT)
-
-/*
- * RB2ROVOL (RW)
- *
- * Right Input Boost Mixer to Right Output Mixer
- * Volume
- * 000 = 0dB
- * ...(3dB steps)
- * 111 = -21dB
- */
-#define WM8960_BYPASS2_RB2ROVOL_MASK (0x70U)
-#define WM8960_BYPASS2_RB2ROVOL_SHIFT (4U)
-#define WM8960_BYPASS2_RB2ROVOL_SET(x) (((uint16_t)(x) << WM8960_BYPASS2_RB2ROVOL_SHIFT) & WM8960_BYPASS2_RB2ROVOL_MASK)
-#define WM8960_BYPASS2_RB2ROVOL_GET(x) (((uint16_t)(x) & WM8960_BYPASS2_RB2ROVOL_MASK) >> WM8960_BYPASS2_RB2ROVOL_SHIFT)
-
-/* Bitfield definition for register: POWER3 */
-/*
- * LMIC (RW)
- *
- * Left Channel Input PGA Enable
- * 0 = PGA disabled
- * 1 = PGA enabled (if AINL = 1)
- */
-#define WM8960_POWER3_LMIC_MASK (0x20U)
-#define WM8960_POWER3_LMIC_SHIFT (5U)
-#define WM8960_POWER3_LMIC_SET(x) (((uint16_t)(x) << WM8960_POWER3_LMIC_SHIFT) & WM8960_POWER3_LMIC_MASK)
-#define WM8960_POWER3_LMIC_GET(x) (((uint16_t)(x) & WM8960_POWER3_LMIC_MASK) >> WM8960_POWER3_LMIC_SHIFT)
-
-/*
- * RMIC (RW)
- *
- * Right Channel Input PGA Enable
- * 0 = PGA disabled
- * 1 = PGA enabled (if AINR = 1)
- */
-#define WM8960_POWER3_RMIC_MASK (0x10U)
-#define WM8960_POWER3_RMIC_SHIFT (4U)
-#define WM8960_POWER3_RMIC_SET(x) (((uint16_t)(x) << WM8960_POWER3_RMIC_SHIFT) & WM8960_POWER3_RMIC_MASK)
-#define WM8960_POWER3_RMIC_GET(x) (((uint16_t)(x) & WM8960_POWER3_RMIC_MASK) >> WM8960_POWER3_RMIC_SHIFT)
-
-/*
- * LOMIX (RW)
- *
- * Left Output Mixer Enable Control
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_POWER3_LOMIX_MASK (0x8U)
-#define WM8960_POWER3_LOMIX_SHIFT (3U)
-#define WM8960_POWER3_LOMIX_SET(x) (((uint16_t)(x) << WM8960_POWER3_LOMIX_SHIFT) & WM8960_POWER3_LOMIX_MASK)
-#define WM8960_POWER3_LOMIX_GET(x) (((uint16_t)(x) & WM8960_POWER3_LOMIX_MASK) >> WM8960_POWER3_LOMIX_SHIFT)
-
-/*
- * ROMIX (RW)
- *
- * Right Output Mixer Enable Control
- * 0 = Disabled
- * 1 = Enabled
- */
-#define WM8960_POWER3_ROMIX_MASK (0x4U)
-#define WM8960_POWER3_ROMIX_SHIFT (2U)
-#define WM8960_POWER3_ROMIX_SET(x) (((uint16_t)(x) << WM8960_POWER3_ROMIX_SHIFT) & WM8960_POWER3_ROMIX_MASK)
-#define WM8960_POWER3_ROMIX_GET(x) (((uint16_t)(x) & WM8960_POWER3_ROMIX_MASK) >> WM8960_POWER3_ROMIX_SHIFT)
-
-/* Bitfield definition for register: ADDCTL4 */
-/*
- * GPIOPOL (RW)
- *
- * GPIO Polarity Invert
- * 0 = Non inverted
- * 1 = Inverted
- */
-#define WM8960_ADDCTL4_GPIOPOL_MASK (0x80U)
-#define WM8960_ADDCTL4_GPIOPOL_SHIFT (7U)
-#define WM8960_ADDCTL4_GPIOPOL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL4_GPIOPOL_SHIFT) & WM8960_ADDCTL4_GPIOPOL_MASK)
-#define WM8960_ADDCTL4_GPIOPOL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL4_GPIOPOL_MASK) >> WM8960_ADDCTL4_GPIOPOL_SHIFT)
-
-/*
- * GPIOSEL (RW)
- *
- * ADCLRC/GPIO1 GPIO Function Select:
- * 000 = Jack detect input
- * 001 = Reserved
- * 010 = Temperature ok
- * 011 = Debounced jack detect output
- * 100 = SYSCLK output
- * 101 = PLL lock
- * 110 = Logic 0
- * 111 = Logic 1
- */
-#define WM8960_ADDCTL4_GPIOSEL_MASK (0x70U)
-#define WM8960_ADDCTL4_GPIOSEL_SHIFT (4U)
-#define WM8960_ADDCTL4_GPIOSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL4_GPIOSEL_SHIFT) & WM8960_ADDCTL4_GPIOSEL_MASK)
-#define WM8960_ADDCTL4_GPIOSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL4_GPIOSEL_MASK) >> WM8960_ADDCTL4_GPIOSEL_SHIFT)
-
-/*
- * HPSEL (RW)
- *
- * Headphone Switch Input Select
- * 0X = GPIO1 used for jack detect input (Requires
- * ADCLRC pin to be configured as a GPIO)
- * 10 = JD2 used for jack detect input
- * 11 = JD3 used for jack detect input
- */
-#define WM8960_ADDCTL4_HPSEL_MASK (0xCU)
-#define WM8960_ADDCTL4_HPSEL_SHIFT (2U)
-#define WM8960_ADDCTL4_HPSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL4_HPSEL_SHIFT) & WM8960_ADDCTL4_HPSEL_MASK)
-#define WM8960_ADDCTL4_HPSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL4_HPSEL_MASK) >> WM8960_ADDCTL4_HPSEL_SHIFT)
-
-/*
- * TSENSEN (RW)
- *
- * Temperature Sensor Enable
- * 0 = Temperature sensor disabled
- * 1 = Temperature sensor enabled
- */
-#define WM8960_ADDCTL4_TSENSEN_MASK (0x2U)
-#define WM8960_ADDCTL4_TSENSEN_SHIFT (1U)
-#define WM8960_ADDCTL4_TSENSEN_SET(x) (((uint16_t)(x) << WM8960_ADDCTL4_TSENSEN_SHIFT) & WM8960_ADDCTL4_TSENSEN_MASK)
-#define WM8960_ADDCTL4_TSENSEN_GET(x) (((uint16_t)(x) & WM8960_ADDCTL4_TSENSEN_MASK) >> WM8960_ADDCTL4_TSENSEN_SHIFT)
-
-/*
- * MBSEL (RW)
- *
- * Microphone Bias Voltage Control
- * 0 = 0.9 * AVDD
- * 1 = 0.65 * AVDD
- */
-#define WM8960_ADDCTL4_MBSEL_MASK (0x1U)
-#define WM8960_ADDCTL4_MBSEL_SHIFT (0U)
-#define WM8960_ADDCTL4_MBSEL_SET(x) (((uint16_t)(x) << WM8960_ADDCTL4_MBSEL_SHIFT) & WM8960_ADDCTL4_MBSEL_MASK)
-#define WM8960_ADDCTL4_MBSEL_GET(x) (((uint16_t)(x) & WM8960_ADDCTL4_MBSEL_MASK) >> WM8960_ADDCTL4_MBSEL_SHIFT)
-
-/* Bitfield definition for register: CLASSD1 */
-/*
- * SPK_OP_EN (RW)
- *
- * Enable Class D Speaker Outputs
- * 00 = Off
- * 01 = Left speaker only
- * 10 = Right speaker only
- * 11 = Left and right speakers enabled
- */
-#define WM8960_CLASSD1_SPK_OP_EN_MASK (0xC0U)
-#define WM8960_CLASSD1_SPK_OP_EN_SHIFT (6U)
-#define WM8960_CLASSD1_SPK_OP_EN_SET(x) (((uint16_t)(x) << WM8960_CLASSD1_SPK_OP_EN_SHIFT) & WM8960_CLASSD1_SPK_OP_EN_MASK)
-#define WM8960_CLASSD1_SPK_OP_EN_GET(x) (((uint16_t)(x) & WM8960_CLASSD1_SPK_OP_EN_MASK) >> WM8960_CLASSD1_SPK_OP_EN_SHIFT)
-
-/* Bitfield definition for register: CLASSD3 */
-/*
- * DCGAIN (RW)
- *
- * DC Speaker Boost (Boosts speaker DC output
- * level by up to 1.8 x on left and right channels)
- * 000 = 1.00x boost (+0dB)
- * 001 = 1.27x boost (+2.1dB)
- * 010 = 1.40x boost (+2.9dB)
- * 011 = 1.52x boost (+3.6dB)
- * 100 = 1.67x boost (+4.5dB)
- * 101 = 1.8x boost (+5.1dB)
- * 110 to 111 = Reserved
- */
-#define WM8960_CLASSD3_DCGAIN_MASK (0x38U)
-#define WM8960_CLASSD3_DCGAIN_SHIFT (3U)
-#define WM8960_CLASSD3_DCGAIN_SET(x) (((uint16_t)(x) << WM8960_CLASSD3_DCGAIN_SHIFT) & WM8960_CLASSD3_DCGAIN_MASK)
-#define WM8960_CLASSD3_DCGAIN_GET(x) (((uint16_t)(x) & WM8960_CLASSD3_DCGAIN_MASK) >> WM8960_CLASSD3_DCGAIN_SHIFT)
-
-/*
- * ACGAIN (RW)
- *
- * AC Speaker Boost (Boosts speaker AC output
- * signal by up to 1.8 x on left and right channels)
- * 000 = 1.00x boost (+0dB)
- * 001 = 1.27x boost (+2.1dB)
- * 010 = 1.40x boost (+2.9dB)
- * 011 = 1.52x boost (+3.6dB)
- * 100 = 1.67x boost (+4.5dB)
- * 101 = 1.8x boost (+5.1dB)
- * 110 to 111 = Reserved
- */
-#define WM8960_CLASSD3_ACGAIN_MASK (0x7U)
-#define WM8960_CLASSD3_ACGAIN_SHIFT (0U)
-#define WM8960_CLASSD3_ACGAIN_SET(x) (((uint16_t)(x) << WM8960_CLASSD3_ACGAIN_SHIFT) & WM8960_CLASSD3_ACGAIN_MASK)
-#define WM8960_CLASSD3_ACGAIN_GET(x) (((uint16_t)(x) & WM8960_CLASSD3_ACGAIN_MASK) >> WM8960_CLASSD3_ACGAIN_SHIFT)
-
-/* Bitfield definition for register: PLL1 */
-/*
- * OPCLKDIV (RW)
- *
- * SYSCLK Output to GPIO Clock Division ratio
- * 000 = SYSCLK
- * 001 = SYSCLK / 2
- * 010 = SYSCLK / 3
- * 011 = SYSCLK / 4
- * 100 = SYSCLK / 5.5
- * 101 = SYSCLK / 6
- */
-#define WM8960_PLL1_OPCLKDIV_MASK (0x1C0U)
-#define WM8960_PLL1_OPCLKDIV_SHIFT (6U)
-#define WM8960_PLL1_OPCLKDIV_SET(x) (((uint16_t)(x) << WM8960_PLL1_OPCLKDIV_SHIFT) & WM8960_PLL1_OPCLKDIV_MASK)
-#define WM8960_PLL1_OPCLKDIV_GET(x) (((uint16_t)(x) & WM8960_PLL1_OPCLKDIV_MASK) >> WM8960_PLL1_OPCLKDIV_SHIFT)
-
-/*
- * SDM (RW)
- *
- * Enable Integer Mode
- * 0 = Integer mode
- * 1 = Fractional mode
- */
-#define WM8960_PLL1_SDM_MASK (0x20U)
-#define WM8960_PLL1_SDM_SHIFT (5U)
-#define WM8960_PLL1_SDM_SET(x) (((uint16_t)(x) << WM8960_PLL1_SDM_SHIFT) & WM8960_PLL1_SDM_MASK)
-#define WM8960_PLL1_SDM_GET(x) (((uint16_t)(x) & WM8960_PLL1_SDM_MASK) >> WM8960_PLL1_SDM_SHIFT)
-
-/*
- * PLLPRESCALE (RW)
- *
- * Divide MCLK by 2 before input to PLL
- * 0 = Divide by 1
- * 1 = Divide by 2
- */
-#define WM8960_PLL1_PLLPRESCALE_MASK (0x10U)
-#define WM8960_PLL1_PLLPRESCALE_SHIFT (4U)
-#define WM8960_PLL1_PLLPRESCALE_SET(x) (((uint16_t)(x) << WM8960_PLL1_PLLPRESCALE_SHIFT) & WM8960_PLL1_PLLPRESCALE_MASK)
-#define WM8960_PLL1_PLLPRESCALE_GET(x) (((uint16_t)(x) & WM8960_PLL1_PLLPRESCALE_MASK) >> WM8960_PLL1_PLLPRESCALE_SHIFT)
-
-/*
- * PLLN (RW)
- *
- * Integer (N) part of PLL input/output frequency
- * ratio. Use values greater than 5 and less than 13
- */
-#define WM8960_PLL1_PLLN_MASK (0xFU)
-#define WM8960_PLL1_PLLN_SHIFT (0U)
-#define WM8960_PLL1_PLLN_SET(x) (((uint16_t)(x) << WM8960_PLL1_PLLN_SHIFT) & WM8960_PLL1_PLLN_MASK)
-#define WM8960_PLL1_PLLN_GET(x) (((uint16_t)(x) & WM8960_PLL1_PLLN_MASK) >> WM8960_PLL1_PLLN_SHIFT)
-
-/* Bitfield definition for register: PLL2 */
-/*
- * PLLK (RW)
- *
- * Fractional (K) part of PLL1 input/output
- * frequency ratio (treat as one 24-digit binary number).
- */
-#define WM8960_PLL2_PLLK_MASK (0xFFU)
-#define WM8960_PLL2_PLLK_SHIFT (0U)
-#define WM8960_PLL2_PLLK_SET(x) (((uint16_t)(x) << WM8960_PLL2_PLLK_SHIFT) & WM8960_PLL2_PLLK_MASK)
-#define WM8960_PLL2_PLLK_GET(x) (((uint16_t)(x) & WM8960_PLL2_PLLK_MASK) >> WM8960_PLL2_PLLK_SHIFT)
-
-/* Bitfield definition for register: PLL3 */
-/*
- * PLLK (RW)
- *
- * Fractional (K) part of PLL1 input/output
- * frequency ratio (treat as one 24-digit binary number).
- */
-#define WM8960_PLL3_PLLK_MASK (0xFFU)
-#define WM8960_PLL3_PLLK_SHIFT (0U)
-#define WM8960_PLL3_PLLK_SET(x) (((uint16_t)(x) << WM8960_PLL3_PLLK_SHIFT) & WM8960_PLL3_PLLK_MASK)
-#define WM8960_PLL3_PLLK_GET(x) (((uint16_t)(x) & WM8960_PLL3_PLLK_MASK) >> WM8960_PLL3_PLLK_SHIFT)
-
-/* Bitfield definition for register: PLL4 */
-/*
- * PLLK (RW)
- *
- * Fractional (K) part of PLL1 input/output
- * frequency ratio (treat as one 24-digit binary number).
- */
-#define WM8960_PLL4_PLLK_MASK (0xFFU)
-#define WM8960_PLL4_PLLK_SHIFT (0U)
-#define WM8960_PLL4_PLLK_SET(x) (((uint16_t)(x) << WM8960_PLL4_PLLK_SHIFT) & WM8960_PLL4_PLLK_MASK)
-#define WM8960_PLL4_PLLK_GET(x) (((uint16_t)(x) & WM8960_PLL4_PLLK_MASK) >> WM8960_PLL4_PLLK_SHIFT)
-
-
-#endif /* _HPM_WM8960_REG_H_ */
diff --git a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_hybrid_rtt.ld b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_hybrid_rtt.ld
deleted file mode 100644
index 6fba88036103..000000000000
--- a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_hybrid_rtt.ld
+++ /dev/null
@@ -1,312 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 64K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 1M;
-
-MEMORY
-{
- FLASH (rx) : ORIGIN = 0xB0000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K
- AHB_SRAM (w): ORIGIN = 0xF0200000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(FLASH) + 0x400;
-__boot_header_load_addr__ = ORIGIN(FLASH) + 0x1000;
-__app_load_addr__ = ORIGIN(FLASH) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > FLASH
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > FLASH
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > FLASH
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > FLASH
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > FLASH
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > FLASH
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > FLASH
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > ILM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > ILM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > ILM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > ILM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > ILM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > ILM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > DLM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > DLM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > DLM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_start__ = .;
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- __noncacheable_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
-}
diff --git a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt.ld
index 25384416a2a4..fc0e874889b7 100644
--- a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -26,6 +26,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -173,7 +182,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -183,6 +192,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -276,7 +294,8 @@ SECTIONS
} > AXI_SRAM
__fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
+ /* Calculate firmware size based on actual addresses to avoid SIZEOF() issues with LLVM lld */
+ __fw_size__ = (__noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init)) - __app_load_addr__;
.heap(NOLOAD) : {
. = ALIGN(8);
@@ -301,7 +320,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_start__ = .;
diff --git a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index f71e19fab9b2..000000000000
--- a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 32K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 1M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K
- AXI_SRAM (wx) : ORIGIN = 0x01220000, LENGTH = 256K
- AHB_SRAM (w): ORIGIN = 0xF0200000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_start__ = .;
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- __noncacheable_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
-}
diff --git a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/ram_rtt.ld
index d3f989e15c6f..b499ac1e37b5 100644
--- a/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm5e00evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -111,6 +111,16 @@ SECTIONS
. = ALIGN(8);
} > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
diff --git a/bsp/hpmicro/hpm5e00evk/board/pinmux.c b/bsp/hpmicro/hpm5e00evk/board/pinmux.c
index a110e7b956a9..101200fe7225 100644
--- a/bsp/hpmicro/hpm5e00evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm5e00evk/board/pinmux.c
@@ -39,7 +39,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
#if 1
@@ -60,8 +60,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PD03].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PD02].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- ;
+ return status_invalid_argument;
}
+ return status_success;
}
void init_ppi_pins(void)
diff --git a/bsp/hpmicro/hpm5e00evk/board/pinmux.h b/bsp/hpmicro/hpm5e00evk/board/pinmux.h
index 427479bab28d..bb3d96fd286a 100644
--- a/bsp/hpmicro/hpm5e00evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm5e00evk/board/pinmux.h
@@ -13,7 +13,7 @@ extern "C" {
#endif
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_ppi_pins(void);
void init_sdm_pins(void);
void init_pwm_pin_as_sdm_clock(void);
diff --git a/bsp/hpmicro/hpm5e00evk/board/rtt_board.c b/bsp/hpmicro/hpm5e00evk/board/rtt_board.c
index d93e3a314c6b..66571a1a96a5 100644
--- a/bsp/hpmicro/hpm5e00evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm5e00evk/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
@@ -121,7 +127,7 @@ void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
}
#endif
-uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
+uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
{
uint32_t freq = 0;
diff --git a/bsp/hpmicro/hpm5e00evk/makefile.targets b/bsp/hpmicro/hpm5e00evk/makefile.targets
index e71da5a6e1e8..8469d7d2aaf3 100644
--- a/bsp/hpmicro/hpm5e00evk/makefile.targets
+++ b/bsp/hpmicro/hpm5e00evk/makefile.targets
@@ -3,4 +3,4 @@ clean2:
-$(RM) $(OBJS) *.elf
-@echo ' '
-*.elf: $(wildcard ../linkscripts/*/*.lds) $(wildcard ../linkscripts/*/*/*.lds)
\ No newline at end of file
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm5e00evk/rtconfig.h b/bsp/hpmicro/hpm5e00evk/rtconfig.h
index 19c927d335bb..deadf6c3a12f 100644
--- a/bsp/hpmicro/hpm5e00evk/rtconfig.h
+++ b/bsp/hpmicro/hpm5e00evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,7 +114,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -291,6 +301,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -318,12 +332,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -403,7 +429,7 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM5E00_SERIES
+#define SOC_SERIES_HPM5E00
/* Hardware Drivers Config */
@@ -419,6 +445,29 @@
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm5e00evk/rtconfig.py b/bsp/hpmicro/hpm5e00evk/rtconfig.py
index 14789f56ff4d..962fe9789b90 100644
--- a/bsp/hpmicro/hpm5e00evk/rtconfig.py
+++ b/bsp/hpmicro/hpm5e00evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm5e00evk/rtconfig_preinc.h b/bsp/hpmicro/hpm5e00evk/rtconfig_preinc.h
index b7ae18b32666..704fe412de4e 100644
--- a/bsp/hpmicro/hpm5e00evk/rtconfig_preinc.h
+++ b/bsp/hpmicro/hpm5e00evk/rtconfig_preinc.h
@@ -6,8 +6,7 @@
/* RT-Thread pre-include file */
#define D45
-#define HPM6880
-#define HPM6E80
+#define HPM5E31
#define HPMSOC_HAS_HPMSDK_DMAV2
#define RT_USING_LIBC
#define RT_USING_NEWLIBC
diff --git a/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/startup.c b/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/startup.c
index e3f85a9e0ee0..78705526d884 100644
--- a/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/startup.c
+++ b/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/startup.c
@@ -54,6 +54,8 @@ __attribute__((weak)) void c_startup(void)
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@ __attribute__((weak)) void c_startup(void)
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/toolchains/gcc/start.S b/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/toolchains/gcc/start.S
index c2000769245a..0262684ad38f 100644
--- a/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm5e00evk/startup/HPM5E31/toolchains/gcc/start.S
@@ -77,6 +77,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -89,3 +90,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm5e00evk/startup/SConscript b/bsp/hpmicro/hpm5e00evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm5e00evk/startup/SConscript
+++ b/bsp/hpmicro/hpm5e00evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6200evk/.config b/bsp/hpmicro/hpm6200evk/.config
index 201f27f95c51..1b12c8e7aab3 100644
--- a/bsp/hpmicro/hpm6200evk/.config
+++ b/bsp/hpmicro/hpm6200evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -262,10 +272,10 @@ CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -458,6 +468,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -573,6 +584,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -632,6 +644,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -780,6 +794,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -813,7 +829,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -892,11 +922,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -905,6 +942,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -984,6 +1038,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1038,6 +1093,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1088,6 +1144,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1105,6 +1162,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1162,6 +1222,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1187,6 +1249,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1426,25 +1489,33 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6200_SERIES=y
+CONFIG_SOC_SERIES_HPM6000=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM6200=y
+CONFIG_SOC_HPM6000=y
#
# On-chip Peripheral Drivers
#
CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_GPIO_IRQ_PRIORITY=1
CONFIG_BSP_USING_UART=y
CONFIG_BSP_USING_UART0=y
# CONFIG_BSP_UART0_RX_USING_DMA is not set
# CONFIG_BSP_UART0_TX_USING_DMA is not set
CONFIG_BSP_UART0_RX_BUFSIZE=128
CONFIG_BSP_UART0_TX_BUFSIZE=0
+CONFIG_BSP_UART0_IRQ_PRIORITY=1
+# CONFIG_BSP_USING_UART1 is not set
# CONFIG_BSP_USING_UART2 is not set
+# CONFIG_BSP_USING_UART3 is not set
+# CONFIG_BSP_USING_UART4 is not set
+# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
+# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_GPTMR is not set
@@ -1455,5 +1526,57 @@ CONFIG_BSP_UART0_TX_BUFSIZE=0
# CONFIG_BSP_USING_WDG is not set
# CONFIG_BSP_USING_MCAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_DAC is not set
+# CONFIG_BSP_USING_SDM is not set
+# CONFIG_BSP_USING_QEI is not set
+# CONFIG_BSP_USING_PLA is not set
+# CONFIG_BSP_USING_LIN is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_TAMP is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6200evk/README.md b/bsp/hpmicro/hpm6200evk/README.md
index fe1b40a1a5cd..b1e86a105ebc 100644
--- a/bsp/hpmicro/hpm6200evk/README.md
+++ b/bsp/hpmicro/hpm6200evk/README.md
@@ -72,7 +72,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6280-single-core.cfg -f boards\debug_scripts\boards\hpm6200evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6280-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6200evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -80,7 +80,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6280-single-core.cfg -f boards\debug_scripts\boards\hpm6200evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6280-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6200evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6200evk/README_zh.md b/bsp/hpmicro/hpm6200evk/README_zh.md
index d1fc210afd99..d64e808dc0f8 100644
--- a/bsp/hpmicro/hpm6200evk/README_zh.md
+++ b/bsp/hpmicro/hpm6200evk/README_zh.md
@@ -74,14 +74,14 @@
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6280-single-core.cfg -f boards\debug_scripts\boards\hpm6200evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6280-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6200evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6280-single-core.cfg -f boards\debug_scripts\boards\hpm6200evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6280-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6200evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6200evk/SConscript b/bsp/hpmicro/hpm6200evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6200evk/SConscript
+++ b/bsp/hpmicro/hpm6200evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6200evk/SConstruct b/bsp/hpmicro/hpm6200evk/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6200evk/SConstruct
+++ b/bsp/hpmicro/hpm6200evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6200evk/applications/SConscript b/bsp/hpmicro/hpm6200evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6200evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6200evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6200evk/applications/main.c b/bsp/hpmicro/hpm6200evk/applications/main.c
index 0bbf6370382c..98ea3be7a378 100644
--- a/bsp/hpmicro/hpm6200evk/applications/main.c
+++ b/bsp/hpmicro/hpm6200evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
{
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6200evk/board/Kconfig b/bsp/hpmicro/hpm6200evk/board/Kconfig
index 0b5373e534ad..b6b80277daba 100644
--- a/bsp/hpmicro/hpm6200evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6200evk/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM6200
+config SOC_HPM6000
bool
- select SOC_HPM6200_SERIES
+ select SOC_SERIES_HPM6000
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -12,6 +12,12 @@ menu "On-chip Peripheral Drivers"
bool "Enable GPIO"
select RT_USING_PIN if BSP_USING_GPIO
default n
+ if BSP_USING_GPIO
+ config BSP_GPIO_IRQ_PRIORITY
+ int "GPIO Interrupt Priority"
+ range 1 7
+ default 1
+ endif
menuconfig BSP_USING_UART
bool "Enable UART"
@@ -41,6 +47,47 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
+ config BSP_UART0_IRQ_PRIORITY
+ int "UART0 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART0_DMA_PINGPONG_BUFSIZE
+ int "Set UART0 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART0_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART1
+ bool "Enable UART1"
+ default n
+ if BSP_USING_UART1
+ config BSP_UART1_RX_USING_DMA
+ bool "Enable UART1 RX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_TX_USING_DMA
+ bool "Enable UART1 TX DMA"
+ depends on BSP_USING_UART1 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART1_RX_BUFSIZE
+ int "Set UART1 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_UART1_TX_BUFSIZE
+ int "Set UART1 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART1_IRQ_PRIORITY
+ int "UART1 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -64,6 +111,111 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
+ config BSP_UART2_IRQ_PRIORITY
+ int "UART2 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART3
+ bool "Enable UART3"
+ default n
+ if BSP_USING_UART3
+ config BSP_UART3_RX_USING_DMA
+ bool "Enable UART3 RX DMA"
+ depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART3_TX_USING_DMA
+ bool "Enable UART3 TX DMA"
+ depends on BSP_USING_UART3 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART3_RX_BUFSIZE
+ int "Set UART3 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_UART3_TX_BUFSIZE
+ int "Set UART3 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART3_IRQ_PRIORITY
+ int "UART3 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART4
+ bool "Enable UART4"
+ default n
+ if BSP_USING_UART4
+ config BSP_UART4_RX_USING_DMA
+ bool "Enable UART4 RX DMA"
+ depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART4_TX_USING_DMA
+ bool "Enable UART4 TX DMA"
+ depends on BSP_USING_UART4 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART4_RX_BUFSIZE
+ int "Set UART4 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_UART4_TX_BUFSIZE
+ int "Set UART4 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART4_IRQ_PRIORITY
+ int "UART4 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART5
+ bool "Enable UART5"
+ default n
+ if BSP_USING_UART5
+ config BSP_UART5_RX_USING_DMA
+ bool "Enable UART5 RX DMA"
+ depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART5_TX_USING_DMA
+ bool "Enable UART5 TX DMA"
+ depends on BSP_USING_UART5 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART5_RX_BUFSIZE
+ int "Set UART5 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_UART5_TX_BUFSIZE
+ int "Set UART5 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART5_IRQ_PRIORITY
+ int "UART5 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -87,84 +239,308 @@ menu "On-chip Peripheral Drivers"
range 0 65535
depends on RT_USING_SERIAL_V2
default 0
+ config BSP_UART6_IRQ_PRIORITY
+ int "UART6 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_UART7
+ bool "Enable UART7"
+ default n
+ if BSP_USING_UART7
+ config BSP_UART7_RX_USING_DMA
+ bool "Enable UART7 RX DMA"
+ depends on BSP_USING_UART7 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART7_TX_USING_DMA
+ bool "Enable UART7 TX DMA"
+ depends on BSP_USING_UART7 && RT_SERIAL_USING_DMA
+ default n
+ config BSP_UART7_RX_BUFSIZE
+ int "Set UART7 RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_UART7_TX_BUFSIZE
+ int "Set UART7 TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 0
+ config BSP_UART7_IRQ_PRIORITY
+ int "UART7 Interrupt Priority"
+ range 1 7
+ default 1
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
-
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
select RT_USING_SPI if BSP_USING_SPI
if BSP_USING_SPI
+ config BSP_USING_SPI0
+ bool "Enable SPI0"
+ default n
+ if BSP_USING_SPI0
+ config BSP_SPI0_USING_DMA
+ bool "Enable SPI0 DMA"
+ default n
+ config BSP_SPI0_IRQ_PRIORITY
+ int "SPI0 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI0 CS TYPE"
+ default BSP_SPI0_USING_SOFT_CS
+ config BSP_SPI0_USING_SOFT_CS
+ bool "Enable SPI0 software cs"
+ config BSP_SPI0_USING_HARD_CS
+ bool "Enable SPI0 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI0 IO mode"
+ default BSP_SPI0_USING_SINGLE_IO
+ config BSP_SPI0_USING_SINGLE_IO
+ bool "Enable SPI0 single IO mode"
+ config BSP_SPI0_USING_DUAL_IO
+ bool "Enable SPI0 dual IO mode"
+ config BSP_SPI0_USING_QUAD_IO
+ bool "Enable SPI0 quad IO mode"
+ endchoice
+ endif
config BSP_USING_SPI1
bool "Enable SPI1"
default y
if BSP_USING_SPI1
config BSP_SPI1_USING_DMA
- bool "Enable SPI1 DMA"
- default n
+ bool "Enable SPI1 DMA"
+ default n
+ config BSP_SPI1_IRQ_PRIORITY
+ int "SPI1 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI1 CS TYPE"
+ default BSP_SPI1_USING_SOFT_CS
+ config BSP_SPI1_USING_SOFT_CS
+ bool "Enable SPI1 software cs"
+ config BSP_SPI1_USING_HARD_CS
+ bool "Enable SPI1 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI1 IO mode"
+ default BSP_SPI1_USING_SINGLE_IO
+ config BSP_SPI1_USING_SINGLE_IO
+ bool "Enable SPI1 single IO mode"
+ config BSP_SPI1_USING_DUAL_IO
+ bool "Enable SPI1 dual IO mode"
+ config BSP_SPI1_USING_QUAD_IO
+ bool "Enable SPI1 quad IO mode"
+ endchoice
endif
config BSP_USING_SPI2
bool "Enable SPI2"
default n
if BSP_USING_SPI2
config BSP_SPI2_USING_DMA
- bool "Enable SPI2 DMA"
- default n
+ bool "Enable SPI2 DMA"
+ default n
+ config BSP_SPI2_IRQ_PRIORITY
+ int "SPI2 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI2 CS TYPE"
+ default BSP_SPI2_USING_SOFT_CS
+ config BSP_SPI2_USING_SOFT_CS
+ bool "Enable SPI2 software cs"
+ config BSP_SPI2_USING_HARD_CS
+ bool "Enable SPI2 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI2 IO mode"
+ default BSP_SPI2_USING_SINGLE_IO
+ config BSP_SPI2_USING_SINGLE_IO
+ bool "Enable SPI2 single IO mode"
+ config BSP_SPI2_USING_DUAL_IO
+ bool "Enable SPI2 dual IO mode"
+ config BSP_SPI2_USING_QUAD_IO
+ bool "Enable SPI2 quad IO mode"
+ endchoice
endif
config BSP_USING_SPI3
bool "Enable SPI3"
default n
if BSP_USING_SPI3
config BSP_SPI3_USING_DMA
- bool "Enable SPI3 DMA"
- default n
+ bool "Enable SPI3 DMA"
+ default n
+ config BSP_SPI3_IRQ_PRIORITY
+ int "SPI3 Interrupt Priority"
+ range 1 7
+ default 1
+ choice
+ prompt "Select SPI3 CS TYPE"
+ default BSP_SPI3_USING_SOFT_CS
+ config BSP_SPI3_USING_SOFT_CS
+ bool "Enable SPI3 software cs"
+ config BSP_SPI3_USING_HARD_CS
+ bool "Enable SPI3 hardware cs"
+ endchoice
+ choice
+ prompt "Select SPI3 IO mode"
+ default BSP_SPI3_USING_SINGLE_IO
+ config BSP_SPI3_USING_SINGLE_IO
+ bool "Enable SPI3 single IO mode"
+ config BSP_SPI3_USING_DUAL_IO
+ bool "Enable SPI3 dual IO mode"
+ config BSP_SPI3_USING_QUAD_IO
+ bool "Enable SPI3 quad IO mode"
+ endchoice
endif
endif
menuconfig BSP_USING_RTC
bool "Enable RTC"
default n
+ select RT_USING_RTC if BSP_USING_RTC
menuconfig BSP_USING_GPTMR
bool "Enable GPTMR"
default n
select RT_USING_CLOCK_TIME if BSP_USING_GPTMR
if BSP_USING_GPTMR
+ config BSP_USING_GPTMR0
+ bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
+ default n
+ if BSP_USING_GPTMR0
+ config BSP_GPTMR0_IRQ_PRIORITY
+ int "GPTMR0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_GPTMR1
bool "Enable GPTMR1"
default n
+ if BSP_USING_GPTMR1
+ config BSP_GPTMR1_IRQ_PRIORITY
+ int "GPTMR1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_GPTMR2
bool "Enable GPTMR2"
default n
+ if BSP_USING_GPTMR2
+ config BSP_GPTMR2_IRQ_PRIORITY
+ int "GPTMR2 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_GPTMR3
bool "Enable GPTMR3"
default n
+ if BSP_USING_GPTMR3
+ config BSP_GPTMR3_IRQ_PRIORITY
+ int "GPTMR3 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
bool "Enable I2C"
default n
+ select RT_USING_I2C if BSP_USING_I2C
if BSP_USING_I2C
config BSP_USING_I2C0
bool "Enable I2C0"
default y
- if BSP_USING_I2C0
- config BSP_I2C0_USING_DMA
- bool "Enable I2C0 DMA"
- default n
- endif
+ if BSP_USING_I2C0
+ config BSP_I2C0_USING_DMA
+ bool "Enable I2C0 DMA"
+ default n
+ config BSP_I2C0_IRQ_PRIORITY
+ int "I2C0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_I2C1
+ bool "Enable I2C1"
+ default n
+ if BSP_USING_I2C1
+ config BSP_I2C1_USING_DMA
+ bool "Enable I2C1 DMA"
+ default n
+ config BSP_I2C1_IRQ_PRIORITY
+ int "I2C1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
+ config BSP_USING_I2C2
+ bool "Enable I2C2"
+ default n
+ if BSP_USING_I2C2
+ config BSP_I2C2_USING_DMA
+ bool "Enable I2C2 DMA"
+ default n
+ config BSP_I2C2_IRQ_PRIORITY
+ int "I2C2 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_I2C3
bool "Enable I2C3"
default n
- if BSP_USING_I2C3
- config BSP_I2C3_USING_DMA
- bool "Enable I2C3 DMA"
- default n
- endif
+ if BSP_USING_I2C3
+ config BSP_I2C3_USING_DMA
+ bool "Enable I2C3 DMA"
+ default n
+ config BSP_I2C3_IRQ_PRIORITY
+ int "I2C3 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -173,6 +549,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
+ select RT_USING_PWM
menuconfig BSP_USING_USB
bool "Enable USB"
@@ -180,14 +557,25 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_USB
config BSP_USING_USB_DEVICE
bool "Enable USB Device"
+ select RT_USING_CACHE
default n
config BSP_USING_USB_HOST
bool "Enable USB HOST"
select RT_USING_CACHE
default n
+ if PKG_CHERRYUSB_HOST_ASIX || PKG_CHERRYUSB_HOST_RTL8152
+ config LWIP_TCPIP_CORE_LOCKING_INPUT
+ int
+ default 1
+ config LWIP_TCPIP_CORE_LOCKING
+ int
+ default 1
+ config RT_LWIP_PBUF_POOL_BUFSIZE
+ int
+ default 1600
+ endif
endif
-
menuconfig BSP_USING_WDG
bool "Enable Watchdog"
default n
@@ -209,21 +597,45 @@ menu "On-chip Peripheral Drivers"
config BSP_USING_MCAN0
bool "Enable MCAN0"
default n
+ if BSP_USING_MCAN0
+ config BSP_MCAN0_IRQ_PRIORITY
+ int "MCAN0 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_MCAN1
bool "Enable MCAN1"
default n
+ if BSP_USING_MCAN1
+ config BSP_MCAN1_IRQ_PRIORITY
+ int "MCAN1 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_MCAN2
bool "Enable MCAN2"
default n
+ if BSP_USING_MCAN2
+ config BSP_MCAN2_IRQ_PRIORITY
+ int "MCAN2 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
config BSP_USING_MCAN3
bool "Enable MCAN3"
default n
+ if BSP_USING_MCAN3
+ config BSP_MCAN3_IRQ_PRIORITY
+ int "MCAN3 Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -240,6 +652,325 @@ menu "On-chip Peripheral Drivers"
default n
endif
endif
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_DAC
+ bool "Enable DAC"
+ default n
+
+ menuconfig BSP_USING_SDM
+ bool "Enable SDM (Sigma-Delta Modulator)"
+ default n
+
+ menuconfig BSP_USING_QEI
+ bool "Enable QEI (Quadrature Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PLA
+ bool "Enable PLA"
+ default n
+
+ menuconfig BSP_USING_LIN
+ bool "Enable LIN"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/boards/hpm6200evk.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/boards/hpm6200evk.cfg
index a9bc40baaeba..f1f7664f6631 100644
--- a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/boards/hpm6200evk.cfg
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/boards/hpm6200evk.cfg
@@ -1,26 +1,59 @@
# Copyright 2023 hpmicro
# SPDX-License-Identifier: BSD-3-Clause
+#
+# openocd flash driver argument:
+# - option0:
+# [31:28] Flash probe type
+# 0 - SFDP SDR / 1 - SFDP DDR
+# 2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)
+# 4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V
+# 6 - OctaBus DDR (SPI -> OPI DDR)
+# 8 - Xccela DDR (SPI -> OPI DDR)
+# 10 - EcoXiP DDR (SPI -> OPI DDR)
+# [27:24] Command Pads after Power-on Reset
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [23:20] Command Pads after Configuring FLASH
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
+# 0 - Not needed
+# 1 - QE bit is at bit6 in Status Register 1
+# 2 - QE bit is at bit1 in Status Register 2
+# 3 - QE bit is at bit7 in Status Register 2
+# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
+# [15:8] Dummy cycles
+# 0 - Auto-probed / detected / default value
+# Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet
+# [7:4] Misc.
+# 0 - Not used
+# 1 - SPI mode
+# 2 - Internal loopback
+# 3 - External DQS
+# [3:0] Frequency option
+# 1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 120MHz / 7 - 133MHz / 8 - 166MHz
+# - option1:
+# [31:20] Reserved
+# [19:16] IO voltage
+# 0 - 3V / 1 - 1.8V
+# [15:12] Pin group
+# 0 - 1st group / 1 - 2nd group
+# [11:8] Connection selection
+# 0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)
+# [7:0] Drive Strength
+# 0 - Default value
+# xpi0 configs
+# - flash driver: hpm_xpi
+# - flash ctrl index: 0xF3040000
+# - base address: 0x80000000
+# - flash size: 0x1000000
flash bank xpi0 hpm_xpi 0x80000000 0x1000000 1 1 $_TARGET0 0xF3040000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ # enable all clocks
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-dual-core.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-dual-core.cfg
index 1db506d3cfac..a9924231dcea 100644
--- a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-dual-core.cfg
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-dual-core.cfg
@@ -14,6 +14,9 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
proc dmi_write {reg value} {
$::_TARGET0 riscv dmi_write ${reg} ${value}
}
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-single-core.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-single-core.cfg
index 24cbdeddd093..b284a6d28106 100644
--- a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-single-core.cfg
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm6280-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2023,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6280
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6280
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_rtt.ld
index 8539708e3699..f3e3505e75ab 100644
--- a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -29,6 +29,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -173,7 +182,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -183,6 +192,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -274,7 +292,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -297,7 +315,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > DLM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/ram_rtt.ld
index 83c625a64459..cc356a006928 100644
--- a/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6200evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -104,6 +104,16 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
diff --git a/bsp/hpmicro/hpm6200evk/board/pinmux.c b/bsp/hpmicro/hpm6200evk/board/pinmux.c
index 9b022a40cee1..11e915113aa3 100644
--- a/bsp/hpmicro/hpm6200evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm6200evk/board/pinmux.c
@@ -48,7 +48,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins_as_gpio(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
/* I2C0 */
@@ -59,12 +59,12 @@ void init_i2c_pins_as_gpio(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PB20].FUNC_CTL = IOC_PB20_FUNC_CTL_GPIO_B_20;
HPM_IOC->PAD[IOC_PAD_PB21].FUNC_CTL = IOC_PB21_FUNC_CTL_GPIO_B_21;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PB22].FUNC_CTL = IOC_PB22_FUNC_CTL_I2C0_SCL
@@ -81,9 +81,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PB20].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
HPM_IOC->PAD[IOC_PAD_PB21].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
void init_sdm_pins(void)
diff --git a/bsp/hpmicro/hpm6200evk/board/pinmux.h b/bsp/hpmicro/hpm6200evk/board/pinmux.h
index c91350dd6651..579922dda13c 100644
--- a/bsp/hpmicro/hpm6200evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm6200evk/board/pinmux.h
@@ -13,7 +13,7 @@ extern "C" {
#endif
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_gpio_pins(void);
void init_spi_pins(SPI_Type *ptr);
void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
@@ -31,7 +31,7 @@ void init_usb_pins(USB_Type *ptr);
void init_can_pins(MCAN_Type *ptr);
void init_adc_bldc_pins(void);
void init_rgb_pwm_pins(void);
-void init_i2c_pins_as_gpio(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr);
void init_led_pins_as_gpio(void);
void init_led_pins_as_pwm(void);
void init_trgmux_pins(uint32_t pin);
diff --git a/bsp/hpmicro/hpm6200evk/board/rtt_board.c b/bsp/hpmicro/hpm6200evk/board/rtt_board.c
index 86b5a92a2592..6abf6149884a 100644
--- a/bsp/hpmicro/hpm6200evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6200evk/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm6200evk/makefile.targets b/bsp/hpmicro/hpm6200evk/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6200evk/rtconfig.h b/bsp/hpmicro/hpm6200evk/rtconfig.h
index 627acbf5de94..025c77de7ba9 100644
--- a/bsp/hpmicro/hpm6200evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6200evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -103,7 +113,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -290,6 +300,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -317,12 +331,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -402,20 +428,45 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6200_SERIES
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
-#define SOC_HPM6200
+#define SOC_HPM6000
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
+#define BSP_GPIO_IRQ_PRIORITY 1
#define BSP_USING_UART
#define BSP_USING_UART0
#define BSP_UART0_RX_BUFSIZE 128
#define BSP_UART0_TX_BUFSIZE 0
+#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6200evk/rtconfig.py b/bsp/hpmicro/hpm6200evk/rtconfig.py
index 28d0b94cb9ee..fc0b56fb2306 100644
--- a/bsp/hpmicro/hpm6200evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6200evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6200evk/rtconfig_preinc.h b/bsp/hpmicro/hpm6200evk/rtconfig_preinc.h
new file mode 100644
index 000000000000..d6ccee33030d
--- /dev/null
+++ b/bsp/hpmicro/hpm6200evk/rtconfig_preinc.h
@@ -0,0 +1,19 @@
+
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+#define D45
+#define HPM6280
+#define HPM_SDK_L1C_NO_REENTRANT 1
+#define HPM_SOC_ISR_NUM 94
+#define RT_USING_LIBC
+#define RT_USING_NEWLIBC
+#define USE_DMA_DECLARE_EXT_ISR_M 1
+#define _POSIX_C_SOURCE 1
+#define _REENT_SMALL
+#define __RTTHREAD__
+
+#endif /*RTCONFIG_PREINC_H__*/
diff --git a/bsp/hpmicro/hpm6200evk/startup/HPM6280/startup.c b/bsp/hpmicro/hpm6200evk/startup/HPM6280/startup.c
index 1928adaf5809..a3e04d3e18cf 100644
--- a/bsp/hpmicro/hpm6200evk/startup/HPM6280/startup.c
+++ b/bsp/hpmicro/hpm6200evk/startup/HPM6280/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm6200evk/startup/HPM6280/toolchains/gcc/start.S b/bsp/hpmicro/hpm6200evk/startup/HPM6280/toolchains/gcc/start.S
index 93ff037c9980..59675cb3fd95 100644
--- a/bsp/hpmicro/hpm6200evk/startup/HPM6280/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6200evk/startup/HPM6280/toolchains/gcc/start.S
@@ -37,11 +37,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
@@ -54,6 +63,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -66,3 +76,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* #ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6200evk/startup/SConscript b/bsp/hpmicro/hpm6200evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm6200evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6200evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6300evk/.config b/bsp/hpmicro/hpm6300evk/.config
index 0db62e87a33d..278e78123184 100644
--- a/bsp/hpmicro/hpm6300evk/.config
+++ b/bsp/hpmicro/hpm6300evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -264,10 +274,10 @@ CONFIG_RT_USING_RTC=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -460,6 +470,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -575,6 +586,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -634,6 +646,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -782,6 +796,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -815,7 +831,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -894,11 +924,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -907,6 +944,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -986,6 +1040,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1040,6 +1095,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1090,6 +1146,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1107,6 +1164,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1164,6 +1224,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1189,6 +1251,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1428,12 +1491,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6300_SERIES=y
+CONFIG_SOC_SERIES_HPM6000=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM6300=y
+CONFIG_SOC_HPM6000=y
#
# On-chip Peripheral Drivers
@@ -1452,6 +1515,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_ETH is not set
@@ -1466,5 +1530,59 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_WDG is not set
# CONFIG_BSP_USING_CAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_DAC is not set
+# CONFIG_BSP_USING_QEI is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_FFA is not set
+# CONFIG_BSP_USING_TAMP is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+
+#
+# AMPAK Wi-Fi module Configuration
+#
+# end of AMPAK Wi-Fi module Configuration
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6300evk/README.md b/bsp/hpmicro/hpm6300evk/README.md
index 75dea3f4af84..62fc9e9c80e2 100644
--- a/bsp/hpmicro/hpm6300evk/README.md
+++ b/bsp/hpmicro/hpm6300evk/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6360.cfg -f boards\debug_scripts\boards\hpm6300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6360.cfg -f board\debug_scripts\openocd\boards\hpm6300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6360.cfg -f boards\debug_scripts\boards\hpm6300evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6360.cfg -f board\debug_scripts\openocd\boards\hpm6300evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6300evk/README_zh.md b/bsp/hpmicro/hpm6300evk/README_zh.md
index 884e84a9486d..5165a53b2587 100644
--- a/bsp/hpmicro/hpm6300evk/README_zh.md
+++ b/bsp/hpmicro/hpm6300evk/README_zh.md
@@ -74,14 +74,14 @@
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6360.cfg -f boards\debug_scripts\boards\hpm6300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6360.cfg -f board\debug_scripts\openocd\boards\hpm6300evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6360.cfg -f boards\debug_scripts\boards\hpm6300evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6360.cfg -f board\debug_scripts\openocd\boards\hpm6300evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6300evk/SConscript b/bsp/hpmicro/hpm6300evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6300evk/SConscript
+++ b/bsp/hpmicro/hpm6300evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6300evk/SConstruct b/bsp/hpmicro/hpm6300evk/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6300evk/SConstruct
+++ b/bsp/hpmicro/hpm6300evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6300evk/applications/SConscript b/bsp/hpmicro/hpm6300evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6300evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6300evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6300evk/applications/main.c b/bsp/hpmicro/hpm6300evk/applications/main.c
index 0bbf6370382c..98ea3be7a378 100644
--- a/bsp/hpmicro/hpm6300evk/applications/main.c
+++ b/bsp/hpmicro/hpm6300evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
{
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6300evk/board/Kconfig b/bsp/hpmicro/hpm6300evk/board/Kconfig
index fa34502a827c..efcacc3f89c6 100644
--- a/bsp/hpmicro/hpm6300evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6300evk/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM6300
+config SOC_HPM6000
bool
- select SOC_HPM6300_SERIES
+ select SOC_SERIES_HPM6000
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -251,6 +251,25 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_SPI
@@ -269,7 +288,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -277,7 +296,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -299,7 +318,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -307,7 +326,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -329,7 +348,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -337,7 +356,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -350,7 +369,7 @@ menu "On-chip Peripheral Drivers"
endif
config BSP_USING_SPI3
bool "Enable SPI3"
- default n
+ default y
if BSP_USING_SPI3
config BSP_SPI3_USING_DMA
bool "Enable SPI3 DMA"
@@ -359,7 +378,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -367,7 +386,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -393,7 +412,7 @@ menu "On-chip Peripheral Drivers"
select RT_USING_PHY if BSP_USING_ETH
if BSP_USING_ETH
- choice BSP_ETH0_SEL
+ choice
prompt "ETH"
config BSP_USING_ETH0
bool "Enable ETH0"
@@ -414,7 +433,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC0_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC0_USE_CACHEABLE_BUFFER
config BSP_SDXC0_USE_CACHEABLE_BUFFER
@@ -442,7 +461,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC0_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC0_BUS_WIDTH_4BIT
config BSP_SDXC0_BUS_WIDTH_1BIT
@@ -450,7 +469,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_BUS_WIDTH_4BIT
bool "4-bit"
endchoice
- choice VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC0_VOLTAGE_3V3
config BSP_SDXC0_VOLTAGE_3V3
@@ -472,6 +491,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -506,11 +526,21 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
bool "Enable I2C"
default n
+ select RT_USING_I2C if BSP_USING_I2C
if BSP_USING_I2C
config BSP_USING_I2C0
bool "Enable I2C0"
@@ -570,7 +600,6 @@ menu "On-chip Peripheral Drivers"
bool "INIT_EXT_RAM_FOR_DATA"
default y
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -579,7 +608,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWM
+ select RT_USING_PWM
menuconfig BSP_USING_USB
bool "Enable USB"
@@ -595,7 +624,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_WDG
bool "Enable Watchdog"
default n
@@ -637,7 +665,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -654,6 +682,326 @@ menu "On-chip Peripheral Drivers"
default n
endif
endif
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_DAC
+ bool "Enable DAC"
+ default n
+
+ menuconfig BSP_USING_QEI
+ bool "Enable QEI (Quadrature Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_FFA
+ bool "Enable FFA"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+menu "AMPAK Wi-Fi module Configuration"
+config BSP_USING_MHD_WIFI
+bool
+default y if RT_USING_MHD
+select BSP_USING_SDXC
+select BSP_USING_SDXC0
+select BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
+help
+ Automatically enable SDXC1 interface when WiFi MHD driver is enabled.
+ Note: Please manually select non-cacheable buffer and fast RAM options for SDXC1 if needed.
+
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/boards/hpm6300evk.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/boards/hpm6300evk.cfg
index bca3b8dc165f..7fb3a7a74c30 100644
--- a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/boards/hpm6300evk.cfg
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/boards/hpm6300evk.cfg
@@ -1,245 +1,194 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-
+#
+# openocd flash driver argument:
+# - option0:
+# [31:28] Flash probe type
+# 0 - SFDP SDR / 1 - SFDP DDR
+# 2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)
+# 4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V
+# 6 - OctaBus DDR (SPI -> OPI DDR)
+# 8 - Xccela DDR (SPI -> OPI DDR)
+# 10 - EcoXiP DDR (SPI -> OPI DDR)
+# [27:24] Command Pads after Power-on Reset
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [23:20] Command Pads after Configuring FLASH
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
+# 0 - Not needed
+# 1 - QE bit is at bit6 in Status Register 1
+# 2 - QE bit is at bit1 in Status Register 2
+# 3 - QE bit is at bit7 in Status Register 2
+# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
+# [15:8] Dummy cycles
+# 0 - Auto-probed / detected / default value
+# Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet
+# [7:4] Misc.
+# 0 - Not used
+# 1 - SPI mode
+# 2 - Internal loopback
+# 3 - External DQS
+# [3:0] Frequency option
+# 1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 120MHz / 7 - 133MHz / 8 - 166MHz
+# - option1:
+# [31:20] Reserved
+# [19:16] IO voltage
+# 0 - 3V / 1 - 1.8V
+# [15:12] Pin group
+# 0 - 1st group / 1 - 2nd group
+# [11:8] Connection selection
+# 0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)
+# [7:0] Drive Strength
+# 0 - Default value
+
+# xpi0 configs
+# - flash driver: hpm_xpi
+# - flash ctrl index: 0xF3040000
+# - base address: 0x80000000
+# - flash size: 0x1000000
flash bank xpi0 hpm_xpi 0x80000000 0x1000000 1 1 $_TARGET0 0xF3040000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
proc init_sdram { } {
-# configure dram frequency
-# 133Mhz pll1_clk0: 266Mhz divide by 2
- #$::_TARGET0 riscv dmi_write 0x39 0xF4001820
- $::_TARGET0 riscv dmi_write 0x3C 0x201
-# 166Mhz pll2_clk0: 333Mhz divide by 2
- $::_TARGET0 riscv dmi_write 0x39 0xF4001820
- $::_TARGET0 riscv dmi_write 0x3C 0x401
-
- # PD13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040368
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040360
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040350
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040348
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040340
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040338
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040330
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040328
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040320
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040318
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040310
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD01
- $::_TARGET0 riscv dmi_write 0x39 0xF4040308
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PD00
- $::_TARGET0 riscv dmi_write 0x39 0xF4040300
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC29
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC28
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC27
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
-
- # PC22
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC21
- $::_TARGET0 riscv dmi_write 0x39 0xF40402A8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC17
- $::_TARGET0 riscv dmi_write 0x39 0xF4040288
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC15
- $::_TARGET0 riscv dmi_write 0x39 0xF4040278
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040260
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC11
- $::_TARGET0 riscv dmi_write 0x39 0xF4040258
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040250
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040248
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040240
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040238
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040230
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040228
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040220
- $::_TARGET0 riscv dmi_write 0x3C 0xC
-
- # PC14
- $::_TARGET0 riscv dmi_write 0x39 0xF4040270
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040268
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC16
- # $::_TARGET0 riscv dmi_write 0x39 0xF4040280
- $::_TARGET0 riscv dmi_write 0x3C 0x1000C
- # PC26
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC25
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC19
- $::_TARGET0 riscv dmi_write 0x39 0xF4040298
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC18
- $::_TARGET0 riscv dmi_write 0x39 0xF4040290
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC23
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC24
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC30
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC31
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040210
- $::_TARGET0 riscv dmi_write 0x3C 0xC
- # PC03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040218
- $::_TARGET0 riscv dmi_write 0x3C 0xC
-
- # dramc configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
+# configure femc frequency
+# 166Mhz pll0_clk1: 333Mhz divide by 2
+ mww 0xF4001808 0x201
+
+ # PA25
+ mww 0xF40400C8 0xC
+ # PA26
+ mww 0xF40400D0 0xC
+ # PA27
+ mww 0xF40400D8 0xC
+ # PA28
+ mww 0xF40400E0 0xC
+ # PA29
+ mww 0xF40400E8 0xC
+ # PA30
+ mww 0xF40400F0 0xC
+ # PA31
+ mww 0xF40400F8 0xC
+ # PB00
+ mww 0xF4040100 0xC
+ # PB01
+ mww 0xF4040108 0xC
+ # PB02
+ mww 0xF4040110 0xC
+ # PB03
+ mww 0xF4040118 0xC
+ # PB04
+ mww 0xF4040120 0xC
+ # PB05
+ mww 0xF4040128 0xC
+ # PB06
+ mww 0xF4040130 0xC
+ # PB07
+ mww 0xF4040138 0xC
+ # PB08
+ mww 0xF4040140 0xC
+
+ # PB09
+ mww 0xF4040148 0xC
+ # PB10
+ mww 0xF4040150 0xC
+ # PB11
+ mww 0xF4040158 0xC
+ # PB12
+ mww 0xF4040160 0xC
+ # PB13
+ mww 0xF4040168 0xC
+ # PB14
+ mww 0xF4040170 0xC
+ # PB15
+ mww 0xF4040178 0xC
+ # PB16
+ mww 0xF4040180 0xC
+ # PB17
+ mww 0xF4040188 0xC
+ # PB18
+ mww 0xF4040190 0xC
+ # PB19
+ mww 0xF4040198 0xC
+ # PB20
+ mww 0xF40401A0 0xC
+
+ # PB21
+ mww 0xF40401A8 0xC
+ # PB22
+ mww 0xF40401B0 0xC
+ # PB23
+ mww 0xF40401B8 0xC
+ # PB24
+ mww 0xF40401C0 0xC
+ # PB25
+ mww 0xF40401C8 0xC
+ # PB26
+ mww 0xF40401D0 0xC
+ # PB27
+ mww 0xF40401D8 0xC
+ # PB28
+ mww 0xF40401E0 0xC
+ # PB29
+ mww 0xF40401E8 0xC
+ # PB30
+ mww 0xF40401F0 0xC
+ # PB31
+ mww 0xF40401F8 0xC
+
+ # femc configuration
+ mww 0xF3050000 0x1
sleep 10
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
- $::_TARGET0 riscv dmi_write 0x39 0xF3050008
- $::_TARGET0 riscv dmi_write 0x3C 0x30524
- $::_TARGET0 riscv dmi_write 0x39 0xF305000C
- $::_TARGET0 riscv dmi_write 0x3C 0x6030524
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x10000000
+ mww 0xF3050000 0x2
+ mww 0xF3050008 0x30524
+ mww 0xF305000C 0x6030524
+ mww 0xF3050000 0x10000004
# 32MB
- $::_TARGET0 riscv dmi_write 0x39 0xF3050010
- $::_TARGET0 riscv dmi_write 0x3C 0x4000001b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050014
- $::_TARGET0 riscv dmi_write 0x3C 0
+ mww 0xF3050010 0x4000001b
+ mww 0xF3050014 0
# 16-bit
- $::_TARGET0 riscv dmi_write 0x39 0xF3050040
- $::_TARGET0 riscv dmi_write 0x3C 0xf31
+ mww 0xF3050040 0xf31
- # 133Mhz configuration
- #$::_TARGET0 riscv dmi_write 0x39 0xF3050044
- $::_TARGET0 riscv dmi_write 0x3C 0x884e22
# 166Mhz configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050044
- $::_TARGET0 riscv dmi_write 0x3C 0x884e33
+ mww 0xF3050044 0x884e33
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020300
+ mww 0xF3050048 0x1020d0d
+ mww 0xF3050048 0x1020d0d
+ mww 0xF305004C 0x2020300
# config delay cell
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x3b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x203b
+ mww 0xF3050150 0x2000
- $::_TARGET0 riscv dmi_write 0x39 0xF3050094
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3050098
- $::_TARGET0 riscv dmi_write 0x3C 0
+ mww 0xF3050094 0
+ mww 0xF3050098 0
# precharge all
- $::_TARGET0 riscv dmi_write 0x39 0xF3050090
- $::_TARGET0 riscv dmi_write 0x3C 0x40000000
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000F
+ mww 0xF3050090 0x40000000
+ mww 0xF305009C 0xA55A000F
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# auto refresh
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305003C 0x3
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# set mode
- $::_TARGET0 riscv dmi_write 0x39 0xF30500A0
- $::_TARGET0 riscv dmi_write 0x3C 0x33
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000A
+ mww 0xF30500A0 0x33
+ mww 0xF305009C 0xA55A000A
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020301
+ mww 0xF305004C 0x2020301
echo "SDRAM has been initialized"
}
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm6360.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm6360.cfg
index bfce20c208af..eaf29249623e 100644
--- a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm6360.cfg
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm6360.cfg
@@ -1,7 +1,11 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6360
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6360
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6300evk/board/eth_phy_port.c b/bsp/hpmicro/hpm6300evk/board/eth_phy_port.c
deleted file mode 100644
index 663518be09dc..000000000000
--- a/bsp/hpmicro/hpm6300evk/board/eth_phy_port.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2021 - 2022 hpmicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- * Change Logs:
- * Date Author Notes
- * 2022-01-11 hpmicro First version
- */
-
-#include "rtthread.h"
-
-#ifdef RT_USING_PHY
-#include
-#include
-#include "hpm_enet_drv.h"
-#include "eth_phy_port.h"
-#include "hpm_soc.h"
-#include "netif/ethernetif.h"
-#include "board.h"
-
-typedef struct
-{
- char *mdio_name;
- ENET_Type *instance;
- struct eth_device *eth_dev;
- phy_device_t *phy_dev;
- struct rt_mdio_bus *mdio_bus;
-} eth_phy_handle_t;
-
-typedef struct
-{
- uint8_t phy_handle_cnt;
- eth_phy_handle_t **phy_handle;
-} eth_phy_monitor_handle_t;
-
-#ifdef BSP_USING_ETH0
-extern struct eth_device eth0_dev;
-static struct rt_mdio_bus mdio0_bus;
-static phy_device_t phy0_dev;
-static uint8_t phy0_reg_list[]= {PHY0_REG_LIST};
-
-static eth_phy_handle_t eth0_phy_handle =
-{
- .instance = HPM_ENET0,
- .eth_dev = ð0_dev,
- .phy_dev = &phy0_dev,
- .mdio_name = "MDIO0",
- .mdio_bus = &mdio0_bus,
-};
-#endif
-
-#ifdef BSP_USING_ETH1
-extern struct eth_device eth1_dev;
-static struct rt_mdio_bus mdio1_bus;
-static phy_device_t phy1_dev;
-static uint8_t phy1_reg_list[]= {PHY1_REG_LIST};
-
-static eth_phy_handle_t eth1_phy_handle =
-{
- .instance = HPM_ENET1,
- .eth_dev = ð1_dev,
- .phy_dev = &phy1_dev,
- .mdio_name = "MDIO1",
- .mdio_bus = &mdio1_bus,
-};
-#endif
-
-static eth_phy_handle_t *s_gphys[] =
-{
-#ifdef BSP_USING_ETH0
-ð0_phy_handle,
-#endif
-
-#ifdef BSP_USING_ETH1
-ð1_phy_handle
-#endif
-};
-
-static uint8_t *s_gphy_reg_list[] =
-{
-#ifdef BSP_USING_ETH0
-phy0_reg_list,
-#endif
-
-#ifdef BSP_USING_ETH1
-phy1_reg_list,
-#endif
-};
-
-eth_phy_monitor_handle_t phy_monitor_handle =
-{
- .phy_handle_cnt = ARRAY_SIZE(s_gphys),
- .phy_handle = s_gphys
-};
-
-static struct rt_phy_ops phy_ops;
-
-static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz)
-{
- return PHY_STATUS_OK;
-}
-
-static rt_size_t phy_read(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size)
-{
- *(uint16_t *)data = enet_read_phy(((struct rt_mdio_bus *)bus)->hw_obj, addr, reg);
-
- return size;
-}
-
-static rt_size_t phy_write(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size)
-{
- enet_write_phy(((struct rt_mdio_bus *)bus)->hw_obj, addr, reg, *(uint16_t *)data);
-
- return size;
-}
-
-static rt_phy_status phy_get_link_status(rt_phy_t *phy, rt_bool_t *status)
-{
- uint16_t reg_status;
-
- reg_status = enet_read_phy(phy->bus->hw_obj, phy->addr, phy->reg_list[PHY_BASIC_STATUS_REG_IDX]);
-
- #if PHY_AUTO_NEGO
- reg_status &= PHY_AUTONEGO_COMPLETE_MASK | PHY_LINKED_STATUS_MASK;
- *status = reg_status ? RT_TRUE : RT_FALSE;
-
- #else
- reg_status &= PHY_LINKED_STATUS_MASK;
- *status = reg_status ? RT_TRUE : RT_FALSE;
- #endif
-
- return PHY_STATUS_OK;
-}
-
-static rt_phy_status phy_get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
-{
- uint16_t reg_status;
-
- reg_status = enet_read_phy(phy->bus->hw_obj, phy->addr, phy->reg_list[PHY_STATUS_REG_IDX]);
-
- *speed = PHY_STATUS_SPEED_100M(reg_status) ? PHY_SPEED_100M : PHY_SPEED_10M;
- *duplex = PHY_STATUS_FULL_DUPLEX(reg_status) ? PHY_FULL_DUPLEX: PHY_HALF_DUPLEX;
-
- return PHY_STATUS_OK;
-}
-
-static void phy_poll_status(void *parameter)
-{
- int ret;
- phy_info_t phy_info;
- rt_bool_t status;
- rt_device_t dev;
- rt_phy_msg_t msg;
- rt_uint32_t speed, duplex;
- phy_device_t *phy_dev;
- struct eth_device* eth_dev;
- char const *ps[] = {"10Mbps", "100Mbps", "1000Mbps"};
- enet_line_speed_t line_speed[] = {enet_line_speed_10mbps, enet_line_speed_100mbps, enet_line_speed_1000mbps};
-
- eth_phy_monitor_handle_t *phy_monitor_handle = (eth_phy_monitor_handle_t *)parameter;
-
- for (uint32_t i = 0; i < phy_monitor_handle->phy_handle_cnt; i++)
- {
- eth_dev = phy_monitor_handle->phy_handle[i]->eth_dev;
- phy_dev = phy_monitor_handle->phy_handle[i]->phy_dev;
-
- phy_dev->phy.ops->get_link_status(&phy_dev->phy, &status);
-
- if (status)
- {
- phy_dev->phy.ops->get_link_speed_duplex(&phy_dev->phy, &phy_info.phy_speed, &phy_info.phy_duplex);
-
- ret = memcmp(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
- if (ret != 0)
- {
- memcpy(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
- }
- }
-
- if (phy_dev->phy_link != status)
- {
- phy_dev->phy_link = status ? PHY_LINK_UP : PHY_LINK_DOWN;
- eth_device_linkchange(eth_dev, status);
- LOG_I("PHY Status: %s", status ? "Link up" : "Link down\n");
- if (status == PHY_LINK_UP)
- {
- LOG_I("PHY Speed: %s", ps[phy_dev->phy_info.phy_speed]);
- LOG_I("PHY Duplex: %s\n", phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX ? "full duplex" : "half duplex");
- enet_set_line_speed(phy_monitor_handle->phy_handle[i]->instance, line_speed[phy_dev->phy_info.phy_speed]);
- enet_set_duplex_mode(phy_monitor_handle->phy_handle[i]->instance, phy_dev->phy_info.phy_duplex);
- }
- }
- }
-}
-
-static void phy_detection(void *parameter)
-{
- uint8_t detected_count = 0;
- struct rt_phy_msg msg = {0, 0};
- phy_device_t *phy_dev = (phy_device_t *)parameter;
- rt_uint32_t i;
-
- msg.reg = phy_dev->phy.reg_list[PHY_ID1_REG_IDX];
- phy_dev->phy.ops->init(phy_dev->phy.bus->hw_obj, phy_dev->phy.addr, PHY_MDIO_CSR_CLK_FREQ);
-
- while(phy_dev->phy.addr == 0xffff)
- {
- /* Search a PHY */
- for (i = 0; i <= 0x1f; i++)
- {
- ((rt_phy_t *)(phy_dev->phy.parent.user_data))->addr = i;
- phy_dev->phy.parent.read(&(phy_dev->phy.parent), 0, &msg, 1);
-
- if (msg.value == PHY_ID1)
- {
- phy_dev->phy.addr = i;
- LOG_D("Found a PHY device[address:0x%02x].\n", phy_dev->phy.addr);
- return;
- }
- }
-
- phy_dev->phy.addr = 0xffff;
- detected_count++;
- rt_thread_mdelay(1000);
-
- if (detected_count > 3)
- {
- LOG_E("No any PHY device is detected! Please check your hardware!\n");
- return;
- }
- }
-}
-
-static void phy_monitor_thread_entry(void *args)
-{
- rt_timer_t phy_status_timer;
-
- eth_phy_monitor_handle_t *phy_monitor_handle = (eth_phy_monitor_handle_t *)args;
-
- for (uint32_t i = 0; i < phy_monitor_handle->phy_handle_cnt; i++)
- {
- LOG_D("Detect a PHY%d\n", i);
- phy_detection(phy_monitor_handle->phy_handle[i]->phy_dev);
- }
-
- phy_status_timer = rt_timer_create("PHY_Monitor", phy_poll_status, phy_monitor_handle, RT_TICK_PER_SECOND, RT_TIMER_FLAG_PERIODIC | RT_TIMER_FLAG_SOFT_TIMER);
-
- if (!phy_status_timer || rt_timer_start(phy_status_timer) != RT_EOK)
- {
- LOG_E("Failed to start link change detection timer\n");
- }
-}
-
-int phy_device_register(void)
-{
- rt_err_t err = RT_ERROR;
- rt_thread_t thread_phy_monitor;
-
- /* Set ops for PHY */
- phy_ops.init = phy_init;
- phy_ops.get_link_status = phy_get_link_status;
- phy_ops.get_link_speed_duplex = phy_get_link_speed_duplex;
-
- for (uint32_t i = 0; i < ARRAY_SIZE(s_gphys); i++)
- {
- /* Set PHY address */
- s_gphys[i]->phy_dev->phy.addr = 0xffff;
-
- /* Set MIDO bus */
- s_gphys[i]->mdio_bus->hw_obj = s_gphys[i]->instance;
- s_gphys[i]->mdio_bus->name = s_gphys[i]->mdio_name;
- s_gphys[i]->mdio_bus->ops->read = phy_read;
- s_gphys[i]->mdio_bus->ops->write = phy_write;
- s_gphys[i]->phy_dev->phy.bus = s_gphys[i]->mdio_bus;
- s_gphys[i]->phy_dev->phy.ops = &phy_ops;
-
- /* Set PHY register list */
- s_gphys[i]->phy_dev->phy.reg_list = s_gphy_reg_list[i];
-
- rt_hw_phy_register(&s_gphys[i]->phy_dev->phy, PHY_NAME);
- }
-
- /* Start PHY monitor */
- thread_phy_monitor = rt_thread_create("PHY Monitor", phy_monitor_thread_entry, &phy_monitor_handle, 1024, RT_THREAD_PRIORITY_MAX - 2, 2);
-
- if (thread_phy_monitor != RT_NULL)
- {
- rt_thread_startup(thread_phy_monitor);
- }
- else
- {
- err = RT_ERROR;
- }
-
- return err;
-}
-INIT_PREV_EXPORT(phy_device_register);
-#endif /* RT_USING_PHY */
diff --git a/bsp/hpmicro/hpm6300evk/board/eth_phy_port.h b/bsp/hpmicro/hpm6300evk/board/eth_phy_port.h
deleted file mode 100644
index 70c24775e48a..000000000000
--- a/bsp/hpmicro/hpm6300evk/board/eth_phy_port.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2021 hpmicro
- *
- * SPDX-License-Identifier: BSD-3-Clause
- *
- */
-
-#ifndef ETH_PHY_PORT_H
-#define ETH_PHY_PORT_H
-
-#include "hpm_ioc_regs.h"
-#include
-
-#ifndef PHY_AUTO_NEGO
-#define PHY_AUTO_NEGO (1U)
-#endif
-
-#ifndef PHY_MDIO_CSR_CLK_FREQ
-#define PHY_MDIO_CSR_CLK_FREQ (200000000U)
-#endif
-
-enum phy_link_status
-{
- PHY_LINK_DOWN = 0U,
- PHY_LINK_UP
-};
-
-typedef struct {
- rt_uint32_t phy_speed;
- rt_uint32_t phy_duplex;
-} phy_info_t;
-
-typedef struct {
- rt_uint32_t phy_link;
- rt_phy_t phy;
- phy_info_t phy_info;
-} phy_device_t;
-
-/** @note PHY: RTL8201 */
-
-#define PHY_NAME ("RTL8201")
-#define PHY_ID1 (0x1CU)
-
-/* The PHY basic control register */
-#define PHY_BASIC_CONTROL_REG (0x00U)
-#define PHY_RESET_MASK (1U << 15)
-#define PHY_AUTO_NEGOTIATION_MASK (1U << 12)
-
-/* The PHY basic status register */
-#define PHY_BASIC_STATUS_REG (0x01U)
-#define PHY_LINKED_STATUS_MASK (1U << 2)
-#define PHY_AUTONEGO_COMPLETE_MASK (1U << 5)
-
-/* The PHY ID one register */
-#define PHY_ID1_REG (0x02U)
-
-/* The PHY ID two register */
-#define PHY_ID2_REG (0x03U)
-
-/* The PHY auto-negotiate advertise register */
-#define PHY_AUTONEG_ADVERTISE_REG (0x04U)
-
-/* The PHY status register. */
-#define PHY_STATUS_REG (0x00U)
-#define PHY_10M_MASK (1 << 13)
-#define PHY_100M_MASK (1 << 13)
-#define PHY_FULL_DUPLEX_MASK (1 << 8)
-#define PHY_STATUS_SPEED_10M(SR) ((SR) & PHY_100M_MASK) ? 0: 1
-#define PHY_STATUS_SPEED_100M(SR) ((SR) & PHY_100M_MASK)
-#define PHY_STATUS_FULL_DUPLEX(SR) ((SR) & PHY_FULL_DUPLEX_MASK)
-
-/* PHY0 register list */
-#define PHY0_REG_LIST PHY_BASIC_CONTROL_REG,\
- PHY_BASIC_STATUS_REG,\
- PHY_ID1_REG,\
- PHY_ID2_REG,\
- PHY_AUTONEG_ADVERTISE_REG,\
- PHY_STATUS_REG
-
-/* PHY0 register index */
-#define PHY_BASIC_STATUS_REG_IDX (1U)
-#define PHY_ID1_REG_IDX (2U)
-#define PHY_STATUS_REG_IDX (5U)
-
-#endif
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
deleted file mode 100644
index d083b1957f2e..000000000000
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 128K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 128K
- AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 384K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x10E0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- /* WHD related */
- KEEP(*whd_bus*.o (.text .text* .rodata .rodata*))
- KEEP(*whd_buffer_api.o (.text .text* .rodata .rodata*))
- KEEP(*whd_cdc_bdc.o (.text .text* .rodata .rodata*))
- KEEP(*whd_events.o (.text .text* .rodata .rodata*))
- KEEP(*whd_msgbuf_txrx.o (.text .text* .rodata .rodata*))
- KEEP(*whd_network_if.o (.text .text* .rodata .rodata*))
- KEEP(*whd_sdpcm.o (.text .text* .rodata .rodata*))
- KEEP(*whd_thread.o (.text .text* .rodata .rodata*))
- KEEP(*cyhal*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > DLM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > DLM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > DLM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt.ld
index f17f10208863..f8761a1dea03 100644
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -30,6 +30,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -177,7 +186,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -187,6 +196,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -278,7 +296,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fw_size__ = __data_end__ - __tdata_start__ + etext - __app_load_addr__; __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -305,7 +323,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.tdata) + SIZEOF(.data) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
@@ -336,7 +354,6 @@ SECTIONS
.sdram (NOLOAD) : {
. = ALIGN(8);
__sdram_start__ = .;
- . += SDRAM_SIZE;
__sdram_end__ = .;
} > SDRAM
}
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index 2bcf46ee20c7..000000000000
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,363 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 128K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 128K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 128K
- AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 384K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x10E0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.tdata) + SIZEOF(.data) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- . += SDRAM_SIZE;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_sdram_rtt.ld b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
deleted file mode 100644
index 8e0be81fec5f..000000000000
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
+++ /dev/null
@@ -1,335 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 1M;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 128K
- AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 512K
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > SDRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > SDRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_rtt.ld
index 39525b220b22..d4a80b999e6b 100644
--- a/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6300evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -115,6 +115,16 @@ SECTIONS
. = ALIGN(8);
} > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -217,7 +227,7 @@ SECTIONS
PROVIDE(__ramfunc_end__ = .);
} > ILM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.tdata) + SIZEOF(.data) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6300evk/board/pinmux.c b/bsp/hpmicro/hpm6300evk/board/pinmux.c
index 864ac4789706..7db0f81ab446 100644
--- a/bsp/hpmicro/hpm6300evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm6300evk/board/pinmux.c
@@ -46,19 +46,19 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins_as_gpio(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
/* I2C0 */
HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_GPIO_C_13;
HPM_IOC->PAD[IOC_PAD_PC14].FUNC_CTL = IOC_PC14_FUNC_CTL_GPIO_C_14;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PC13].FUNC_CTL = IOC_PC13_FUNC_CTL_I2C0_SCL
@@ -75,9 +75,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PC11].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
HPM_IOC->PAD[IOC_PAD_PC12].PAD_CTL = IOC_PAD_PAD_CTL_OD_SET(1) | IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
void init_femc_pins(void)
diff --git a/bsp/hpmicro/hpm6300evk/board/pinmux.h b/bsp/hpmicro/hpm6300evk/board/pinmux.h
index 2d6f6c8259e7..c8963a17d7a5 100644
--- a/bsp/hpmicro/hpm6300evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm6300evk/board/pinmux.h
@@ -13,7 +13,7 @@ extern "C" {
#endif
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_femc_pins(void);
void init_gpio_pins(void);
void init_spi_pins(SPI_Type *ptr);
@@ -35,7 +35,7 @@ void init_usb_pins(USB_Type *ptr);
void init_can_pins(CAN_Type *ptr);
void init_adc_bldc_pins(void);
void init_rgb_pwm_pins(void);
-void init_i2c_pins_as_gpio(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr);
void init_led_pins(void);
void init_trgmux_pins(uint32_t pin);
void init_enet_pps_pins(void);
diff --git a/bsp/hpmicro/hpm6300evk/board/rtt_board.c b/bsp/hpmicro/hpm6300evk/board/rtt_board.c
index 6335b08037ad..320168114052 100644
--- a/bsp/hpmicro/hpm6300evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6300evk/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm6300evk/makefile.targets b/bsp/hpmicro/hpm6300evk/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6300evk/rtconfig.h b/bsp/hpmicro/hpm6300evk/rtconfig.h
index 6b3e07557405..2d179724dd80 100644
--- a/bsp/hpmicro/hpm6300evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6300evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,7 +114,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -291,6 +301,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -318,12 +332,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -403,11 +429,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6300_SERIES
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
-#define SOC_HPM6300
+#define SOC_HPM6000
/* On-chip Peripheral Drivers */
@@ -419,6 +445,33 @@
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+
+/* AMPAK Wi-Fi module Configuration */
+
+/* end of AMPAK Wi-Fi module Configuration */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6300evk/rtconfig.py b/bsp/hpmicro/hpm6300evk/rtconfig.py
index dcf456c802c5..3b276240c1d9 100644
--- a/bsp/hpmicro/hpm6300evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6300evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6300evk/rtconfig_preinc.h b/bsp/hpmicro/hpm6300evk/rtconfig_preinc.h
new file mode 100644
index 000000000000..40641e6c8633
--- /dev/null
+++ b/bsp/hpmicro/hpm6300evk/rtconfig_preinc.h
@@ -0,0 +1,19 @@
+
+#ifndef RTCONFIG_PREINC_H__
+#define RTCONFIG_PREINC_H__
+
+/* Automatically generated file; DO NOT EDIT. */
+/* RT-Thread pre-include file */
+
+#define D45
+#define HPM6360
+#define HPM_SDK_L1C_NO_REENTRANT 1
+#define HPM_SOC_ISR_NUM 79
+#define RT_USING_LIBC
+#define RT_USING_NEWLIBC
+#define USE_DMA_DECLARE_EXT_ISR_M 1
+#define _POSIX_C_SOURCE 1
+#define _REENT_SMALL
+#define __RTTHREAD__
+
+#endif /*RTCONFIG_PREINC_H__*/
diff --git a/bsp/hpmicro/hpm6300evk/startup/HPM6360/startup.c b/bsp/hpmicro/hpm6300evk/startup/HPM6360/startup.c
index 1928adaf5809..a3e04d3e18cf 100644
--- a/bsp/hpmicro/hpm6300evk/startup/HPM6360/startup.c
+++ b/bsp/hpmicro/hpm6300evk/startup/HPM6360/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm6300evk/startup/HPM6360/toolchains/gcc/start.S b/bsp/hpmicro/hpm6300evk/startup/HPM6360/toolchains/gcc/start.S
index 350628abebe6..912f0df95747 100644
--- a/bsp/hpmicro/hpm6300evk/startup/HPM6360/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6300evk/startup/HPM6360/toolchains/gcc/start.S
@@ -52,11 +52,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
@@ -69,6 +78,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -81,3 +91,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6300evk/startup/SConscript b/bsp/hpmicro/hpm6300evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm6300evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6300evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6750evk/.config b/bsp/hpmicro/hpm6750evk/.config
index 518620520f88..855565dd2b88 100644
--- a/bsp/hpmicro/hpm6750evk/.config
+++ b/bsp/hpmicro/hpm6750evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,11 +188,14 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
+CONFIG_ARCH_RISCV=y
+CONFIG_ARCH_RISCV32=y
+
#
# RT-Thread Components
#
@@ -234,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -261,10 +274,10 @@ CONFIG_RT_USING_RTC=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -457,6 +470,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -572,6 +586,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -631,6 +646,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -779,6 +796,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -809,9 +828,24 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NRF5X_SDK is not set
# CONFIG_PKG_USING_NRFX is not set
+# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -890,11 +924,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -903,6 +944,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -982,6 +1040,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1036,6 +1095,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1086,6 +1146,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1103,6 +1164,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1160,6 +1224,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1185,6 +1251,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1424,6 +1491,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
+CONFIG_SOC_SERIES_HPM6000=y
+
#
# Hardware Drivers Config
#
@@ -1433,6 +1502,7 @@ CONFIG_SOC_HPM6000=y
# On-chip Peripheral Drivers
#
CONFIG_BSP_USING_GPIO=y
+CONFIG_BSP_GPIO_IRQ_PRIORITY=1
CONFIG_BSP_USING_UART=y
CONFIG_BSP_USING_UART0=y
CONFIG_BSP_UART0_RX_BUFSIZE=128
@@ -1467,4 +1537,28 @@ CONFIG_INIT_EXT_RAM_FOR_DATA=y
# CONFIG_BSP_USING_PANEL is not set
# CONFIG_BSP_USING_RTT_LCD_DRIVER is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6750evk/.settings/projcfg.ini b/bsp/hpmicro/hpm6750evk/.settings/projcfg.ini
index 1ae5ab732288..b977a95fea36 100644
--- a/bsp/hpmicro/hpm6750evk/.settings/projcfg.ini
+++ b/bsp/hpmicro/hpm6750evk/.settings/projcfg.ini
@@ -10,7 +10,7 @@ chip_name=HPM6750
selected_rtt_version=4.0.5
bsp_version=0.3.0
os_branch=full
-output_project_path=C\:/DevTools/RT-ThreadStudio/workspace
+output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm6750evk
is_base_example_project=True
is_use_scons_build=True
project_base_bsp=true
diff --git a/bsp/hpmicro/hpm6750evk/README.md b/bsp/hpmicro/hpm6750evk/README.md
index e0b34306cffe..0ab280a029e9 100644
--- a/bsp/hpmicro/hpm6750evk/README.md
+++ b/bsp/hpmicro/hpm6750evk/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6750evk/README_zh.md b/bsp/hpmicro/hpm6750evk/README_zh.md
index 9d8effddaf79..82f75ade0c24 100644
--- a/bsp/hpmicro/hpm6750evk/README_zh.md
+++ b/bsp/hpmicro/hpm6750evk/README_zh.md
@@ -74,14 +74,14 @@ HPM6750EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6750evk/SConscript b/bsp/hpmicro/hpm6750evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6750evk/SConscript
+++ b/bsp/hpmicro/hpm6750evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6750evk/SConstruct b/bsp/hpmicro/hpm6750evk/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6750evk/SConstruct
+++ b/bsp/hpmicro/hpm6750evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6750evk/applications/SConscript b/bsp/hpmicro/hpm6750evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6750evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6750evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6750evk/applications/main.c b/bsp/hpmicro/hpm6750evk/applications/main.c
index b766dd547e41..a70f2f26dd40 100644
--- a/bsp/hpmicro/hpm6750evk/applications/main.c
+++ b/bsp/hpmicro/hpm6750evk/applications/main.c
@@ -22,7 +22,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6750evk/board/Kconfig b/bsp/hpmicro/hpm6750evk/board/Kconfig
index 7d7f861b6aed..5f101bc9c01a 100644
--- a/bsp/hpmicro/hpm6750evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6750evk/board/Kconfig
@@ -15,11 +15,23 @@ config BSP_USING_ENET_PHY_DP83848
bool
default n
+if BSP_USING_ETH
+ config LWIP_SUPPORT_CUSTOM_PBUF
+ int
+ default 1
+endif
+
menu "On-chip Peripheral Drivers"
config BSP_USING_GPIO
bool "Enable GPIO"
select RT_USING_PIN if BSP_USING_GPIO
default n
+ if BSP_USING_GPIO
+ config BSP_GPIO_IRQ_PRIORITY
+ int "GPIO Interrupt Priority"
+ range 1 7
+ default 1
+ endif
menuconfig BSP_USING_UART
bool "Enable UART"
@@ -122,8 +134,6 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
@@ -134,36 +144,63 @@ menu "On-chip Peripheral Drivers"
default y
if BSP_USING_SPI1
config BSP_SPI1_USING_DMA
- bool "Enable SPI1 DMA"
- default n
+ bool "Enable SPI1 DMA"
+ default n
+ choice
+ prompt "Select SPI1 CS TYPE"
+ default BSP_SPI1_USING_SOFT_CS
+ config BSP_SPI1_USING_SOFT_CS
+ bool "Enable SPI1 software cs"
+ config BSP_SPI1_USING_HARD_CS
+ bool "Enable SPI1 hardware cs"
+ endchoice
endif
config BSP_USING_SPI2
bool "Enable SPI2"
default n
if BSP_USING_SPI2
config BSP_SPI2_USING_DMA
- bool "Enable SPI2 DMA"
- default n
+ bool "Enable SPI2 DMA"
+ default n
+ choice
+ prompt "Select SPI2 CS TYPE"
+ default BSP_SPI2_USING_SOFT_CS
+ config BSP_SPI2_USING_SOFT_CS
+ bool "Enable SPI2 software cs"
+ config BSP_SPI2_USING_HARD_CS
+ bool "Enable SPI2 hardware cs"
+ endchoice
endif
config BSP_USING_SPI3
bool "Enable SPI3"
default n
if BSP_USING_SPI3
config BSP_SPI3_USING_DMA
- bool "Enable SPI3 DMA"
- default n
+ bool "Enable SPI3 DMA"
+ default n
+ choice
+ prompt "Select SPI3 CS TYPE"
+ default BSP_SPI3_USING_SOFT_CS
+ config BSP_SPI3_USING_SOFT_CS
+ bool "Enable SPI3 software cs"
+ config BSP_SPI3_USING_HARD_CS
+ bool "Enable SPI3 hardware cs"
+ endchoice
endif
endif
menuconfig BSP_USING_RTC
bool "Enable RTC"
default n
+ select RT_USING_RTC if BSP_USING_RTC
menuconfig BSP_USING_ETH
bool "Enable Ethernet"
default n
- select RT_USING_ETH
+ select RT_USING_ETH if BSP_USING_ETH
+ select RT_USING_PHY if BSP_USING_ETH
+
if BSP_USING_ETH
config BSP_USING_ETH0
bool "Enable ETH0"
@@ -180,12 +217,23 @@ menu "On-chip Peripheral Drivers"
bool "Enable SDXC"
default n
select RT_USING_SDIO if BSP_USING_SDXC
+ select RT_USING_PIN if BSP_USING_SDXC
if BSP_USING_SDXC
config BSP_USING_SDXC0
bool "Enable SDXC0"
default n
if BSP_USING_SDXC0
- choice BSP_SDXC0_BUS_WIDTH_SEL
+ config BSP_SDXC0_ENABLE_INTERRUPT_DRIVEN
+ bool "Enable Interrupt-driven mode"
+ default n
+ config BSP_SDXC0_REQUIRE_CACHELINE_ALIGNED_BUF
+ bool "Always require cache-line aligned buffer"
+ default n
+ config BSP_SDXC0_IRQ_PRIORITY
+ int "SDXC Interrupt Priority"
+ range 1 7
+ default 1
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC0_BUS_WIDTH_8BIT
config BSP_SDXC0_BUS_WIDTH_1BIT
@@ -195,7 +243,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_BUS_WIDTH_8BIT
bool "8-bit"
endchoice
- choice BSP_SDXC0_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC0_VOLTAGE_3V3
config BSP_SDXC0_VOLTAGE_3V3
@@ -217,7 +265,17 @@ menu "On-chip Peripheral Drivers"
bool "Enable SDXC1"
default n
if BSP_USING_SDXC1
- choice BSP_SDXC1_BUS_WIDTH_SEL
+ config BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
+ bool "Enable Interrupt-driven mode"
+ default n
+ config BSP_SDXC1_REQUIRE_CACHELINE_ALIGNED_BUF
+ bool "Always require cache-line aligned buffer"
+ default n
+ config BSP_SDXC1_IRQ_PRIORITY
+ int "SDXC Interrupt Priority"
+ range 1 7
+ default 1
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC1_BUS_WIDTH_4BIT
config BSP_SDXC1_BUS_WIDTH_1BIT
@@ -225,7 +283,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_BUS_WIDTH_4BIT
bool "4-bit"
endchoice
- choice BSP_SDXC1_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC1_VOLTAGE_3V3
config BSP_SDXC1_VOLTAGE_3V3
@@ -248,8 +306,8 @@ menu "On-chip Peripheral Drivers"
bool "Enable touch"
default n
if BSP_USING_TOUCH
- config BSP_USING_TOUCH_GT911
- bool "Enable GT911"
+ config BSP_USING_TOUCH_GT9xx
+ bool "Enable GT9xx"
default y
config BSP_USING_TOUCH_FT5406
@@ -326,7 +384,6 @@ menu "On-chip Peripheral Drivers"
bool "INIT_EXT_RAM_FOR_DATA"
default y
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -335,6 +392,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
+ select RT_USING_PWM
menuconfig BSP_USING_DAO
bool "Enable Audio DAO play"
@@ -372,7 +430,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_WDG
bool "Enable Watchdog"
default n
@@ -414,7 +471,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC12
bool "Enable ADC12"
@@ -479,7 +536,51 @@ menu "On-chip Peripheral Drivers"
select BSP_USING_LCD
default n
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm6750evk/board/board.c b/bsp/hpmicro/hpm6750evk/board/board.c
index 80914af5aa8b..24bfbc6e6bfa 100644
--- a/bsp/hpmicro/hpm6750evk/board/board.c
+++ b/bsp/hpmicro/hpm6750evk/board/board.c
@@ -1276,3 +1276,61 @@ uint32_t board_init_gptmr_clock(GPTMR_Type *ptr)
}
return freq;
}
+
+uint32_t board_init_adc12_clock(ADC12_Type *ptr, bool clk_src_ahb)
+{
+ uint32_t freq = 0;
+
+ if (ptr == HPM_ADC0) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc0, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
+ clock_set_adc_source(clock_adc0, clk_adc_src_ana0);
+ clock_set_source_divider(clock_ana0, clk_src_pll1_clk1, 2U);
+ }
+ freq = clock_get_frequency(clock_adc0);
+ } else if (ptr == HPM_ADC1) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc1, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
+ clock_set_adc_source(clock_adc1, clk_adc_src_ana1);
+ clock_set_source_divider(clock_ana1, clk_src_pll1_clk1, 2U);
+ }
+ freq = clock_get_frequency(clock_adc1);
+ } else if (ptr == HPM_ADC2) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc2, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
+ clock_set_adc_source(clock_adc2, clk_adc_src_ana2);
+ clock_set_source_divider(clock_ana2, clk_src_pll1_clk1, 2U);
+ }
+ freq = clock_get_frequency(clock_adc2);
+ }
+
+ return freq;
+}
+uint32_t board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb)
+{
+ uint32_t freq = 0;
+
+ if (ptr == HPM_ADC3) {
+ if (clk_src_ahb) {
+ /* Configure the ADC clock from AHB (@200MHz by default)*/
+ clock_set_adc_source(clock_adc3, clk_adc_src_ahb0);
+ } else {
+ /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
+ clock_set_adc_source(clock_adc3, clk_adc_src_ana2);
+ clock_set_source_divider(clock_ana2, clk_src_pll1_clk1, 2U);
+ }
+
+ freq = clock_get_frequency(clock_adc3);
+ }
+
+ return freq;
+}
diff --git a/bsp/hpmicro/hpm6750evk/board/board.h b/bsp/hpmicro/hpm6750evk/board/board.h
index da43d3b139b9..3d5023874995 100644
--- a/bsp/hpmicro/hpm6750evk/board/board.h
+++ b/bsp/hpmicro/hpm6750evk/board/board.h
@@ -633,6 +633,8 @@ uint32_t board_init_cam_clock(CAM_Type *ptr);
uint32_t board_init_spi_clock(SPI_Type *ptr);
uint32_t board_init_adc_clock(void *ptr, bool clk_src_bus);
+uint32_t board_init_adc12_clock(ADC12_Type *ptr, bool clk_src_ahb);
+uint32_t board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb);
void board_init_acmp_clock(ACMP_Type *ptr);
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/boards/hpm6750evk.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/boards/hpm6750evk.cfg
index 9f15d4c2ec1d..c361eb0d573c 100644
--- a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/boards/hpm6750evk.cfg
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/boards/hpm6750evk.cfg
@@ -47,7 +47,7 @@
# - base address: 0x80000000
# - flash size: 0x2000000
# - flash option0: 0x7
-flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3040000 0x7
+flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3040000 0x7 0xe
proc init_clock {} {
$::_TARGET0 riscv dmi_write 0x39 0xF4002000
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
index 1e5fd26f1d85..59a3f2310d39 100644
--- a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
@@ -1,9 +1,12 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
-
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -14,43 +17,25 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-proc dmi_write {reg value} {
- $::_TARGET0 riscv dmi_write ${reg} ${value}
-}
-
-proc dmi_read {reg} {
- set v [$::_TARGET0 riscv dmi_read ${reg}]
- return ${v}
-}
-proc dmi_write_memory {addr value} {
- dmi_write 0x39 ${addr}
- dmi_write 0x3C ${value}
-}
-
-proc dmi_read_memory {addr} {
- set sbcs [expr 0x100000 | [dmi_read 0x38]]
- dmi_write 0x38 ${sbcs}
- dmi_write 0x39 ${addr}
- set value [dmi_read 0x3C]
- return ${value}
-}
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
proc release_core1 {} {
- set chip_rev [dmi_read_memory 0x2001FF00]
+ set chip_rev [sba_read_mem 0x2001FF00]
if {$chip_rev != 0x56010100 } {
# set start point for core1
- dmi_write_memory 0xF4002C08 0x20016284
+ sba_write_mem 0xF4002C08 0x20016284
} else {
- dmi_write_memory 0xF4002C08 0x2001660c
+ sba_write_mem 0xF4002C08 0x2001660c
}
# set boot flag for core1
- dmi_write_memory 0xF4002C0C 0xC1BEF1A9
+ sba_write_mem 0xF4002C0C 0xC1BEF1A9
# release core1
- dmi_write_memory 0xF4002C00 0x1000
+ sba_write_mem 0xF4002C00 0x1000
}
set _TARGET1 $_CHIP.cpu1
@@ -66,3 +51,6 @@ $_TARGET1 configure -event reset-deassert-pre {
release_core1
}
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
index f873527fb721..0454c4d0f9ee 100644
--- a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
deleted file mode 100644
index 2f39e2409d8d..000000000000
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 768K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- /* hpm_sdk drivers */
- KEEP(*hpm_sdxc_drv*.o (.text .text* .rodata .rodata*))
-
- /* WHD related */
- KEEP(*whd_bus*.o (.text .text* .rodata .rodata*))
- KEEP(*whd_sdpcm*.o (.text .text* .rodata .rodata*))
- KEEP(*whd_thread*.o (.text .text* .rodata .rodata*))
-
- /* LWIP */
- KEEP(*lwip*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt.ld
index 8b4f6137da88..22c8ee3a208f 100644
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -14,9 +14,9 @@ SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
MEMORY
{
XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
+ ILM (wx) : ORIGIN = 0, LENGTH = 256K
+ DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
+ AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 1280K
NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
@@ -31,6 +31,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -46,26 +55,24 @@ SECTIONS
.start __app_load_addr__ : {
. = ALIGN(8);
KEEP(*(.start))
- . = ALIGN(16);
} > XPI0
__vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
.vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
+ . = ALIGN(8);
__vector_ram_start__ = .;
KEEP(*(.vector_table))
KEEP(*(.isr_vector))
- . = ALIGN(16);
+ . = ALIGN(8);
__vector_ram_end__ = .;
} > AXI_SRAM
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
+ __fast_load_addr__ = etext + __data_end__ - __tdata_start__;
+ .fast : AT(etext + __data_end__ - __tdata_start__) {
+ . = ALIGN(8);
__ramfunc_start__ = .;
*(.fast)
- *(.fast.*)
- . = ALIGN(16);
/* RT-Thread Core Start */
KEEP(*context_gcc.o(.text* .rodata*))
@@ -89,12 +96,12 @@ SECTIONS
/* HPMicro Driver Wrapper */
KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- . = ALIGN(16);
+ . = ALIGN(8);
__ramfunc_end__ = .;
} > AXI_SRAM
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
+ .text (__vector_load_addr__ + __vector_ram_end__ - __vector_ram_start__) : {
+ . = ALIGN(8);
*(.text)
*(.text*)
*(.rodata)
@@ -152,20 +159,6 @@ SECTIONS
} > XPI0
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
.rel : {
KEEP(*(.rel*))
} > XPI0
@@ -178,8 +171,8 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
+ .fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
KEEP(*(.fast_ram.init))
@@ -188,6 +181,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -208,26 +210,24 @@ SECTIONS
. = ALIGN(8);
__tbss_start__ = .;
*(.tbss*)
- *(.gnu.linkonce.tb.*)
*(.tcommon*)
_end = .;
__tbss_end__ = .;
} > AXI_SRAM
__tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
+ .tdata : AT(etext) {
. = ALIGN(8);
__tdata_start__ = .;
__thread_pointer = .;
*(.tdata)
*(.tdata*)
- *(.gnu.linkonce.td.*)
. = ALIGN(8);
__tdata_end__ = .;
} > AXI_SRAM
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
+ __data_load_addr__ = etext + __tdata_end__ - __tdata_start__;
+ .data : AT(etext + __tdata_end__ - __tdata_start__) {
. = ALIGN(8);
__data_start__ = .;
__global_pointer$ = . + 0x800;
@@ -279,9 +279,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
+ __fw_size__ = __data_end__ - __tdata_start__ + etext - __app_load_addr__;
.heap(NOLOAD) : {
. = ALIGN(8);
@@ -306,8 +304,8 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
+ __noncacheable_init_load_addr__ = etext + __data_end__ - __tdata_start__ + __ramfunc_end__ - __ramfunc_start__;
+ .noncacheable.init : AT(etext + __data_end__ - __tdata_start__ + __ramfunc_end__ - __ramfunc_start__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
KEEP(*(.noncacheable.init))
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index bcd6c6e12527..000000000000
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_sdram_rtt.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
deleted file mode 100644
index 8618b40e5502..000000000000
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 1M;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > SDRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > SDRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_rtt.ld
index e03cd86e664b..ee99c9c4064a 100644
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -12,10 +12,9 @@ NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
MEMORY
{
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 512K
- AXI_SRAM1 (w) : ORIGIN = 0x01100000, LENGTH = 768K
+ ILM (wx) : ORIGIN = 0, LENGTH = 256K
+ DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
+ AXI_SRAM (wx) : ORIGIN = 0x1080000, LENGTH = 1280K
NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
@@ -88,53 +87,65 @@ SECTIONS
/* RT-Thread related sections - end */
-
/* section information for usbh class */
. = ALIGN(8);
__usbh_class_info_start__ = .;
KEEP(*(.usbh_class_info))
__usbh_class_info_end__ = .;
- . = ALIGN(8);
- } > AXI_SRAM
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > AXI_SRAM
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > AXI_SRAM
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
+ PROVIDE (__etext = .);
+ PROVIDE (_etext = .);
+ PROVIDE (etext = .);
+ } > AXI_SRAM
.rel : {
KEEP(*(.rel*))
} > AXI_SRAM
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
.fast_ram (NOLOAD) : {
KEEP(*(.fast_ram))
} > DLM
- /* NOTE:
- Please keep in mind that the load section for rw data is after .text section
- Here end user should avoid place any NOLOAD sections (such as .bss) in the space between .text section
- and data load section if all sections are placed into the same adjacent space. Otherwise, the following conditions must be taken into account:
- 1. The size for all NOLOAD sections smust be added during computing __data_load_addr__
- 2. the generated binary file will be larger because the space occupied by
- NOLOAD sections will be filled
- */
- __data_load_addr__ = __etext;
- .data : AT(__data_load_addr__) {
- __data_start__ = .;
+ .bss(NOLOAD) : {
+ . = ALIGN(8);
+ __bss_start__ = .;
+ *(.bss)
+ *(.bss*)
+ *(.sbss*)
+ *(.scommon)
+ *(.scommon*)
+ *(.dynsbss*)
+ *(COMMON)
+ . = ALIGN(8);
+ _end = .;
+ __bss_end__ = .;
+ } > DLM
+
+ /* Note: .tbss and .tdata should be adjacent */
+ .tbss(NOLOAD) : {
+ . = ALIGN(8);
+ __tbss_start__ = .;
+ *(.tbss*)
+ *(.tcommon*)
+ _end = .;
+ __tbss_end__ = .;
+ } > DLM
+
+ __tdata_load_addr__ = etext;
+ .tdata : AT(etext) {
+ . = ALIGN(8);
+ __tdata_start__ = .;
+ __thread_pointer = .;
+ *(.tdata)
+ *(.tdata*)
. = ALIGN(8);
+ __tdata_end__ = .;
+ } > DLM
+
+ __data_load_addr__ = etext + __tdata_end__ - __tdata_start__;
+ .data : AT(etext + __tdata_end__ - __tdata_start__) {
+ . = ALIGN(8);
+ __data_start__ = .;
__global_pointer$ = . + 0x800;
*(.data)
*(.data*)
@@ -184,27 +195,18 @@ SECTIONS
PROVIDE (__edata = .);
PROVIDE (_edata = .);
PROVIDE (edata = .);
- } > AXI_SRAM
+ } > DLM
- __fast_load_addr__ = __data_load_addr__ + SIZEOF(.data);
- .fast : AT(__fast_load_addr__) {
- PROVIDE(__ramfunc_start__ = .);
+ __fast_load_addr__ = etext + __data_end__ - __tdata_start__;
+ .fast : AT(etext + __data_end__ - __tdata_start__) {
. = ALIGN(8);
+ PROVIDE(__ramfunc_start__ = .);
*(.fast)
. = ALIGN(8);
PROVIDE(__ramfunc_end__ = .);
} > AXI_SRAM
- __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -214,45 +216,23 @@ SECTIONS
. = ALIGN(8);
} > DLM
- /* Note: .tbss and .tdata should be adjacent */
- __tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
+ .fast_ram.bss (NOLOAD) : {
. = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- /* Note: Place all NOLOAD sections together */
- .tbss(NOLOAD) : {
- . += SIZEOF(.noncacheable.init);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
. = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM1
+ } > DLM
- .bss(NOLOAD) : {
+ __noncacheable_init_load_addr__ = etext + __data_end__ - __tdata_start__ + __ramfunc_end__ - __ramfunc_start__;
+ .noncacheable.init : AT(etext + __data_end__ - __tdata_start__ + __ramfunc_end__ - __ramfunc_start__) {
. = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
+ __noncacheable_init_start__ = .;
+ KEEP(*(.noncacheable.init))
+ __noncacheable_init_end__ = .;
. = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM1
+ } > NONCACHEABLE_RAM
.noncacheable.bss (NOLOAD) : {
. = ALIGN(8);
@@ -284,11 +264,11 @@ SECTIONS
PROVIDE (_stack = .);
PROVIDE (_stack_in_dlm = .);
PROVIDE (__rt_rvstack = .);
- } > AXI_SRAM1
+ } > DLM
.framebuffer (NOLOAD) : {
KEEP(*(.framebuffer))
- } > AXI_SRAM1
+ } > AXI_SRAM
.heap (NOLOAD) : {
. = ALIGN(8);
@@ -296,7 +276,7 @@ SECTIONS
. += HEAP_SIZE;
__heap_end__ = .;
- } > AXI_SRAM1
+ } > AXI_SRAM
.sdram (NOLOAD) : {
. = ALIGN(8);
diff --git a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_sdram_rtt.ld b/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
deleted file mode 100644
index fc810f781dcc..000000000000
--- a/bsp/hpmicro/hpm6750evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-SECTIONS
-{
- .start : {
- . = ALIGN(8);
- KEEP(*(.start))
- } > AXI_SRAM
-
- .vectors : {
- . = ALIGN(8);
- KEEP(*(.isr_vector))
- KEEP(*(.vector_table))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .text : {
- . = ALIGN(8);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
- *(FalPartTable)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > AXI_SRAM
-
- .rel : {
- KEEP(*(.rel*))
- } > AXI_SRAM
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > AXI_SRAM
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > AXI_SRAM
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
- . = ALIGN(8);
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- /* NOTE:
- Please keep in mind that the load section for rw data is after .text section
- Here end user should avoid place any NOLOAD sections (such as .bss) in the space between .text section
- and data load section if all sections are placed into the same adjacent space. Otherwise, the following conditions must be taken into account:
- 1. The size for all NOLOAD sections smust be added during computing __data_load_addr__
- 2. the generated binary file will be larger because the space occupied by
- NOLOAD sections will be filled
- */
- __data_load_addr__ = __etext;
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
-
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
-
- __fast_load_addr__ = __data_load_addr__ + SIZEOF(.data);
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(8);
- PROVIDE(__ramfunc_start__ = .);
- *(.fast)
- . = ALIGN(8);
- PROVIDE(__ramfunc_end__ = .);
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- /* Note: .tbss and .tdata should be adjacent */
- __tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- /* Note: Place all NOLOAD sections together */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE (__rt_rvstack = .);
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- KEEP(*(.framebuffer))
- } > SDRAM
-
- .heap (NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
-
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk/board/rtt_board.c b/bsp/hpmicro/hpm6750evk/board/rtt_board.c
index ea3693f14109..46ec3e07b5f4 100644
--- a/bsp/hpmicro/hpm6750evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6750evk/board/rtt_board.c
@@ -39,14 +39,20 @@ void rtt_board_init(void)
{
rtt_os_tick_clock();
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
@@ -128,64 +134,12 @@ void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
uint32_t rtt_board_init_adc12_clock(ADC12_Type *ptr, bool clk_src_ahb)
{
- uint32_t freq = 0;
-
- if (ptr == HPM_ADC0) {
- if (clk_src_ahb) {
- /* Configure the ADC clock from AHB (@200MHz by default)*/
- clock_set_adc_source(clock_adc0, clk_adc_src_ahb0);
- } else {
- /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
- clock_set_adc_source(clock_adc0, clk_adc_src_ana0);
- clock_set_source_divider(clock_ana0, clk_src_pll1_clk1, 2U);
- }
- clock_add_to_group(clock_adc0, 0);
- freq = clock_get_frequency(clock_adc0);
- } else if (ptr == HPM_ADC1) {
- if (clk_src_ahb) {
- /* Configure the ADC clock from AHB (@200MHz by default)*/
- clock_set_adc_source(clock_adc1, clk_adc_src_ahb0);
- } else {
- /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
- clock_set_adc_source(clock_adc1, clk_adc_src_ana1);
- clock_set_source_divider(clock_ana1, clk_src_pll1_clk1, 2U);
- }
- clock_add_to_group(clock_adc1, 0);
- freq = clock_get_frequency(clock_adc1);
- } else if (ptr == HPM_ADC2) {
- if (clk_src_ahb) {
- /* Configure the ADC clock from AHB (@200MHz by default)*/
- clock_set_adc_source(clock_adc2, clk_adc_src_ahb0);
- } else {
- /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
- clock_set_adc_source(clock_adc2, clk_adc_src_ana2);
- clock_set_source_divider(clock_ana2, clk_src_pll1_clk1, 2U);
- }
- clock_add_to_group(clock_adc2, 0);
- freq = clock_get_frequency(clock_adc2);
- }
-
- return freq;
+ return board_init_adc12_clock(ptr, clk_src_ahb);
}
uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb)
{
- uint32_t freq = 0;
-
- if (ptr == HPM_ADC3) {
- if (clk_src_ahb) {
- /* Configure the ADC clock from AHB (@200MHz by default)*/
- clock_set_adc_source(clock_adc3, clk_adc_src_ahb0);
- } else {
- /* Configure the ADC clock from pll1_clk1 divided by 2 (@200MHz by default) */
- clock_set_adc_source(clock_adc3, clk_adc_src_ana2);
- clock_set_source_divider(clock_ana2, clk_src_pll1_clk1, 2U);
- }
- clock_add_to_group(clock_adc3, 0);
- freq = clock_get_frequency(clock_adc3);
- }
-
- return freq;
+ return board_init_adc16_clock(ptr, clk_src_ahb);
}
uint32_t rtt_board_init_i2s_clock(I2S_Type *ptr)
@@ -260,4 +214,4 @@ ATTR_PLACE_AT(".isr_vector") void mchtmr_isr(void)
HPM_MCHTMR->MTIMECMP = HPM_MCHTMR->MTIME + BOARD_MCHTMR_FREQ_IN_HZ / RT_TICK_PER_SECOND;
rt_tick_increase();
-}
\ No newline at end of file
+}
diff --git a/bsp/hpmicro/hpm6750evk/makefile.targets b/bsp/hpmicro/hpm6750evk/makefile.targets
index 502182f4e708..4583a13f1cd3 100644
--- a/bsp/hpmicro/hpm6750evk/makefile.targets
+++ b/bsp/hpmicro/hpm6750evk/makefile.targets
@@ -3,4 +3,4 @@ clean2:
-$(RM) $(OBJS) *.elf
-@echo ' '
-*.elf: $(wildcard ../board/linker_scripts/flash_xip_rtt.ld)
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6750evk/rtconfig.h b/bsp/hpmicro/hpm6750evk/rtconfig.h
index 146fd6e9ff6d..51268a678d62 100644
--- a/bsp/hpmicro/hpm6750evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6750evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,9 +114,11 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
+#define ARCH_RISCV
+#define ARCH_RISCV32
/* RT-Thread Components */
@@ -289,6 +301,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -316,12 +332,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -401,6 +429,7 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
@@ -409,6 +438,7 @@
/* On-chip Peripheral Drivers */
#define BSP_USING_GPIO
+#define BSP_GPIO_IRQ_PRIORITY 1
#define BSP_USING_UART
#define BSP_USING_UART0
#define BSP_UART0_RX_BUFSIZE 128
@@ -416,6 +446,21 @@
#define BSP_USING_FEMC
#define INIT_EXT_RAM_FOR_DATA
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6750evk/rtconfig.py b/bsp/hpmicro/hpm6750evk/rtconfig.py
index 14ba9b7129d6..a859c323d70d 100644
--- a/bsp/hpmicro/hpm6750evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6750evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6750evk/startup/HPM6750/startup.c b/bsp/hpmicro/hpm6750evk/startup/HPM6750/startup.c
index 4fc6914d5664..54517adc4db5 100644
--- a/bsp/hpmicro/hpm6750evk/startup/HPM6750/startup.c
+++ b/bsp/hpmicro/hpm6750evk/startup/HPM6750/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
/* NOTE: Invalid I-Cache in case the I-Cache was filled with incorrect data during prefetch before copying the ram
* function code to its destination.
*/
diff --git a/bsp/hpmicro/hpm6750evk/startup/HPM6750/toolchains/gcc/start.S b/bsp/hpmicro/hpm6750evk/startup/HPM6750/toolchains/gcc/start.S
index 5ac683dbc279..6b394172aa87 100644
--- a/bsp/hpmicro/hpm6750evk/startup/HPM6750/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6750evk/startup/HPM6750/toolchains/gcc/start.S
@@ -58,11 +58,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
@@ -75,6 +84,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -87,3 +97,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6750evk/startup/SConscript b/bsp/hpmicro/hpm6750evk/startup/SConscript
index 3c804fe451bc..97393e8517f8 100644
--- a/bsp/hpmicro/hpm6750evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6750evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
diff --git a/bsp/hpmicro/hpm6750evk2/.config b/bsp/hpmicro/hpm6750evk2/.config
index 9b7c8b0fb733..fd23979bf724 100644
--- a/bsp/hpmicro/hpm6750evk2/.config
+++ b/bsp/hpmicro/hpm6750evk2/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -254,11 +264,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -279,10 +289,10 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -485,6 +495,7 @@ CONFIG_RT_USING_POSIX_POLL=y
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -600,6 +611,7 @@ CONFIG_RT_USING_POSIX_POLL=y
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -659,6 +671,8 @@ CONFIG_RT_USING_POSIX_POLL=y
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -807,6 +821,8 @@ CONFIG_RT_USING_POSIX_POLL=y
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -840,7 +856,21 @@ CONFIG_RT_USING_POSIX_POLL=y
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -919,11 +949,18 @@ CONFIG_RT_USING_POSIX_POLL=y
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -932,6 +969,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -1011,6 +1065,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1065,6 +1120,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1115,6 +1171,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1132,6 +1189,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1189,6 +1249,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1214,6 +1276,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1453,12 +1516,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6700_SERIES=y
+CONFIG_SOC_SERIES_HPM6000=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM6700=y
+CONFIG_SOC_HPM6000=y
#
# On-chip Peripheral Drivers
@@ -1485,6 +1548,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART13 is not set
# CONFIG_BSP_USING_UART14 is not set
# CONFIG_BSP_USING_UART15 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_ETH is not set
@@ -1511,5 +1575,57 @@ CONFIG_INIT_EXT_RAM_FOR_DATA=y
# CONFIG_BSP_USING_CAM is not set
# CONFIG_BSP_USING_PANEL is not set
# CONFIG_BSP_USING_RTT_LCD_DRIVER is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_QEI is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_TAMP is not set
+# CONFIG_BSP_USING_VAD is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+
+#
+# AMPAK Wi-Fi module Configuration
+#
+# end of AMPAK Wi-Fi module Configuration
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6750evk2/README.md b/bsp/hpmicro/hpm6750evk2/README.md
index dd06637e3416..f1b197e67b06 100644
--- a/bsp/hpmicro/hpm6750evk2/README.md
+++ b/bsp/hpmicro/hpm6750evk2/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk2.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk2.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk2.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk2.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6750evk2/README_zh.md b/bsp/hpmicro/hpm6750evk2/README_zh.md
index ab908fe462e1..16d547150263 100644
--- a/bsp/hpmicro/hpm6750evk2/README_zh.md
+++ b/bsp/hpmicro/hpm6750evk2/README_zh.md
@@ -74,14 +74,14 @@ HPM6750EVK2 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk2.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk2.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\cmsis_dap.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evk2.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\cmsis_dap.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evk2.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6750evk2/SConscript b/bsp/hpmicro/hpm6750evk2/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6750evk2/SConscript
+++ b/bsp/hpmicro/hpm6750evk2/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6750evk2/SConstruct b/bsp/hpmicro/hpm6750evk2/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6750evk2/SConstruct
+++ b/bsp/hpmicro/hpm6750evk2/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6750evk2/applications/SConscript b/bsp/hpmicro/hpm6750evk2/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6750evk2/applications/SConscript
+++ b/bsp/hpmicro/hpm6750evk2/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6750evk2/applications/main.c b/bsp/hpmicro/hpm6750evk2/applications/main.c
index b766dd547e41..a70f2f26dd40 100644
--- a/bsp/hpmicro/hpm6750evk2/applications/main.c
+++ b/bsp/hpmicro/hpm6750evk2/applications/main.c
@@ -22,7 +22,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6750evk2/board/Kconfig b/bsp/hpmicro/hpm6750evk2/board/Kconfig
index 5e67a28a1391..2b9d9b1e8e0c 100644
--- a/bsp/hpmicro/hpm6750evk2/board/Kconfig
+++ b/bsp/hpmicro/hpm6750evk2/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM6700
+config SOC_HPM6000
bool
- select SOC_HPM6700_SERIES
+ select SOC_SERIES_HPM6000
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -466,9 +466,27 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
@@ -485,7 +503,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -493,7 +511,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -515,7 +533,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -523,7 +541,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -536,7 +554,7 @@ menu "On-chip Peripheral Drivers"
endif
config BSP_USING_SPI2
bool "Enable SPI2"
- default n
+ default y
if BSP_USING_SPI2
config BSP_SPI2_USING_DMA
bool "Enable SPI2 DMA"
@@ -545,7 +563,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -553,7 +571,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -575,7 +593,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -583,7 +601,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -633,7 +651,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC0_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC0_USE_CACHEABLE_BUFFER
config BSP_SDXC0_USE_CACHEABLE_BUFFER
@@ -661,7 +679,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC0_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC0_BUS_WIDTH_8BIT
config BSP_SDXC0_BUS_WIDTH_1BIT
@@ -671,7 +689,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_BUS_WIDTH_8BIT
bool "8-bit"
endchoice
- choice BSP_SDXC0_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC0_VOLTAGE_3V3
config BSP_SDXC0_VOLTAGE_3V3
@@ -696,7 +714,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC1_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC1_USE_CACHEABLE_BUFFER
config BSP_SDXC1_USE_CACHEABLE_BUFFER
@@ -723,7 +741,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC1_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC1_BUS_WIDTH_4BIT
config BSP_SDXC1_BUS_WIDTH_1BIT
@@ -731,7 +749,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_BUS_WIDTH_4BIT
bool "4-bit"
endchoice
- choice BSP_SDXC1_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC1_VOLTAGE_3V3
config BSP_SDXC1_VOLTAGE_3V3
@@ -789,6 +807,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -859,6 +878,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -923,7 +951,6 @@ menu "On-chip Peripheral Drivers"
bool "INIT_EXT_RAM_FOR_DATA"
default y
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -932,7 +959,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWM
+ select RT_USING_PWM
menuconfig BSP_USING_DAO
bool "Enable Audio DAO play"
@@ -971,7 +998,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_WDG
bool "Enable Watchdog"
default n
@@ -1037,7 +1063,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC12
bool "Enable ADC12"
@@ -1052,7 +1078,7 @@ menu "On-chip Peripheral Drivers"
config BSP_USING_ADC2
bool "Enable ADC2"
default n
- endif
+ endif
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
default n
@@ -1061,7 +1087,7 @@ menu "On-chip Peripheral Drivers"
bool "Enable ADC3"
default n
endif
- endif
+ endif
menuconfig BSP_USING_CAMERA
bool "Enable camera"
@@ -1106,6 +1132,322 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_QEI
+ bool "Enable QEI (Quadrature Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_FEMC
+ bool "Enable FEMC (Flexible External Memory Controller)"
+ default n
+
+ menuconfig BSP_USING_VAD
+ bool "Enable VAD"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+menu "AMPAK Wi-Fi module Configuration"
+config BSP_USING_MHD_WIFI
+bool
+default y if RT_USING_MHD
+select BSP_USING_SDXC
+select BSP_USING_SDXC1
+select BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
+help
+ Automatically enable SDXC1 interface when WiFi MHD driver is enabled.
+ Note: Please manually select non-cacheable buffer and fast RAM options for SDXC1 if needed.
+
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/boards/hpm6750evk2.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/boards/hpm6750evk2.cfg
index 4af46a3ebb2d..9882c35c99c2 100644
--- a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/boards/hpm6750evk2.cfg
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/boards/hpm6750evk2.cfg
@@ -16,7 +16,7 @@
# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
# 0 - Not needed
-# 1 - QE bit is at bit 6 in Status Register 1
+# 1 - QE bit is at bit6 in Status Register 1
# 2 - QE bit is at bit1 in Status Register 2
# 3 - QE bit is at bit7 in Status Register 2
# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
@@ -50,288 +50,187 @@
flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3040000 0x7
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
proc init_sdram { } {
# configure femc frequency
# 133Mhz pll1_clk0: 266Mhz divide by 2
- #$::_TARGET0 riscv dmi_write 0x39 0xF4001820
- #$::_TARGET0 riscv dmi_write 0x3C 0x201
+ #mww 0xF4001820 0x201
# 166Mhz pll2_clk0: 333Mhz divide by 2
- $::_TARGET0 riscv dmi_write 0x39 0xF4001820
- $::_TARGET0 riscv dmi_write 0x3C 0x401
+ mww 0xF4001820 0x401
# PC01
- $::_TARGET0 riscv dmi_write 0x39 0xF4040208
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040208 0xC
# PC00
- $::_TARGET0 riscv dmi_write 0x39 0xF4040200
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040200 0xC
# PB31
- $::_TARGET0 riscv dmi_write 0x39 0xF40401F8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401F8 0xC
# PB30
- $::_TARGET0 riscv dmi_write 0x39 0xF40401F0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401F0 0xC
# PB29
- $::_TARGET0 riscv dmi_write 0x39 0xF40401E8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401E8 0xC
# PB28
- $::_TARGET0 riscv dmi_write 0x39 0xF40401E0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401E0 0xC
# PB27
- $::_TARGET0 riscv dmi_write 0x39 0xF40401D8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401D8 0xC
# PB26
- $::_TARGET0 riscv dmi_write 0x39 0xF40401D0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401D0 0xC
# PB25
- $::_TARGET0 riscv dmi_write 0x39 0xF40401C8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401C8 0xC
# PB24
- $::_TARGET0 riscv dmi_write 0x39 0xF40401C0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401C0 0xC
# PB23
- $::_TARGET0 riscv dmi_write 0x39 0xF40401B8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401B8 0xC
# PB22
- $::_TARGET0 riscv dmi_write 0x39 0xF40401B0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401B0 0xC
# PB21
- $::_TARGET0 riscv dmi_write 0x39 0xF40401A8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401A8 0xC
# PB20
- $::_TARGET0 riscv dmi_write 0x39 0xF40401A0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40401A0 0xC
# PB19
- $::_TARGET0 riscv dmi_write 0x39 0xF4040198
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040198 0xC
# PB18
- $::_TARGET0 riscv dmi_write 0x39 0xF4040190
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040190 0xC
# PD13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040368
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040368 0xC
# PD12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040360
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040360 0xC
# PD10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040350
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040350 0xC
# PD09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040348
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040348 0xC
# PD08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040340
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040340 0xC
# PD07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040338
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040338 0xC
# PD06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040330
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040330 0xC
# PD05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040328
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040328 0xC
# PD04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040320
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040320 0xC
# PD03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040318
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040318 0xC
# PD02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040310
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040310 0xC
# PD01
- $::_TARGET0 riscv dmi_write 0x39 0xF4040308
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040308 0xC
# PD00
- $::_TARGET0 riscv dmi_write 0x39 0xF4040300
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040300 0xC
# PC29
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402E8 0xC
# PC28
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402E0 0xC
# PC27
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402D8 0xC
# PC22
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402B0 0xC
# PC21
- $::_TARGET0 riscv dmi_write 0x39 0xF40402A8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402A8 0xC
# PC17
- $::_TARGET0 riscv dmi_write 0x39 0xF4040288
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040288 0xC
# PC15
- $::_TARGET0 riscv dmi_write 0x39 0xF4040278
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040278 0xC
# PC12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040260
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040260 0xC
# PC11
- $::_TARGET0 riscv dmi_write 0x39 0xF4040258
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040258 0xC
# PC10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040250
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040250 0xC
# PC09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040248
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040248 0xC
# PC08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040240
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040240 0xC
# PC07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040238
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040238 0xC
# PC06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040230
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040230 0xC
# PC05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040228
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040228 0xC
# PC04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040220
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040220 0xC
# PC14
- $::_TARGET0 riscv dmi_write 0x39 0xF4040270
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040270 0xC
# PC13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040268
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040268 0xC
# PC16
- # $::_TARGET0 riscv dmi_write 0x39 0xF4040280
- #$::_TARGET0 riscv dmi_write 0x3C 0x1000C
+ # mww 0xF4040280 0x1000C
# PC26
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402D0 0xC
# PC25
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402C8 0xC
# PC19
- $::_TARGET0 riscv dmi_write 0x39 0xF4040298
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040298 0xC
# PC18
- $::_TARGET0 riscv dmi_write 0x39 0xF4040290
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040290 0xC
# PC23
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402B8 0xC
# PC24
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402C0 0xC
# PC30
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402F0 0xC
# PC31
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402F8 0xC
# PC02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040210
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040210 0xC
# PC03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040218
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040218 0xC
# femc configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
+ mww 0xF3050000 0x1
sleep 10
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
- $::_TARGET0 riscv dmi_write 0x39 0xF3050008
- $::_TARGET0 riscv dmi_write 0x3C 0x30524
- $::_TARGET0 riscv dmi_write 0x39 0xF305000C
- $::_TARGET0 riscv dmi_write 0x3C 0x6030524
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x10000000
+ mww 0xF3050000 0x2
+ mww 0xF3050008 0x30524
+ mww 0xF305000C 0x6030524
+ mww 0xF3050000 0x10000000
- $::_TARGET0 riscv dmi_write 0x39 0xF3050010
- $::_TARGET0 riscv dmi_write 0x3C 0x4000001b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050014
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3050040
- $::_TARGET0 riscv dmi_write 0x3C 0xf32
+ mww 0xF3050010 0x4000001b
+ mww 0xF3050014 0
+ mww 0xF3050040 0xf32
# 133Mhz configuration
- #$::_TARGET0 riscv dmi_write 0x39 0xF3050044
- #$::_TARGET0 riscv dmi_write 0x3C 0x884e22
+ #mww 0xF3050044 0x884e22
# 166Mhz configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050044
- $::_TARGET0 riscv dmi_write 0x3C 0x884e33
+ mww 0xF3050044 0x884e33
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020300
+ mww 0xF3050048 0x1020d0d
+ mww 0xF3050048 0x1020d0d
+ mww 0xF305004C 0x2020300
# config delay cell
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x3b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x203b
+ mww 0xF3050150 0x3b
+ mww 0xF3050150 0x203b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050094
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3050098
- $::_TARGET0 riscv dmi_write 0x3C 0
+ mww 0xF3050094 0
+ mww 0xF3050098 0
# precharge all
- $::_TARGET0 riscv dmi_write 0x39 0xF3050090
- $::_TARGET0 riscv dmi_write 0x3C 0x40000000
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000F
+ mww 0xF3050090 0x40000000
+ mww 0xF305009C 0xA55A000F
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# auto refresh
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305003C 0x3
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# set mode
- $::_TARGET0 riscv dmi_write 0x39 0xF30500A0
- $::_TARGET0 riscv dmi_write 0x3C 0x33
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000A
+ mww 0xF30500A0 0x33
+ mww 0xF305009C 0xA55A000A
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020301
+ mww 0xF305004C 0x2020301
echo "SDRAM has been initialized"
}
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
index 32b87da2cf3c..59a3f2310d39 100644
--- a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
@@ -1,9 +1,12 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
-
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -14,43 +17,25 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-proc dmi_write {reg value} {
- $::_TARGET0 riscv dmi_write ${reg} ${value}
-}
-
-proc dmi_read {reg} {
- set v [$::_TARGET0 riscv dmi_read ${reg}]
- return ${v}
-}
-proc dmi_write_memory {addr value} {
- dmi_write 0x39 ${addr}
- dmi_write 0x3C ${value}
-}
-
-proc dmi_read_memory {addr} {
- set sbcs [expr 0x100000 | [dmi_read 0x38]]
- dmi_write 0x38 ${sbcs}
- dmi_write 0x39 ${addr}
- set value [dmi_read 0x3C]
- return ${value}
-}
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
proc release_core1 {} {
- set chip_rev [dmi_read_memory 0x2001FF00]
+ set chip_rev [sba_read_mem 0x2001FF00]
if {$chip_rev != 0x56010100 } {
# set start point for core1
- dmi_write_memory 0xF4002C08 0x20016284
+ sba_write_mem 0xF4002C08 0x20016284
} else {
- dmi_write_memory 0xF4002C08 0x2001660c
+ sba_write_mem 0xF4002C08 0x2001660c
}
# set boot flag for core1
- dmi_write_memory 0xF4002C0C 0xC1BEF1A9
+ sba_write_mem 0xF4002C0C 0xC1BEF1A9
# release core1
- dmi_write_memory 0xF4002C00 0x1000
+ sba_write_mem 0xF4002C00 0x1000
}
set _TARGET1 $_CHIP.cpu1
@@ -65,3 +50,7 @@ $_TARGET1 configure -event reset-deassert-pre {
$::_TARGET0 arp_poll
release_core1
}
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
index f873527fb721..0454c4d0f9ee 100644
--- a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk2/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
deleted file mode 100644
index 2f39e2409d8d..000000000000
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 768K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- /* hpm_sdk drivers */
- KEEP(*hpm_sdxc_drv*.o (.text .text* .rodata .rodata*))
-
- /* WHD related */
- KEEP(*whd_bus*.o (.text .text* .rodata .rodata*))
- KEEP(*whd_sdpcm*.o (.text .text* .rodata .rodata*))
- KEEP(*whd_thread*.o (.text .text* .rodata .rodata*))
-
- /* LWIP */
- KEEP(*lwip*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt.ld
index 8b4f6137da88..0c85c770f1bf 100644
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt.ld
@@ -31,6 +31,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -178,7 +187,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -188,6 +197,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -279,7 +297,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -306,7 +324,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index bcd6c6e12527..000000000000
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_sdram_rtt.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_sdram_rtt.ld
deleted file mode 100644
index 8618b40e5502..000000000000
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/flash_sdram_rtt.ld
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 1M;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > SDRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > SDRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_rtt.ld
index e03cd86e664b..a97ce80e9764 100644
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_rtt.ld
@@ -214,6 +214,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
/* Note: .tbss and .tdata should be adjacent */
__tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
.tdata : AT(__tdata_load_addr__) {
diff --git a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_sdram_rtt.ld b/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_sdram_rtt.ld
deleted file mode 100644
index fc810f781dcc..000000000000
--- a/bsp/hpmicro/hpm6750evk2/board/linker_scripts/gcc/ram_sdram_rtt.ld
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 32M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-SECTIONS
-{
- .start : {
- . = ALIGN(8);
- KEEP(*(.start))
- } > AXI_SRAM
-
- .vectors : {
- . = ALIGN(8);
- KEEP(*(.isr_vector))
- KEEP(*(.vector_table))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .text : {
- . = ALIGN(8);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
- *(FalPartTable)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > AXI_SRAM
-
- .rel : {
- KEEP(*(.rel*))
- } > AXI_SRAM
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > AXI_SRAM
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > AXI_SRAM
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
- . = ALIGN(8);
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- /* NOTE:
- Please keep in mind that the load section for rw data is after .text section
- Here end user should avoid place any NOLOAD sections (such as .bss) in the space between .text section
- and data load section if all sections are placed into the same adjacent space. Otherwise, the following conditions must be taken into account:
- 1. The size for all NOLOAD sections smust be added during computing __data_load_addr__
- 2. the generated binary file will be larger because the space occupied by
- NOLOAD sections will be filled
- */
- __data_load_addr__ = __etext;
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
-
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
-
- __fast_load_addr__ = __data_load_addr__ + SIZEOF(.data);
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(8);
- PROVIDE(__ramfunc_start__ = .);
- *(.fast)
- . = ALIGN(8);
- PROVIDE(__ramfunc_end__ = .);
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- /* Note: .tbss and .tdata should be adjacent */
- __tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- /* Note: Place all NOLOAD sections together */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE (__rt_rvstack = .);
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- KEEP(*(.framebuffer))
- } > SDRAM
-
- .heap (NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
-
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evk2/board/pinmux.c b/bsp/hpmicro/hpm6750evk2/board/pinmux.c
index 2abb2245be53..d6db7a525cc6 100644
--- a/bsp/hpmicro/hpm6750evk2/board/pinmux.c
+++ b/bsp/hpmicro/hpm6750evk2/board/pinmux.c
@@ -114,7 +114,7 @@ void init_trgmux_pins(uint32_t pin)
HPM_IOC->PAD[pin].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(16);
}
-void init_i2c_pins_as_gpio(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
/* I2C0 */
@@ -124,12 +124,12 @@ void init_i2c_pins_as_gpio(I2C_Type *ptr)
HPM_BIOC->PAD[IOC_PAD_PZ11].FUNC_CTL = 3;
HPM_BIOC->PAD[IOC_PAD_PZ10].FUNC_CTL = 3;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PZ11].FUNC_CTL = IOC_PZ11_FUNC_CTL_I2C0_SCL
@@ -142,9 +142,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PZ11].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PZ10].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
void init_femc_pins(void)
diff --git a/bsp/hpmicro/hpm6750evk2/board/pinmux.h b/bsp/hpmicro/hpm6750evk2/board/pinmux.h
index ac8a2e7c35ff..24c4c4fbe07d 100644
--- a/bsp/hpmicro/hpm6750evk2/board/pinmux.h
+++ b/bsp/hpmicro/hpm6750evk2/board/pinmux.h
@@ -14,7 +14,7 @@ extern "C" {
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
void init_lcd_pins(LCDC_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_cap_pins(void);
void init_femc_pins(void);
void init_gpio_pins(void);
@@ -43,7 +43,7 @@ void init_usb_pins(USB_Type *ptr);
void init_can_pins(CAN_Type *ptr);
void init_adc_bldc_pins(void);
void init_rgb_pwm_pins(void);
-void init_i2c_pins_as_gpio(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr);
void init_led_pins_as_gpio(void);
void init_trgmux_pins(uint32_t pin);
void init_enet_pps_pins(void);
diff --git a/bsp/hpmicro/hpm6750evk2/board/rtt_board.c b/bsp/hpmicro/hpm6750evk2/board/rtt_board.c
index ea3693f14109..cedf0c49b72e 100644
--- a/bsp/hpmicro/hpm6750evk2/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6750evk2/board/rtt_board.c
@@ -39,14 +39,20 @@ void rtt_board_init(void)
{
rtt_os_tick_clock();
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm6750evk2/makefile.targets b/bsp/hpmicro/hpm6750evk2/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evk2/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6750evk2/rtconfig.h b/bsp/hpmicro/hpm6750evk2/rtconfig.h
index b7f19f119f5d..00cfd7d8908b 100644
--- a/bsp/hpmicro/hpm6750evk2/rtconfig.h
+++ b/bsp/hpmicro/hpm6750evk2/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -103,7 +113,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -302,6 +312,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -329,12 +343,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -414,11 +440,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6700_SERIES
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
-#define SOC_HPM6700
+#define SOC_HPM6000
/* On-chip Peripheral Drivers */
@@ -432,6 +458,33 @@
#define BSP_USING_FEMC
#define INIT_EXT_RAM_FOR_DATA
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+
+/* AMPAK Wi-Fi module Configuration */
+
+/* end of AMPAK Wi-Fi module Configuration */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6750evk2/rtconfig.py b/bsp/hpmicro/hpm6750evk2/rtconfig.py
index e37092268b9a..bc118615e02b 100644
--- a/bsp/hpmicro/hpm6750evk2/rtconfig.py
+++ b/bsp/hpmicro/hpm6750evk2/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6750evk2/startup/HPM6750/startup.c b/bsp/hpmicro/hpm6750evk2/startup/HPM6750/startup.c
index 4fc6914d5664..54517adc4db5 100644
--- a/bsp/hpmicro/hpm6750evk2/startup/HPM6750/startup.c
+++ b/bsp/hpmicro/hpm6750evk2/startup/HPM6750/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
/* NOTE: Invalid I-Cache in case the I-Cache was filled with incorrect data during prefetch before copying the ram
* function code to its destination.
*/
diff --git a/bsp/hpmicro/hpm6750evk2/startup/HPM6750/toolchains/gcc/start.S b/bsp/hpmicro/hpm6750evk2/startup/HPM6750/toolchains/gcc/start.S
index 5ac683dbc279..6b394172aa87 100644
--- a/bsp/hpmicro/hpm6750evk2/startup/HPM6750/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6750evk2/startup/HPM6750/toolchains/gcc/start.S
@@ -58,11 +58,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
@@ -75,6 +84,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -87,3 +97,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6750evk2/startup/SConscript b/bsp/hpmicro/hpm6750evk2/startup/SConscript
index 3c804fe451bc..97393e8517f8 100644
--- a/bsp/hpmicro/hpm6750evk2/startup/SConscript
+++ b/bsp/hpmicro/hpm6750evk2/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
diff --git a/bsp/hpmicro/hpm6750evkmini/.config b/bsp/hpmicro/hpm6750evkmini/.config
index 0af46a1cdc8c..e3256fb40f9b 100644
--- a/bsp/hpmicro/hpm6750evkmini/.config
+++ b/bsp/hpmicro/hpm6750evkmini/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
# CONFIG_RT_SERIAL_USING_DMA is not set
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -264,10 +274,10 @@ CONFIG_RT_USING_RTC=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -461,6 +471,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -576,6 +587,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -635,6 +647,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -783,6 +797,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -816,7 +832,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -895,11 +925,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -908,6 +945,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -987,6 +1041,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1041,6 +1096,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1091,6 +1147,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1108,6 +1165,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1165,6 +1225,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1190,6 +1252,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1429,12 +1492,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6700_SERIES=y
+CONFIG_SOC_SERIES_HPM6000=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM6700=y
+CONFIG_SOC_HPM6000=y
#
# On-chip Peripheral Drivers
@@ -1462,6 +1525,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART13 is not set
# CONFIG_BSP_USING_UART14 is not set
# CONFIG_BSP_USING_UART15 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_ETH is not set
@@ -1488,5 +1552,55 @@ CONFIG_INIT_EXT_RAM_FOR_DATA=y
# CONFIG_BSP_USING_CAM is not set
# CONFIG_BSP_USING_PANEL is not set
# CONFIG_BSP_USING_RTT_LCD_DRIVER is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_QEI is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_TAMP is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+
+#
+# AMPAK Wi-Fi module Configuration
+#
+# end of AMPAK Wi-Fi module Configuration
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6750evkmini/.settings/projcfg.ini b/bsp/hpmicro/hpm6750evkmini/.settings/projcfg.ini
index 1ae5ab732288..65ac9a08140e 100644
--- a/bsp/hpmicro/hpm6750evkmini/.settings/projcfg.ini
+++ b/bsp/hpmicro/hpm6750evkmini/.settings/projcfg.ini
@@ -10,7 +10,7 @@ chip_name=HPM6750
selected_rtt_version=4.0.5
bsp_version=0.3.0
os_branch=full
-output_project_path=C\:/DevTools/RT-ThreadStudio/workspace
+output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm6750evkmini
is_base_example_project=True
is_use_scons_build=True
project_base_bsp=true
diff --git a/bsp/hpmicro/hpm6750evkmini/README.md b/bsp/hpmicro/hpm6750evkmini/README.md
index 00cfb6542ac3..6e8fc45719ae 100644
--- a/bsp/hpmicro/hpm6750evkmini/README.md
+++ b/bsp/hpmicro/hpm6750evkmini/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evkmini.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evkmini.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evkmini.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evkmini.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6750evkmini/README_zh.md b/bsp/hpmicro/hpm6750evkmini/README_zh.md
index 00b4c9bb1414..69f6be88259e 100644
--- a/bsp/hpmicro/hpm6750evkmini/README_zh.md
+++ b/bsp/hpmicro/hpm6750evkmini/README_zh.md
@@ -74,14 +74,14 @@ HPM6750EVKMINI 是由先楫半导体推出的一款基于RISCV内核的开发板
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evkmini.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evkmini.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6750-single-core.cfg -f boards\debug_scripts\boards\hpm6750evkmini.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6750-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6750evkmini.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6750evkmini/SConscript b/bsp/hpmicro/hpm6750evkmini/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6750evkmini/SConscript
+++ b/bsp/hpmicro/hpm6750evkmini/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6750evkmini/SConstruct b/bsp/hpmicro/hpm6750evkmini/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6750evkmini/SConstruct
+++ b/bsp/hpmicro/hpm6750evkmini/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6750evkmini/applications/SConscript b/bsp/hpmicro/hpm6750evkmini/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6750evkmini/applications/SConscript
+++ b/bsp/hpmicro/hpm6750evkmini/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6750evkmini/applications/main.c b/bsp/hpmicro/hpm6750evkmini/applications/main.c
index a5a7f07c7373..8aff6b812685 100644
--- a/bsp/hpmicro/hpm6750evkmini/applications/main.c
+++ b/bsp/hpmicro/hpm6750evkmini/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/Kconfig b/bsp/hpmicro/hpm6750evkmini/board/Kconfig
index bc3cdc81110a..caff3fd139f3 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/Kconfig
+++ b/bsp/hpmicro/hpm6750evkmini/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM6700
+config SOC_HPM6000
bool
- select SOC_HPM6700_SERIES
+ select SOC_SERIES_HPM6000
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -478,6 +478,25 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_SPI
@@ -496,7 +515,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -504,7 +523,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -526,7 +545,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -534,7 +553,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -547,7 +566,7 @@ menu "On-chip Peripheral Drivers"
endif
config BSP_USING_SPI2
bool "Enable SPI2"
- default n
+ default y
if BSP_USING_SPI2
config BSP_SPI2_USING_DMA
bool "Enable SPI2 DMA"
@@ -556,7 +575,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -564,7 +583,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -586,7 +605,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -594,7 +613,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -639,7 +658,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC0_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC0_USE_CACHEABLE_BUFFER
config BSP_SDXC0_USE_CACHEABLE_BUFFER
@@ -667,7 +686,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC0_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC0_BUS_WIDTH_8BIT
config BSP_SDXC0_BUS_WIDTH_1BIT
@@ -677,7 +696,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_BUS_WIDTH_8BIT
bool "8-bit"
endchoice
- choice BSP_SDXC0_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC0_VOLTAGE_3V3
config BSP_SDXC0_VOLTAGE_3V3
@@ -702,7 +721,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC1_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC1_USE_CACHEABLE_BUFFER
config BSP_SDXC1_USE_CACHEABLE_BUFFER
@@ -729,7 +748,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC1_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC1_BUS_WIDTH_4BIT
config BSP_SDXC1_BUS_WIDTH_1BIT
@@ -737,7 +756,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_BUS_WIDTH_4BIT
bool "4-bit"
endchoice
- choice BSP_SDXC1_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC1_VOLTAGE_3V3
config BSP_SDXC1_VOLTAGE_3V3
@@ -749,10 +768,10 @@ menu "On-chip Peripheral Drivers"
endchoice
config BSP_SDXC1_VSEL_PIN
default "PD29"
- string "VSEL pin name"
+ string "VSEL pin name"
config BSP_SDXC1_PWR_PIN
default "None"
- string "PWR pin name"
+ string "PWR pin name"
endif
endif
@@ -795,6 +814,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -865,6 +885,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -929,7 +958,6 @@ menu "On-chip Peripheral Drivers"
bool "INIT_EXT_RAM_FOR_DATA"
default y
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -938,7 +966,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWM
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWM
+ select RT_USING_PWM
menuconfig BSP_USING_DAO
bool "Enable Audio DAO play"
@@ -974,7 +1002,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_WDG
bool "Enable Watchdog"
default n
@@ -1040,7 +1067,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC12
bool "Enable ADC12"
@@ -1111,6 +1138,309 @@ menu "On-chip Peripheral Drivers"
default 1
endif
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_QEI
+ bool "Enable QEI (Quadrature Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+menu "AMPAK Wi-Fi module Configuration"
+config BSP_USING_MHD_WIFI
+bool
+default y if RT_USING_MHD
+select BSP_USING_SDXC
+select BSP_USING_SDXC1
+select BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
+help
+ Automatically enable SDXC1 interface when WiFi MHD driver is enabled.
+ Note: Please manually select non-cacheable buffer and fast RAM options for SDXC1 if needed.
+
endmenu
endmenu
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/boards/hpm6750evkmini.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/boards/hpm6750evkmini.cfg
index 0c0dc2e3c4f6..bd37e9283533 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/boards/hpm6750evkmini.cfg
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/boards/hpm6750evkmini.cfg
@@ -1,4 +1,4 @@
-# Copyright 2021 HPMicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
# openocd flash driver argument:
@@ -16,7 +16,7 @@
# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
# 0 - Not needed
-# 1 - QE bit is at bit 6 in Status Register 1
+# 1 - QE bit is at bit6 in Status Register 1
# 2 - QE bit is at bit1 in Status Register 2
# 3 - QE bit is at bit7 in Status Register 2
# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
@@ -50,242 +50,157 @@
flash bank xpi0 hpm_xpi 0x80000000 0x1000000 1 1 $_TARGET0 0xF3040000 0x7
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
proc init_sdram { } {
-# configure dram frequency
+# configure femc frequency
# 133Mhz pll1_clk0: 266Mhz divide by 2
- #$::_TARGET0 riscv dmi_write 0x39 0xF4001820
- $::_TARGET0 riscv dmi_write 0x3C 0x201
+ #mww 0xF4001820 0x201
# 166Mhz pll2_clk0: 333Mhz divide by 2
- $::_TARGET0 riscv dmi_write 0x39 0xF4001820
- $::_TARGET0 riscv dmi_write 0x3C 0x401
+ mww 0xF4001820 0x401
# PD13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040368
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040368 0xC
# PD12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040360
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040360 0xC
# PD10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040350
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040350 0xC
# PD09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040348
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040348 0xC
# PD08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040340
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040340 0xC
# PD07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040338
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040338 0xC
# PD06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040330
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040330 0xC
# PD05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040328
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040328 0xC
# PD04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040320
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040320 0xC
# PD03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040318
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040318 0xC
# PD02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040310
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040310 0xC
# PD01
- $::_TARGET0 riscv dmi_write 0x39 0xF4040308
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040308 0xC
# PD00
- $::_TARGET0 riscv dmi_write 0x39 0xF4040300
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040300 0xC
# PC29
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402E8 0xC
# PC28
- $::_TARGET0 riscv dmi_write 0x39 0xF40402E0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402E0 0xC
# PC27
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402D8 0xC
# PC22
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402B0 0xC
# PC21
- $::_TARGET0 riscv dmi_write 0x39 0xF40402A8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402A8 0xC
# PC17
- $::_TARGET0 riscv dmi_write 0x39 0xF4040288
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040288 0xC
# PC15
- $::_TARGET0 riscv dmi_write 0x39 0xF4040278
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040278 0xC
# PC12
- $::_TARGET0 riscv dmi_write 0x39 0xF4040260
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040260 0xC
# PC11
- $::_TARGET0 riscv dmi_write 0x39 0xF4040258
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040258 0xC
# PC10
- $::_TARGET0 riscv dmi_write 0x39 0xF4040250
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040250 0xC
# PC09
- $::_TARGET0 riscv dmi_write 0x39 0xF4040248
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040248 0xC
# PC08
- $::_TARGET0 riscv dmi_write 0x39 0xF4040240
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040240 0xC
# PC07
- $::_TARGET0 riscv dmi_write 0x39 0xF4040238
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040238 0xC
# PC06
- $::_TARGET0 riscv dmi_write 0x39 0xF4040230
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040230 0xC
# PC05
- $::_TARGET0 riscv dmi_write 0x39 0xF4040228
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040228 0xC
# PC04
- $::_TARGET0 riscv dmi_write 0x39 0xF4040220
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040220 0xC
# PC14
- $::_TARGET0 riscv dmi_write 0x39 0xF4040270
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040270 0xC
# PC13
- $::_TARGET0 riscv dmi_write 0x39 0xF4040268
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040268 0xC
# PC16
- # $::_TARGET0 riscv dmi_write 0x39 0xF4040280
- $::_TARGET0 riscv dmi_write 0x3C 0x1000C
+ # mww 0xF4040280 0x1000C
# PC26
- $::_TARGET0 riscv dmi_write 0x39 0xF40402D0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402D0 0xC
# PC25
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402C8 0xC
# PC19
- $::_TARGET0 riscv dmi_write 0x39 0xF4040298
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040298 0xC
# PC18
- $::_TARGET0 riscv dmi_write 0x39 0xF4040290
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040290 0xC
# PC23
- $::_TARGET0 riscv dmi_write 0x39 0xF40402B8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402B8 0xC
# PC24
- $::_TARGET0 riscv dmi_write 0x39 0xF40402C0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402C0 0xC
# PC30
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F0
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402F0 0xC
# PC31
- $::_TARGET0 riscv dmi_write 0x39 0xF40402F8
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF40402F8 0xC
# PC02
- $::_TARGET0 riscv dmi_write 0x39 0xF4040210
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040210 0xC
# PC03
- $::_TARGET0 riscv dmi_write 0x39 0xF4040218
- $::_TARGET0 riscv dmi_write 0x3C 0xC
+ mww 0xF4040218 0xC
- # dramc configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
+ # femc configuration
+ mww 0xF3050000 0x1
sleep 10
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
- $::_TARGET0 riscv dmi_write 0x39 0xF3050008
- $::_TARGET0 riscv dmi_write 0x3C 0x30524
- $::_TARGET0 riscv dmi_write 0x39 0xF305000C
- $::_TARGET0 riscv dmi_write 0x3C 0x6030524
- $::_TARGET0 riscv dmi_write 0x39 0xF3050000
- $::_TARGET0 riscv dmi_write 0x3C 0x10000000
+ mww 0xF3050000 0x2
+ mww 0xF3050008 0x30524
+ mww 0xF305000C 0x6030524
+ mww 0xF3050000 0x10000000
# 16MB
- $::_TARGET0 riscv dmi_write 0x39 0xF3050010
- $::_TARGET0 riscv dmi_write 0x3C 0x40000019
- $::_TARGET0 riscv dmi_write 0x39 0xF3050014
- $::_TARGET0 riscv dmi_write 0x3C 0
+ mww 0xF3050010 0x40000019
+ mww 0xF3050014 0
# 16-bit
- $::_TARGET0 riscv dmi_write 0x39 0xF3050040
- $::_TARGET0 riscv dmi_write 0x3C 0xf31
+ mww 0xF3050040 0xf31
# 133Mhz configuration
- #$::_TARGET0 riscv dmi_write 0x39 0xF3050044
- $::_TARGET0 riscv dmi_write 0x3C 0x884e22
+ #mww 0xF3050044 0x884e22
# 166Mhz configuration
- $::_TARGET0 riscv dmi_write 0x39 0xF3050044
- $::_TARGET0 riscv dmi_write 0x3C 0x884e33
+ mww 0xF3050044 0x884e33
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF3050048
- $::_TARGET0 riscv dmi_write 0x3C 0x1020d0d
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020300
+ mww 0xF3050048 0x1020d0d
+ mww 0xF3050048 0x1020d0d
+ mww 0xF305004C 0x2020300
# config delay cell
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x3b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050150
- $::_TARGET0 riscv dmi_write 0x3C 0x203b
+ mww 0xF3050150 0x3b
+ mww 0xF3050150 0x203b
- $::_TARGET0 riscv dmi_write 0x39 0xF3050094
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3050098
- $::_TARGET0 riscv dmi_write 0x3C 0
+ mww 0xF3050094 0
+ mww 0xF3050098 0
# precharge all
- $::_TARGET0 riscv dmi_write 0x39 0xF3050090
- $::_TARGET0 riscv dmi_write 0x3C 0x40000000
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000F
+ mww 0xF3050090 0x40000000
+ mww 0xF305009C 0xA55A000F
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# auto refresh
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000C
+ mww 0xF305003C 0x3
+ mww 0xF305009C 0xA55A000C
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
# set mode
- $::_TARGET0 riscv dmi_write 0x39 0xF30500A0
- $::_TARGET0 riscv dmi_write 0x3C 0x33
- $::_TARGET0 riscv dmi_write 0x39 0xF305009C
- $::_TARGET0 riscv dmi_write 0x3C 0xA55A000A
+ mww 0xF30500A0 0x33
+ mww 0xF305009C 0xA55A000A
sleep 500
- $::_TARGET0 riscv dmi_write 0x39 0xF305003C
- $::_TARGET0 riscv dmi_write 0x3C 0x3
+ mww 0xF305003C 0x3
- $::_TARGET0 riscv dmi_write 0x39 0xF305004C
- $::_TARGET0 riscv dmi_write 0x3C 0x2020301
+ mww 0xF305004C 0x2020301
echo "SDRAM has been initialized"
}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
index 610d4c578b4f..504900a919ba 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-dual-core.cfg
@@ -1,9 +1,12 @@
-# Copyright 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
-
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -14,48 +17,41 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-proc dmi_write {reg value} {
- $::_TARGET0 riscv dmi_write ${reg} ${value}
-}
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
-proc dmi_read {reg} {
- set v [$::_TARGET0 riscv dmi_read ${reg}]
- return ${v}
-}
-proc dmi_write_memory {addr value} {
- dmi_write 0x39 ${addr}
- dmi_write 0x3C ${value}
-}
+proc release_core1 {} {
-proc dmi_read_memory {addr} {
- set sbcs [expr 0x100000 | [dmi_read 0x38]]
- dmi_write 0x38 ${sbcs}
- dmi_write 0x39 ${addr}
- set value [dmi_read 0x3C]
- return ${value}
-}
+ set chip_rev [sba_read_mem 0x2001FF00]
-proc release_core1 {} {
- # set start point for core1
- dmi_write_memory 0xF4002C08 0x20016284
+ if {$chip_rev != 0x56010100 } {
+ # set start point for core1
+ sba_write_mem 0xF4002C08 0x20016284
+ } else {
+ sba_write_mem 0xF4002C08 0x2001660c
+ }
# set boot flag for core1
- dmi_write_memory 0xF4002C0C 0xC1BEF1A9
+ sba_write_mem 0xF4002C0C 0xC1BEF1A9
# release core1
- dmi_write_memory 0xF4002C00 0x1000
-}
-
-$_TARGET0 configure -event examine-end {
- release_core1
+ sba_write_mem 0xF4002C00 0x1000
}
set _TARGET1 $_CHIP.cpu1
target create $_TARGET1 riscv -chain-position $_CHIP.cpu -coreid 1
$_TARGET1 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
+
+$_TARGET1 configure -event examine-start {
+ release_core1
+}
+
$_TARGET1 configure -event reset-deassert-pre {
- $::_TARGET1 arp_poll
+ $::_TARGET0 arp_poll
release_core1
}
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
index 44c232b9628a..0454c4d0f9ee 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm6750-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright 2021 HPMicro
+# Copyright (c) 2021,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6750
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6750
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF40C001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6750evkmini/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt.ld
index 21ea55a2cb69..6a8cf70c9c81 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt.ld
@@ -31,6 +31,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -178,7 +187,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -188,6 +197,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -279,7 +297,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -306,7 +324,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index d46f1913fffd..000000000000
--- a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 16M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1280K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x11C0000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_sdram_rtt.ld b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_sdram_rtt.ld
deleted file mode 100644
index cae486ba9870..000000000000
--- a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/flash_sdram_rtt.ld
+++ /dev/null
@@ -1,340 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 1M;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > AXI_SRAM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > AXI_SRAM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > SDRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > SDRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_rtt.ld
index cc221f78bf75..d94c0968ed72 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_rtt.ld
@@ -212,7 +212,16 @@ SECTIONS
KEEP(*(.fast_ram.init.*))
__fast_ram_init_end__ = .;
. = ALIGN(8);
- } > DLM
+ } > AXI_SRAM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > AXI_SRAM
/* Note: .tbss and .tdata should be adjacent */
__tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
diff --git a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_sdram_rtt.ld b/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_sdram_rtt.ld
deleted file mode 100644
index d702772429ff..000000000000
--- a/bsp/hpmicro/hpm6750evkmini/board/linker_scripts/gcc/ram_sdram_rtt.ld
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 4M;
-
-MEMORY
-{
- ILM (wx) : ORIGIN = 0x00000000, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00080000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01080000, LENGTH = 1536K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0300000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF40F0000, LENGTH = 8k
-}
-
-SECTIONS
-{
- .start : {
- . = ALIGN(8);
- KEEP(*(.start))
- } > AXI_SRAM
-
- .vectors : {
- . = ALIGN(8);
- KEEP(*(.isr_vector))
- KEEP(*(.vector_table))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .text : {
- . = ALIGN(8);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
- *(FalPartTable)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > AXI_SRAM
-
- .rel : {
- KEEP(*(.rel*))
- } > AXI_SRAM
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > AXI_SRAM
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > AXI_SRAM
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
- . = ALIGN(8);
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- /* NOTE:
- Please keep in mind that the load section for rw data is after .text section
- Here end user should avoid place any NOLOAD sections (such as .bss) in the space between .text section
- and data load section if all sections are placed into the same adjacent space. Otherwise, the following conditions must be taken into account:
- 1. The size for all NOLOAD sections smust be added during computing __data_load_addr__
- 2. the generated binary file will be larger because the space occupied by
- NOLOAD sections will be filled
- */
- __data_load_addr__ = __etext;
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
-
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
-
- __fast_load_addr__ = __data_load_addr__ + SIZEOF(.data);
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(8);
- PROVIDE(__ramfunc_start__ = .);
- *(.fast)
- . = ALIGN(8);
- PROVIDE(__ramfunc_end__ = .);
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- /* Note: .tbss and .tdata should be adjacent */
- __tdata_load_addr__ = __fast_ram_init_load_addr__ + SIZEOF(.fast_ram.init);
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- /* Note: Place all NOLOAD sections together */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE (__rt_rvstack = .);
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- KEEP(*(.framebuffer))
- } > SDRAM
-
- .heap (NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
-
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6750evkmini/board/pinmux.c b/bsp/hpmicro/hpm6750evkmini/board/pinmux.c
index 68ce3d99ad3c..bcdcad2a7f9b 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/pinmux.c
+++ b/bsp/hpmicro/hpm6750evkmini/board/pinmux.c
@@ -126,19 +126,19 @@ void init_trgmux_pins(uint32_t pin)
HPM_IOC->PAD[pin].FUNC_CTL = IOC_PAD_FUNC_CTL_ALT_SELECT_SET(16);
}
-void init_i2c_pins_as_gpio(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
/* I2C0 */
HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PB11_FUNC_CTL_GPIO_B_11;
HPM_IOC->PAD[IOC_PAD_PB10].FUNC_CTL = IOC_PB10_FUNC_CTL_GPIO_B_10;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PB11].FUNC_CTL = IOC_PB11_FUNC_CTL_I2C0_SCL
@@ -155,9 +155,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PB14].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PB13].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- while (1) {
- }
+ return status_invalid_argument;
}
+ return status_success;
}
void init_femc_pins(void)
{
diff --git a/bsp/hpmicro/hpm6750evkmini/board/pinmux.h b/bsp/hpmicro/hpm6750evkmini/board/pinmux.h
index 1ae0f3ffad9e..0fed486aa91f 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/pinmux.h
+++ b/bsp/hpmicro/hpm6750evkmini/board/pinmux.h
@@ -15,7 +15,7 @@ extern "C" {
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
void init_lcd_pins(LCDC_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_cap_pins(void);
void init_femc_pins(void);
void init_gpio_pins(void);
@@ -46,7 +46,7 @@ void init_adc12_pins(void);
void init_adc16_pins(void);
void init_adc_bldc_pins(void);
-void init_i2c_pins_as_gpio(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins_as_gpio(I2C_Type *ptr);
void init_beep_pwm_pins(void);
void init_led_pins_as_pwm(void);
diff --git a/bsp/hpmicro/hpm6750evkmini/board/rtt_board.c b/bsp/hpmicro/hpm6750evkmini/board/rtt_board.c
index 056bd3902f12..ea8b677b9d12 100644
--- a/bsp/hpmicro/hpm6750evkmini/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6750evkmini/board/rtt_board.c
@@ -39,14 +39,20 @@ void rtt_board_init(void)
{
rtt_os_tick_clock();
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm6750evkmini/makefile.targets b/bsp/hpmicro/hpm6750evkmini/makefile.targets
index 502182f4e708..4583a13f1cd3 100644
--- a/bsp/hpmicro/hpm6750evkmini/makefile.targets
+++ b/bsp/hpmicro/hpm6750evkmini/makefile.targets
@@ -3,4 +3,4 @@ clean2:
-$(RM) $(OBJS) *.elf
-@echo ' '
-*.elf: $(wildcard ../board/linker_scripts/flash_xip_rtt.ld)
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6750evkmini/rtconfig.h b/bsp/hpmicro/hpm6750evkmini/rtconfig.h
index ec1e6443a7f7..d01da9d6514c 100644
--- a/bsp/hpmicro/hpm6750evkmini/rtconfig.h
+++ b/bsp/hpmicro/hpm6750evkmini/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,7 +114,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -291,6 +301,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -318,12 +332,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -403,11 +429,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6700_SERIES
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
-#define SOC_HPM6700
+#define SOC_HPM6000
/* On-chip Peripheral Drivers */
@@ -421,6 +447,33 @@
#define BSP_USING_FEMC
#define INIT_EXT_RAM_FOR_DATA
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+
+/* AMPAK Wi-Fi module Configuration */
+
+/* end of AMPAK Wi-Fi module Configuration */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6750evkmini/rtconfig.py b/bsp/hpmicro/hpm6750evkmini/rtconfig.py
index e37092268b9a..bc118615e02b 100644
--- a/bsp/hpmicro/hpm6750evkmini/rtconfig.py
+++ b/bsp/hpmicro/hpm6750evkmini/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/startup.c b/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/startup.c
index 4fc6914d5664..54517adc4db5 100644
--- a/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/startup.c
+++ b/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/startup.c
@@ -54,6 +54,8 @@
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
/* NOTE: Invalid I-Cache in case the I-Cache was filled with incorrect data during prefetch before copying the ram
* function code to its destination.
*/
diff --git a/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/toolchains/gcc/start.S b/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/toolchains/gcc/start.S
index 5ac683dbc279..6b394172aa87 100644
--- a/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6750evkmini/startup/HPM6750/toolchains/gcc/start.S
@@ -58,11 +58,20 @@ _start:
/* Initialize FCSR */
fscsr zero
#endif
- /* Disable Vector mode */
- csrci CSR_MMISC_CTL, 2
- /* Initialize trap_entry base */
+
+#ifdef HPM_USING_VECTOR_PREEMPTED_MODE
+ /* Initial machine trap-vector Base */
+ la t0, __vector_table
+ csrw mtvec, t0
+ /* Enable vectored external PLIC interrupt */
+ csrsi CSR_MMISC_CTL, 2
+#else
+ /* Initial machine trap-vector Base */
la t0, SW_handler
csrw mtvec, t0
+ /* Disable vectored external PLIC interrupt */
+ csrci CSR_MMISC_CTL, 2
+#endif
/* System reset handler */
@@ -75,6 +84,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -87,3 +97,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6750evkmini/startup/SConscript b/bsp/hpmicro/hpm6750evkmini/startup/SConscript
index 3c804fe451bc..97393e8517f8 100644
--- a/bsp/hpmicro/hpm6750evkmini/startup/SConscript
+++ b/bsp/hpmicro/hpm6750evkmini/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
diff --git a/bsp/hpmicro/hpm6800evk/.config b/bsp/hpmicro/hpm6800evk/.config
index 9e781ff3ba9f..a96ab924f15a 100644
--- a/bsp/hpmicro/hpm6800evk/.config
+++ b/bsp/hpmicro/hpm6800evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -182,7 +192,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -241,11 +251,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -266,10 +276,10 @@ CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -462,6 +472,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -577,6 +588,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -636,6 +648,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -784,6 +798,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -817,7 +833,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -896,11 +926,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -909,6 +946,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -988,6 +1042,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1042,6 +1097,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1092,6 +1148,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1109,6 +1166,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1166,6 +1226,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1191,6 +1253,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1430,12 +1493,12 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6800_SERIES=y
+CONFIG_SOC_SERIES_HPM6000=y
#
# Hardware Drivers Config
#
-CONFIG_SOC_HPM6800=y
+CONFIG_SOC_HPM6000=y
#
# On-chip Peripheral Drivers
@@ -1461,6 +1524,7 @@ CONFIG_BSP_UART3_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_ETH is not set
@@ -1490,5 +1554,61 @@ CONFIG_BSP_UART3_IRQ_PRIORITY=1
# CONFIG_BSP_USING_LVB is not set
# CONFIG_BSP_USING_LCB is not set
# CONFIG_BSP_USING_RTT_LCD_DRIVER is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_FFA is not set
+# CONFIG_BSP_USING_TAMP is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_GWC is not set
+# CONFIG_BSP_USING_VAD is not set
+# CONFIG_BSP_USING_SMIX is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+
+#
+# AMPAK Wi-Fi module Configuration
+#
+# end of AMPAK Wi-Fi module Configuration
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6800evk/README.md b/bsp/hpmicro/hpm6800evk/README.md
index 651cd94dd0fa..861a18413a7b 100644
--- a/bsp/hpmicro/hpm6800evk/README.md
+++ b/bsp/hpmicro/hpm6800evk/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6880.cfg -f boards\debug_scripts\boards\hpm6800evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6880.cfg -f board\debug_scripts\openocd\boards\hpm6800evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6880.cfg -f boards\debug_scripts\boards\hpm6800evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6880.cfg -f board\debug_scripts\openocd\boards\hpm6800evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6800evk/README_zh.md b/bsp/hpmicro/hpm6800evk/README_zh.md
index b9c072288949..b19d4ae55a89 100644
--- a/bsp/hpmicro/hpm6800evk/README_zh.md
+++ b/bsp/hpmicro/hpm6800evk/README_zh.md
@@ -74,14 +74,14 @@ HPM6800EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6880.cfg -f boards\debug_scripts\boards\hpm6800evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6880.cfg -f board\debug_scripts\openocd\boards\hpm6800evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6880.cfg -f boards\debug_scripts\boards\hpm6800evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6880.cfg -f board\debug_scripts\openocd\boards\hpm6800evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6800evk/SConscript b/bsp/hpmicro/hpm6800evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6800evk/SConscript
+++ b/bsp/hpmicro/hpm6800evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6800evk/SConstruct b/bsp/hpmicro/hpm6800evk/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6800evk/SConstruct
+++ b/bsp/hpmicro/hpm6800evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6800evk/applications/SConscript b/bsp/hpmicro/hpm6800evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6800evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6800evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6800evk/applications/main.c b/bsp/hpmicro/hpm6800evk/applications/main.c
index a5a7f07c7373..8aff6b812685 100644
--- a/bsp/hpmicro/hpm6800evk/applications/main.c
+++ b/bsp/hpmicro/hpm6800evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6800evk/board/Kconfig b/bsp/hpmicro/hpm6800evk/board/Kconfig
index f1a0f79a9849..bd88a4fe6318 100644
--- a/bsp/hpmicro/hpm6800evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6800evk/board/Kconfig
@@ -1,8 +1,8 @@
menu "Hardware Drivers Config"
-config SOC_HPM6800
+config SOC_HPM6000
bool
- select SOC_HPM6800_SERIES
+ select SOC_SERIES_HPM6000
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -87,6 +87,11 @@ menu "On-chip Peripheral Drivers"
int "UART1 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -114,6 +119,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -141,6 +151,11 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART4
bool "Enable UART4"
@@ -168,6 +183,11 @@ menu "On-chip Peripheral Drivers"
int "UART4 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
@@ -195,6 +215,11 @@ menu "On-chip Peripheral Drivers"
int "UART5 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -222,6 +247,11 @@ menu "On-chip Peripheral Drivers"
int "UART6 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART7
bool "Enable UART7"
@@ -249,6 +279,30 @@ menu "On-chip Peripheral Drivers"
int "UART7 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
@@ -268,7 +322,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -276,7 +330,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -298,7 +352,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -306,7 +360,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -328,7 +382,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -336,7 +390,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -358,7 +412,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -366,7 +420,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -392,7 +446,7 @@ menu "On-chip Peripheral Drivers"
select RT_USING_PHY if BSP_USING_ETH
if BSP_USING_ETH
- choice BSP_ETH0_SEL
+ choice
prompt "ETH"
default BSP_USING_ETH0
@@ -415,7 +469,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC0_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC0_USE_CACHEABLE_BUFFER
config BSP_SDXC0_USE_CACHEABLE_BUFFER
@@ -443,7 +497,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC0_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC0_BUS_WIDTH_8BIT
config BSP_SDXC0_BUS_WIDTH_1BIT
@@ -453,7 +507,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC0_BUS_WIDTH_8BIT
bool "8-bit"
endchoice
- choice BSP_SDXC0_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC0_VOLTAGE_1V8
config BSP_SDXC0_VOLTAGE_3V3
@@ -478,7 +532,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
bool "Enable Interrupt-driven mode"
default n
- choice BSP_SDXC1_SEL
+ choice
prompt "Select buffer type for unaligned data transfer"
default BSP_SDXC1_USE_CACHEABLE_BUFFER
config BSP_SDXC1_USE_CACHEABLE_BUFFER
@@ -505,7 +559,7 @@ menu "On-chip Peripheral Drivers"
int "SDXC Interrupt Priority"
range 1 7
default 1
- choice BSP_SDXC1_BUS_WIDTH_SEL
+ choice
prompt "Select BUS_WIDTH"
default BSP_SDXC1_BUS_WIDTH_4BIT
config BSP_SDXC1_BUS_WIDTH_1BIT
@@ -513,7 +567,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SDXC1_BUS_WIDTH_4BIT
bool "4-bit"
endchoice
- choice BSP_SDXC1_VOLT_SEL
+ choice
prompt "Select Voltage"
default BSP_SDXC1_VOLTAGE_3V3
config BSP_SDXC1_VOLTAGE_3V3
@@ -571,6 +625,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -641,6 +696,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -698,12 +762,10 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
menuconfig INIT_EXT_RAM_FOR_DATA
bool "INIT_EXT_RAM_FOR_DATA"
default y
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -746,7 +808,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_EWDG
bool "Enable EWDG"
default n
@@ -842,16 +903,11 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
default n
- if BSP_USING_ADC16
- config BSP_USING_ADC3
- bool "Enable ADC3"
- default n
- endif
endif
menuconfig BSP_USING_CAMERA
@@ -860,7 +916,7 @@ menu "On-chip Peripheral Drivers"
select BSP_USING_CAM if BSP_USING_CAMERA
select BSP_USING_MIPI_CSI if BSP_USING_CAMERA
if BSP_USING_CAMERA
- choice BSP_CAMERA_SEL
+ choice
prompt "Select camera"
default BSP_USING_CAMERA_OV5640
config BSP_USING_CAMERA_MT9M114
@@ -886,7 +942,7 @@ menu "On-chip Peripheral Drivers"
select BSP_USING_MIPI_DSI if BSP_USING_PANEL
select BSP_USING_PIXELMUX if BSP_USING_PANEL
if BSP_USING_PANEL
- choice BSP_USEING_PANEL_SEL
+ choice
prompt "Select Panel"
default BSP_USEING_PANEL_MIPI_MC10128007_31B
config BSP_USEING_PANEL_RGB_TM070RDH13
@@ -930,7 +986,335 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_FFA
+ bool "Enable FFA"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_GWC
+ bool "Enable GWC"
+ default n
+
+ menuconfig BSP_USING_VAD
+ bool "Enable VAD"
+ default n
+
+ menuconfig BSP_USING_SMIX
+ bool "Enable SMIX"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
+endmenu
+
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
endmenu
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
endmenu
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+menu "AMPAK Wi-Fi module Configuration"
+config BSP_USING_MHD_WIFI
+bool
+default y if RT_USING_MHD
+select BSP_USING_SDXC
+select BSP_USING_SDXC1
+select BSP_SDXC1_ENABLE_INTERRUPT_DRIVEN
+help
+ Automatically enable SDXC1 interface when WiFi MHD driver is enabled.
+ Note: Please manually select non-cacheable buffer and fast RAM options for SDXC1 if needed.
+
+endmenu
+
+endmenu
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/boards/hpm6800evk.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/boards/hpm6800evk.cfg
index 5f21fd27b46c..a97c83715d62 100644
--- a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/boards/hpm6800evk.cfg
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/boards/hpm6800evk.cfg
@@ -1,110 +1,116 @@
# Copyright (c) 2023 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
+#
+# openocd flash driver argument:
+# - option0:
+# [31:28] Flash probe type
+# 0 - SFDP SDR / 1 - SFDP DDR
+# 2 - 1-4-4 Read (0xEB, 24-bit address) / 3 - 1-2-2 Read(0xBB, 24-bit address)
+# 4 - HyperFLASH 1.8V / 5 - HyperFLASH 3V
+# 6 - OctaBus DDR (SPI -> OPI DDR)
+# 8 - Xccela DDR (SPI -> OPI DDR)
+# 10 - EcoXiP DDR (SPI -> OPI DDR)
+# [27:24] Command Pads after Power-on Reset
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [23:20] Command Pads after Configuring FLASH
+# 0 - SPI / 1 - DPI / 2 - QPI / 3 - OPI
+# [19:16] Quad Enable Sequence (for the device support SFDP 1.0 only)
+# 0 - Not needed
+# 1 - QE bit is at bit6 in Status Register 1
+# 2 - QE bit is at bit1 in Status Register 2
+# 3 - QE bit is at bit7 in Status Register 2
+# 4 - QE bit is at bit1 in Status Register 2 and should be programmed by 0x31
+# [15:8] Dummy cycles
+# 0 - Auto-probed / detected / default value
+# Others - User specified value, for DDR read, the dummy cycles should be 2 * cycles on FLASH datasheet
+# [7:4] Misc.
+# 0 - Not used
+# 1 - SPI mode
+# 2 - Internal loopback
+# 3 - External DQS
+# [3:0] Frequency option
+# 1 - 30MHz / 2 - 50MHz / 3 - 66MHz / 4 - 80MHz / 5 - 100MHz / 6 - 120MHz / 7 - 133MHz / 8 - 166MHz
+# - option1:
+# [31:20] Reserved
+# [19:16] IO voltage
+# 0 - 3V / 1 - 1.8V
+# [15:12] Pin group
+# 0 - 1st group / 1 - 2nd group
+# [11:8] Connection selection
+# 0 - CA_CS0 / 1 - CB_CS0 / 2 - CA_CS0 + CB_CS0 (Two FLASH connected to CA and CB respectively)
+# [7:0] Drive Strength
+# 0 - Default value
+
+# xpi0 configs
+# - flash driver: hpm_xpi
+# - flash ctrl index: 0xF3000000
+# - base address: 0x80000000
+# - flash size: 0x2000000
+# - flash option0: 0x7
flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x7
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
proc init_ddr3 {} {
# ddr dcdc setup
- $::_TARGET0 riscv dmi_write 0x39 0xF4104080
- $::_TARGET0 riscv dmi_write 0x3C 0x10578
+ mww 0xF4104080 0x10578
# ddr3 setup
- $::_TARGET0 riscv dmi_write 0x39 0xF40C0180
- $::_TARGET0 riscv dmi_write 0x3C 0x30000019
- $::_TARGET0 riscv dmi_write 0x39 0xF400180C
- $::_TARGET0 riscv dmi_write 0x3C 0x09100401
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4153000
- $::_TARGET0 riscv dmi_write 0x3C 0xF0000010
-
- $::_TARGET0 riscv dmi_write 0x39 0xF30101B0
- $::_TARGET0 riscv dmi_write 0x3C 0
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4150040
- $::_TARGET0 riscv dmi_write 0x3C 0xf004641f
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4153000
- $::_TARGET0 riscv dmi_write 0x3C 0xf0000011
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3013000
- $::_TARGET0 riscv dmi_write 0x3C 0xf4000000
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010490
- $::_TARGET0 riscv dmi_write 0x3C 1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010000
- $::_TARGET0 riscv dmi_write 0x3C 0x1040001
-
- $::_TARGET0 riscv dmi_write 0x39 0xF30100D0
- $::_TARGET0 riscv dmi_write 0x3C 0x4002004e
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010110
- $::_TARGET0 riscv dmi_write 0x3C 0x05010407
- $::_TARGET0 riscv dmi_write 0x39 0xF3010190
- $::_TARGET0 riscv dmi_write 0x3C 0x07040102
- $::_TARGET0 riscv dmi_write 0x39 0xF3010194
- $::_TARGET0 riscv dmi_write 0x3C 0x20404
- $::_TARGET0 riscv dmi_write 0x39 0xF30101A4
- $::_TARGET0 riscv dmi_write 0x3C 0x20008
- $::_TARGET0 riscv dmi_write 0x39 0xF3010240
- $::_TARGET0 riscv dmi_write 0x3C 0x06000600
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010200
- $::_TARGET0 riscv dmi_write 0x3C 0x1F1F1F
- $::_TARGET0 riscv dmi_write 0x39 0xF3010204
- $::_TARGET0 riscv dmi_write 0x3C 0x121212
- $::_TARGET0 riscv dmi_write 0x39 0xF3010208
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF301020C
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3010210
- $::_TARGET0 riscv dmi_write 0x3C 0x1F1F
- $::_TARGET0 riscv dmi_write 0x39 0xF3010214
- $::_TARGET0 riscv dmi_write 0x3C 0x06030303
- $::_TARGET0 riscv dmi_write 0x39 0xF3010218
- $::_TARGET0 riscv dmi_write 0x3C 0x0F060606
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3013000
- $::_TARGET0 riscv dmi_write 0x3C 0xFC000000
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4150054
- $::_TARGET0 riscv dmi_write 0x3C 0xc70
- $::_TARGET0 riscv dmi_write 0x39 0xF4150058
- $::_TARGET0 riscv dmi_write 0x3C 0x6
- $::_TARGET0 riscv dmi_write 0x39 0xF415005c
- $::_TARGET0 riscv dmi_write 0x3C 0x18
- $::_TARGET0 riscv dmi_write 0x39 0xF4150048
- $::_TARGET0 riscv dmi_write 0x3C 0x919c8866
- $::_TARGET0 riscv dmi_write 0x39 0xF415004c
- $::_TARGET0 riscv dmi_write 0x3C 0x1a838360
- $::_TARGET0 riscv dmi_write 0x39 0xF415008c
- $::_TARGET0 riscv dmi_write 0x3C 0xf06d50
- $::_TARGET0 riscv dmi_write 0x39 0xF4150050
- $::_TARGET0 riscv dmi_write 0x3C 0x3002d200
-
-
- $::_TARGET0 riscv dmi_write 0x39 0xF30101b0
- $::_TARGET0 riscv dmi_write 0x3C 1
+ mww 0xF40C0180 0x30000019
+ mww 0xF400180C 0x09100401
+
+ mww 0xF4153000 0xF0000010
+
+ mww 0xF30101B0 0
+
+ mww 0xF4150040 0xf004641f
+
+ mww 0xF4153000 0xf0000011
+
+ mww 0xF3013000 0xf4000000
+
+ mww 0xF3010490 1
+
+ mww 0xF3010000 0x1040001
+
+ mww 0xF30100D0 0x4002004e
+
+ mww 0xF3010110 0x05010407
+ mww 0xF3010190 0x07040102
+ mww 0xF3010194 0x20404
+ mww 0xF30101A4 0x20008
+ mww 0xF3010240 0x06000600
+
+ mww 0xF3010200 0x1F1F1F
+ mww 0xF3010204 0x121212
+ mww 0xF3010208 0
+ mww 0xF301020C 0
+ mww 0xF3010210 0x1F1F
+ mww 0xF3010214 0x06030303
+ mww 0xF3010218 0x0F060606
+
+ mww 0xF3013000 0xFC000000
+
+ mww 0xF4150054 0xc70
+ mww 0xF4150058 0x6
+ mww 0xF415005c 0x18
+ mww 0xF4150048 0x919c8866
+ mww 0xF415004c 0x1a838360
+ mww 0xF415008c 0xf06d50
+ mww 0xF4150050 0x3002d200
+
+
+ mww 0xF30101b0 1
sleep 100
- $::_TARGET0 riscv dmi_write 0x39 0xF4150068
- $::_TARGET0 riscv dmi_write 0x3C 0x930035C7
- $::_TARGET0 riscv dmi_write 0x39 0xF4150004
- $::_TARGET0 riscv dmi_write 0x3C 0xFF81
+ mww 0xF4150068 0x930035C7
+ mww 0xF4150004 0xFF81
sleep 200
echo "ddr3 has been enabled!"
@@ -112,107 +118,65 @@ proc init_ddr3 {} {
proc init_dram {} {
# ddr dcdc setup
- $::_TARGET0 riscv dmi_write 0x39 0xF4104080
- $::_TARGET0 riscv dmi_write 0x3C 0x10708
+ mww 0xF4104080 0x10708
# pll1 setup
- $::_TARGET0 riscv dmi_write 0x39 0xF40c0180
- $::_TARGET0 riscv dmi_write 0x3C 0xb0000016
- $::_TARGET0 riscv dmi_write 0x39 0xF40c0184
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF40c0188
- $::_TARGET0 riscv dmi_write 0x3C 0xe4e1c00
+ mww 0xF40c0180 0xb0000016
+ mww 0xF40c0184 0
+ mww 0xF40c0188 0xe4e1c00
#ddr setup
- $::_TARGET0 riscv dmi_write 0x39 0xF3010000
- $::_TARGET0 riscv dmi_write 0x3C 0x3040000
-
- $::_TARGET0 riscv dmi_write 0x39 0xF30101B0
- $::_TARGET0 riscv dmi_write 0x3C 0
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4150044
- $::_TARGET0 riscv dmi_write 0x3C 0x40a
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4150040
- $::_TARGET0 riscv dmi_write 0x3C 0xf004641f
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4153000
- $::_TARGET0 riscv dmi_write 0x3C 0xf0000011
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3013000
- $::_TARGET0 riscv dmi_write 0x3C 0xf4000000
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010490
- $::_TARGET0 riscv dmi_write 0x3C 1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3010000
- $::_TARGET0 riscv dmi_write 0x3C 0x1040000
- $::_TARGET0 riscv dmi_write 0x39 0xF3010190
- $::_TARGET0 riscv dmi_write 0x3C 0x07010101
- $::_TARGET0 riscv dmi_write 0x39 0xF3010194
- $::_TARGET0 riscv dmi_write 0x3C 0x20404
- $::_TARGET0 riscv dmi_write 0x39 0xF30101A4
- $::_TARGET0 riscv dmi_write 0x3C 0x20008
- $::_TARGET0 riscv dmi_write 0x39 0xF3010240
- $::_TARGET0 riscv dmi_write 0x3C 0x6000600
- $::_TARGET0 riscv dmi_write 0x39 0xF3010200
- $::_TARGET0 riscv dmi_write 0x3C 0x1f1f1f
- $::_TARGET0 riscv dmi_write 0x39 0xF3010204
- $::_TARGET0 riscv dmi_write 0x3C 0x70707
- $::_TARGET0 riscv dmi_write 0x39 0xF3010208
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF301020c
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF3010210
- $::_TARGET0 riscv dmi_write 0x3C 0x1f1f
- $::_TARGET0 riscv dmi_write 0x39 0xF3010214
- $::_TARGET0 riscv dmi_write 0x3C 0x6060606
- $::_TARGET0 riscv dmi_write 0x39 0xF3010218
- $::_TARGET0 riscv dmi_write 0x3C 0xf0f0606
-
- $::_TARGET0 riscv dmi_write 0x39 0xF3013000
- $::_TARGET0 riscv dmi_write 0x3C 0xfc000000
- $::_TARGET0 riscv dmi_write 0x39 0xF4150020
- $::_TARGET0 riscv dmi_write 0x3C 0x3000100
- $::_TARGET0 riscv dmi_write 0x39 0xF4150028
- $::_TARGET0 riscv dmi_write 0x3C 0x18002356
- $::_TARGET0 riscv dmi_write 0x39 0xF415002c
- $::_TARGET0 riscv dmi_write 0x3C 0x0aac4156
- $::_TARGET0 riscv dmi_write 0x39 0xF4150054
- $::_TARGET0 riscv dmi_write 0x3C 0xe73
- $::_TARGET0 riscv dmi_write 0x39 0xF4150058
- $::_TARGET0 riscv dmi_write 0x3C 0x5
- $::_TARGET0 riscv dmi_write 0x39 0xF415005c
- $::_TARGET0 riscv dmi_write 0x3C 0
- $::_TARGET0 riscv dmi_write 0x39 0xF4150048
- $::_TARGET0 riscv dmi_write 0x3C 0xf2adfe53
- $::_TARGET0 riscv dmi_write 0x39 0xF415004c
- $::_TARGET0 riscv dmi_write 0x3C 0x22820362
- $::_TARGET0 riscv dmi_write 0x39 0xF4150050
- $::_TARGET0 riscv dmi_write 0x3C 0x30020100
- $::_TARGET0 riscv dmi_write 0x39 0xF415008c
- $::_TARGET0 riscv dmi_write 0x3C 0xf06d50
-
- $::_TARGET0 riscv dmi_write 0x39 0xF30101b0
- $::_TARGET0 riscv dmi_write 0x3C 1
+ mww 0xF3010000 0x3040000
+
+ mww 0xF30101B0 0
+
+ mww 0xF4150044 0x40a
+
+ mww 0xF4150040 0xf004641f
+
+ mww 0xF4153000 0xf0000011
+
+ mww 0xF3013000 0xf4000000
+
+ mww 0xF3010490 1
+
+ mww 0xF3010000 0x1040000
+ mww 0xF3010190 0x07010101
+ mww 0xF3010194 0x20404
+ mww 0xF30101A4 0x20008
+ mww 0xF3010240 0x6000600
+ mww 0xF3010200 0x1f1f1f
+ mww 0xF3010204 0x70707
+ mww 0xF3010208 0
+ mww 0xF301020c 0
+ mww 0xF3010210 0x1f1f
+ mww 0xF3010214 0x6060606
+ mww 0xF3010218 0xf0f0606
+
+ mww 0xF3013000 0xfc000000
+ mww 0xF4150020 0x3000100
+ mww 0xF4150028 0x18002356
+ mww 0xF415002c 0x0aac4156
+ mww 0xF4150054 0xe73
+ mww 0xF4150058 0x5
+ mww 0xF415005c 0
+ mww 0xF4150048 0xf2adfe53
+ mww 0xF415004c 0x22820362
+ mww 0xF4150050 0x30020100
+ mww 0xF415008c 0xf06d50
+
+ mww 0xF30101b0 1
sleep 100
- $::_TARGET0 riscv dmi_write 0x39 0xF4150068
- $::_TARGET0 riscv dmi_write 0x3C 0x91003587
- $::_TARGET0 riscv dmi_write 0x39 0xF4150004
- $::_TARGET0 riscv dmi_write 0x3C 0xF501
+ mww 0xF4150068 0x91003587
+ mww 0xF4150004 0xF501
sleep 200
echo "ddr has been enabled!"
}
-$_TARGET0 configure -event reset-end {
- # init_clock
- # init_ddr3
-}
-
$_TARGET0 configure -event reset-init {
- init_clock
- # init_ddr3
+ init_clock
+ init_ddr3
}
$_TARGET0 configure -event gdb-attach {
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm6880.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm6880.cfg
index f1785609bab1..7c02320e75b2 100644
--- a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm6880.cfg
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm6880.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2023 HPMicro
+# Copyright (c) 2023,2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6880
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6880
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -11,3 +15,10 @@ target create $_TARGET0 riscv -chain-position $_CHIP.cpu -coreid 0
$_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
targets $_TARGET0
+
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
+proc reset_soc {} {
+ sba_write_mem 0xF410001C 24000000
+}
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6800evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
deleted file mode 100644
index 07a7c2e8a459..000000000000
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_airoc_wifi_rtt.ld
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 64K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 256M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 256K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01200000, LENGTH = 448K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x01270000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0400000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF4130000, LENGTH = 16k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- /* WHD kernel and HAL layer */
- KEEP(*whd_*.o (.text .text* .rodata .rodata*))
- KEEP(*cyhal_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > DLM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > DLM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > DLM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > DLM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt.ld
index 5757100f7dd6..86b15d2b2f5d 100644
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -31,6 +31,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -178,7 +187,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -188,6 +197,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -279,7 +297,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -306,7 +324,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > DLM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index aa6982398902..000000000000
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 128K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 128K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 256M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 256K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x1200000, LENGTH = 384K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x01260000, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0400000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF4130000, LENGTH = 16k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > DLM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > DLM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > DLM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > DLM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .sdram (NOLOAD) : {
- . = ALIGN(8);
- __sdram_start__ = .;
- __sdram_end__ = .;
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_sdram_rtt.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
deleted file mode 100644
index 7879f8390d66..000000000000
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/flash_sdram_rtt.ld
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 8M;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 256M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 32M;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 256K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x1200000, LENGTH = 512K
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0400000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF4130000, LENGTH = 16k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > DLM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > DLM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > DLM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > DLM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > SDRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > SDRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_rtt.ld
index 84a5a5590138..258c5f764c52 100644
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -116,6 +116,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -274,7 +283,6 @@ SECTIONS
.sdram (NOLOAD) : {
. = ALIGN(8);
__sdram_start__ = .;
- . += SDRAM_SIZE;
__sdram_end__ = .;
} > SDRAM
}
diff --git a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_sdram_rtt.ld b/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
deleted file mode 100644
index f990ab84eda6..000000000000
--- a/bsp/hpmicro/hpm6800evk/board/linker_scripts/gcc/ram_sdram_rtt.ld
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 256K;
-SDRAM_SIZE = DEFINED(_sdram_size) ? _sdram_size : 256M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 32M;
-
-MEMORY
-{
- ILM (wx) : ORIGIN = 0, LENGTH = 256K
- DLM (w) : ORIGIN = 0x80000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01200000, LENGTH = 512K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x40000000 + SDRAM_SIZE - NONCACHEABLE_SIZE, LENGTH = NONCACHEABLE_SIZE
- SDRAM (wx) : ORIGIN = 0x40000000, LENGTH = SDRAM_SIZE - NONCACHEABLE_SIZE
- AHB_SRAM (w) : ORIGIN = 0xF0400000, LENGTH = 32k
- APB_SRAM (w): ORIGIN = 0xF4130000, LENGTH = 16k
-}
-
-SECTIONS
-{
- .start : {
- . = ALIGN(8);
- KEEP(*(.start))
- } > AXI_SRAM
-
- .vectors : {
- . = ALIGN(8);
- KEEP(*(.isr_vector))
- KEEP(*(.vector_table))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .text : {
- . = ALIGN(8);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
- *(FalPartTable)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
- } > AXI_SRAM
-
- .rel : {
- KEEP(*(.rel*))
- } > AXI_SRAM
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > DLM
-
- /* Note: .tbss and .tdata should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > DLM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > DLM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
-
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
-
- __fast_load_addr__ = etext + SIZEOF(.tdata) + SIZEOF(.data);
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(8);
- PROVIDE(__ramfunc_start__ = .);
- *(.fast)
- . = ALIGN(8);
- PROVIDE(__ramfunc_end__ = .);
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- .apb_sram (NOLOAD) : {
- KEEP(*(.backup_sram))
- } > APB_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE (__rt_rvstack = .);
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- KEEP(*(.framebuffer))
- } > SDRAM
-
- .heap (NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
-
- } > SDRAM
-}
diff --git a/bsp/hpmicro/hpm6800evk/board/pinmux.c b/bsp/hpmicro/hpm6800evk/board/pinmux.c
index 84314edd4768..9cd4276d9c0b 100644
--- a/bsp/hpmicro/hpm6800evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm6800evk/board/pinmux.c
@@ -56,7 +56,7 @@ void init_cap_pins(void)
HPM_PIOC->PAD[IOC_PAD_PY07].FUNC_CTL = PIOC_PY07_FUNC_CTL_SOC_PY_07;
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C3) { /* Audio */
HPM_IOC->PAD[IOC_PAD_PD28].FUNC_CTL = IOC_PD28_FUNC_CTL_I2C3_SDA
@@ -80,8 +80,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PF09].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PF08].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- ;
+ return status_invalid_argument;
}
+ return status_success;
}
void init_cam_pins(void)
diff --git a/bsp/hpmicro/hpm6800evk/board/pinmux.h b/bsp/hpmicro/hpm6800evk/board/pinmux.h
index a95cd360a8fe..413faf4ce2c3 100644
--- a/bsp/hpmicro/hpm6800evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm6800evk/board/pinmux.h
@@ -14,7 +14,7 @@ extern "C" {
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
void init_cap_pins(void);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_gpio_pins(void);
void init_spi_pins(SPI_Type *ptr);
void init_spi_pins_with_gpio_as_cs(SPI_Type *ptr);
diff --git a/bsp/hpmicro/hpm6800evk/board/rtt_board.c b/bsp/hpmicro/hpm6800evk/board/rtt_board.c
index 338e4ad77f69..fae419d22d75 100644
--- a/bsp/hpmicro/hpm6800evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6800evk/board/rtt_board.c
@@ -41,14 +41,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
diff --git a/bsp/hpmicro/hpm6800evk/makefile.targets b/bsp/hpmicro/hpm6800evk/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm6800evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6800evk/rtconfig.h b/bsp/hpmicro/hpm6800evk/rtconfig.h
index 9e40580fb6b7..24397a8cb9b8 100644
--- a/bsp/hpmicro/hpm6800evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6800evk/rtconfig.h
@@ -7,6 +7,17 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -108,7 +119,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -294,6 +305,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -321,12 +336,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -406,11 +433,11 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6800_SERIES
+#define SOC_SERIES_HPM6000
/* Hardware Drivers Config */
-#define SOC_HPM6800
+#define SOC_HPM6000
/* On-chip Peripheral Drivers */
@@ -426,6 +453,33 @@
#define BSP_UART3_TX_BUFSIZE 0
#define BSP_UART3_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+
+/* AMPAK Wi-Fi module Configuration */
+
+/* end of AMPAK Wi-Fi module Configuration */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6800evk/rtconfig.py b/bsp/hpmicro/hpm6800evk/rtconfig.py
index 31a6e62e5ee4..c5744e06c8af 100644
--- a/bsp/hpmicro/hpm6800evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6800evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6800evk/startup/HPM6880/startup.c b/bsp/hpmicro/hpm6800evk/startup/HPM6880/startup.c
index c0a88c32092c..5afe1cece49e 100644
--- a/bsp/hpmicro/hpm6800evk/startup/HPM6880/startup.c
+++ b/bsp/hpmicro/hpm6800evk/startup/HPM6880/startup.c
@@ -56,6 +56,8 @@ __attribute__((weak)) void c_startup(void)
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -98,6 +100,18 @@ __attribute__((weak)) void c_startup(void)
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/start.S b/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/start.S
index c2000769245a..90e9037e7a3f 100644
--- a/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/start.S
@@ -77,6 +77,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -87,5 +88,14 @@ default_irq_handler:
.set default_isr_\irq, default_irq_handler
.long default_isr_\irq
.endm
-
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/vectors.S b/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/vectors.S
index 319bd00b2721..fe9766842f82 100644
--- a/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/vectors.S
+++ b/bsp/hpmicro/hpm6800evk/startup/HPM6880/toolchains/gcc/vectors.S
@@ -29,7 +29,7 @@ __vector_table:
IRQ_HANDLER 16 /* CAN6 IRQ handler */
IRQ_HANDLER 17 /* CAN7 IRQ handler */
IRQ_HANDLER 18 /* PTPC IRQ handler */
- IRQ_HANDLER 19 /* Reserved */
+ IRQ_HANDLER 19 /* Reserved */
IRQ_HANDLER 20 /* Reserved */
IRQ_HANDLER 21 /* Reserved */
IRQ_HANDLER 22 /* Reserved */
diff --git a/bsp/hpmicro/hpm6800evk/startup/SConscript b/bsp/hpmicro/hpm6800evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm6800evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6800evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6e00evk/.config b/bsp/hpmicro/hpm6e00evk/.config
index dacf916f90b8..589ae1a20e4f 100644
--- a/bsp/hpmicro/hpm6e00evk/.config
+++ b/bsp/hpmicro/hpm6e00evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -178,7 +188,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -237,11 +247,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -262,10 +272,10 @@ CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -458,6 +468,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -573,6 +584,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -632,6 +644,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -780,6 +794,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -813,7 +829,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -892,11 +922,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -905,6 +942,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -984,6 +1038,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1038,6 +1093,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1088,6 +1144,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1105,6 +1162,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1162,6 +1222,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1187,6 +1249,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1426,7 +1489,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6E00_SERIES=y
+CONFIG_SOC_SERIES_HPM6E00=y
#
# Hardware Drivers Config
@@ -1460,6 +1523,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART13 is not set
# CONFIG_BSP_USING_UART14 is not set
# CONFIG_BSP_USING_UART15 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_RTC is not set
# CONFIG_BSP_USING_TSW is not set
@@ -1475,5 +1539,70 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_PWMV2 is not set
# CONFIG_BSP_USING_MCAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_QEI is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_FFA is not set
+# CONFIG_BSP_USING_TAMP is not set
+CONFIG_BSP_USING_FEMC=y
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_PPI is not set
+# CONFIG_BSP_USING_LOBS is not set
+# CONFIG_BSP_USING_PDMLITE is not set
+# CONFIG_BSP_USING_QEIV2 is not set
+# CONFIG_BSP_USING_QEOV2 is not set
+# CONFIG_BSP_USING_RDC is not set
+# CONFIG_BSP_USING_SDM is not set
+# CONFIG_BSP_USING_PLB is not set
+# CONFIG_BSP_USING_SEI is not set
+# CONFIG_BSP_USING_MTG is not set
+# CONFIG_BSP_USING_VSC is not set
+# CONFIG_BSP_USING_CLC is not set
+# CONFIG_BSP_USING_ESC is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+CONFIG_INIT_EXT_RAM_FOR_DATA=y
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6e00evk/.cproject b/bsp/hpmicro/hpm6e00evk/.cproject
index eafefd8ef55a..ef87c72be501 100644
--- a/bsp/hpmicro/hpm6e00evk/.cproject
+++ b/bsp/hpmicro/hpm6e00evk/.cproject
@@ -20,7 +20,7 @@
-
+
@@ -90,7 +90,7 @@
-
+
@@ -111,7 +111,7 @@
-
+
@@ -135,7 +135,7 @@
-
+
@@ -190,7 +190,7 @@
-
+
diff --git a/bsp/hpmicro/hpm6e00evk/README.md b/bsp/hpmicro/hpm6e00evk/README.md
index a00e74ec0b92..c12fd8d17dd6 100644
--- a/bsp/hpmicro/hpm6e00evk/README.md
+++ b/bsp/hpmicro/hpm6e00evk/README.md
@@ -74,7 +74,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6e80-single-core.cfg -f boards\debug_scripts\boards\hpm6e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6e80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -82,7 +82,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6e80-single-core.cfg -f boards\debug_scripts\boards\hpm6e00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6e80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6e00evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6e00evk/README_zh.md b/bsp/hpmicro/hpm6e00evk/README_zh.md
index 0af8550fe092..68bca79d6bf9 100644
--- a/bsp/hpmicro/hpm6e00evk/README_zh.md
+++ b/bsp/hpmicro/hpm6e00evk/README_zh.md
@@ -74,14 +74,14 @@ HPM6E00EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6e80-single-core.cfg -f boards\debug_scripts\boards\hpm6e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6e80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6e00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6e80-single-core.cfg -f boards\debug_scripts\boards\hpm6e00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6e80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6e00evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6e00evk/SConscript b/bsp/hpmicro/hpm6e00evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6e00evk/SConscript
+++ b/bsp/hpmicro/hpm6e00evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6e00evk/SConstruct b/bsp/hpmicro/hpm6e00evk/SConstruct
index 11f8073bd4c8..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6e00evk/SConstruct
+++ b/bsp/hpmicro/hpm6e00evk/SConstruct
@@ -15,6 +15,26 @@ except:
print(RTT_ROOT)
exit(-1)
+def bsp_pkg_check():
+ if GetOption('clean'):
+ return
+
+ need_update = True
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
+ if need_update:
+ print("\n===============================================================================")
+ print("Dependency packages missing, please running 'pkgs --update'...")
+ print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...")
+ print("===============================================================================")
+ exit(1)
+
+RegisterPreBuildingAction(bsp_pkg_check)
+
TARGET = 'rtthread.' + rtconfig.TARGET_EXT
AddOption('--run',
@@ -47,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -60,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6e00evk/applications/SConscript b/bsp/hpmicro/hpm6e00evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6e00evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6e00evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6e00evk/applications/main.c b/bsp/hpmicro/hpm6e00evk/applications/main.c
index a5a7f07c7373..8aff6b812685 100644
--- a/bsp/hpmicro/hpm6e00evk/applications/main.c
+++ b/bsp/hpmicro/hpm6e00evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6e00evk/board/Kconfig b/bsp/hpmicro/hpm6e00evk/board/Kconfig
index b41d283c6a45..7f0bca8783d5 100644
--- a/bsp/hpmicro/hpm6e00evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6e00evk/board/Kconfig
@@ -2,7 +2,7 @@ menu "Hardware Drivers Config"
config SOC_HPM6E00
bool
- select SOC_HPM6E00_SERIES
+ select SOC_SERIES_HPM6E00
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -91,6 +91,11 @@ menu "On-chip Peripheral Drivers"
int "UART1 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -118,6 +123,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -145,6 +155,11 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART4
bool "Enable UART4"
@@ -172,6 +187,11 @@ menu "On-chip Peripheral Drivers"
int "UART4 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
@@ -199,6 +219,11 @@ menu "On-chip Peripheral Drivers"
int "UART5 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -226,6 +251,11 @@ menu "On-chip Peripheral Drivers"
int "UART6 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART7
bool "Enable UART7"
@@ -253,6 +283,11 @@ menu "On-chip Peripheral Drivers"
int "UART7 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART8
bool "Enable UART8"
@@ -280,6 +315,11 @@ menu "On-chip Peripheral Drivers"
int "UART8 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART8_DMA_PINGPONG_BUFSIZE
+ int "Set UART8 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART8_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART9
bool "Enable UART9"
@@ -307,6 +347,11 @@ menu "On-chip Peripheral Drivers"
int "UART9 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART9_DMA_PINGPONG_BUFSIZE
+ int "Set UART9 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART9_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART10
bool "Enable UART10"
@@ -334,6 +379,11 @@ menu "On-chip Peripheral Drivers"
int "UART10 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART10_DMA_PINGPONG_BUFSIZE
+ int "Set UART10 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART10_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART11
bool "Enable UART11"
@@ -361,6 +411,11 @@ menu "On-chip Peripheral Drivers"
int "UART11 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART11_DMA_PINGPONG_BUFSIZE
+ int "Set UART11 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART11_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART12
bool "Enable UART12"
@@ -388,6 +443,11 @@ menu "On-chip Peripheral Drivers"
int "UART12 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART12_DMA_PINGPONG_BUFSIZE
+ int "Set UART12 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART12_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART13
bool "Enable UART13"
@@ -415,6 +475,11 @@ menu "On-chip Peripheral Drivers"
int "UART13 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART13_DMA_PINGPONG_BUFSIZE
+ int "Set UART13 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART13_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART14
bool "Enable UART14"
@@ -442,6 +507,11 @@ menu "On-chip Peripheral Drivers"
int "UART14 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART14_DMA_PINGPONG_BUFSIZE
+ int "Set UART14 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART14_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART15
bool "Enable UART15"
@@ -469,10 +539,33 @@ menu "On-chip Peripheral Drivers"
int "UART15 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART15_DMA_PINGPONG_BUFSIZE
+ int "Set UART15 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART15_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
@@ -489,7 +582,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -497,7 +590,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -519,7 +612,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -527,7 +620,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -549,7 +642,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -557,7 +650,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -579,7 +672,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -587,7 +680,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -609,7 +702,7 @@ menu "On-chip Peripheral Drivers"
int "SPI4 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI4_CS_SEL
+ choice
prompt "Select SPI4 CS TYPE"
default BSP_SPI4_USING_SOFT_CS
config BSP_SPI4_USING_SOFT_CS
@@ -617,7 +710,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI4_USING_HARD_CS
bool "Enable SPI4 hardware cs"
endchoice
- choice BSP_SPI4_IO_MODE_SEL
+ choice
prompt "Select SPI4 IO mode"
default BSP_SPI4_USING_SINGLE_IO
config BSP_SPI4_USING_SINGLE_IO
@@ -639,7 +732,7 @@ menu "On-chip Peripheral Drivers"
int "SPI5 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI5_CS_SEL
+ choice
prompt "Select SPI5 CS TYPE"
default BSP_SPI5_USING_SOFT_CS
config BSP_SPI5_USING_SOFT_CS
@@ -647,7 +740,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI5_USING_HARD_CS
bool "Enable SPI5 hardware cs"
endchoice
- choice BSP_SPI5_IO_MODE_SEL
+ choice
prompt "Select SPI5 IO mode"
default BSP_SPI5_USING_SINGLE_IO
config BSP_SPI5_USING_SINGLE_IO
@@ -669,7 +762,7 @@ menu "On-chip Peripheral Drivers"
int "SPI6 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI6_CS_SEL
+ choice
prompt "Select SPI6 CS TYPE"
default BSP_SPI6_USING_SOFT_CS
config BSP_SPI6_USING_SOFT_CS
@@ -677,7 +770,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI6_USING_HARD_CS
bool "Enable SPI6 hardware cs"
endchoice
- choice BSP_SPI6_IO_MODE_SEL
+ choice
prompt "Select SPI6 IO mode"
default BSP_SPI6_USING_SINGLE_IO
config BSP_SPI6_USING_SINGLE_IO
@@ -699,7 +792,7 @@ menu "On-chip Peripheral Drivers"
int "SPI7 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI7_CS_SEL
+ choice
prompt "Select SPI7 CS TYPE"
default BSP_SPI7_USING_SOFT_CS
config BSP_SPI7_USING_SOFT_CS
@@ -707,7 +800,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI7_USING_HARD_CS
bool "Enable SPI7 hardware cs"
endchoice
- choice BSP_SPI7_IO_MODE_SEL
+ choice
prompt "Select SPI7 IO mode"
default BSP_SPI7_USING_SINGLE_IO
config BSP_SPI7_USING_SINGLE_IO
@@ -740,7 +833,7 @@ menu "On-chip Peripheral Drivers"
select RT_USING_PHY if BSP_USING_ETH
if BSP_USING_ETH
- choice BSP_ETH0_SEL
+ choice
prompt "ETH"
default BSP_USING_ETH0
@@ -828,6 +921,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -933,7 +1035,6 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -976,7 +1077,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_EWDG
bool "Enable EWDG"
default n
@@ -993,7 +1093,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWMV2
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWMV2
+ select RT_USING_PWM
menuconfig BSP_USING_MCAN
bool "Enable MCAN"
@@ -1077,7 +1177,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -1098,7 +1198,378 @@ menu "On-chip Peripheral Drivers"
endif
endif
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_QEI
+ bool "Enable QEI (Quadrature Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_FFA
+ bool "Enable FFA"
+ default n
+
+ menuconfig BSP_USING_TAMP
+ bool "Enable TAMP (Tamper)"
+ default n
+
+ menuconfig BSP_USING_FEMC
+ bool "Enable FEMC (Flexible External Memory Controller)"
+ default n
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_PPI
+ bool "Enable PPI (Parallel Port Interface)"
+ default n
+
+ menuconfig BSP_USING_LOBS
+ bool "Enable LOBS"
+ default n
+
+ menuconfig BSP_USING_PDMLITE
+ bool "Enable PDMLITE"
+ default n
+
+ menuconfig BSP_USING_QEIV2
+ bool "Enable QEIV2 (Quadrature Encoder Interface V2)"
+ default n
+
+ menuconfig BSP_USING_QEOV2
+ bool "Enable QEOV2 (Quadrature Encoder Output V2)"
+ default n
+
+ menuconfig BSP_USING_RDC
+ bool "Enable RDC (Resolver to Digital Converter)"
+ default n
+
+ menuconfig BSP_USING_SDM
+ bool "Enable SDM (Sigma-Delta Modulator)"
+ default n
+
+ menuconfig BSP_USING_PLB
+ bool "Enable PLB"
+ default n
+
+ menuconfig BSP_USING_SEI
+ bool "Enable SEI (Synchronous Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_MTG
+ bool "Enable MTG (Motor Timing Generator)"
+ default n
+
+ menuconfig BSP_USING_VSC
+ bool "Enable VSC"
+ default n
+
+ menuconfig BSP_USING_CLC
+ bool "Enable CLC"
+ default n
+
+ menuconfig BSP_USING_ESC
+ bool "Enable ESC (EtherCAT Slave Controller)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig INIT_EXT_RAM_FOR_DATA
+ bool "INIT_EXT_RAM_FOR_DATA"
+ default y
+ select BSP_USING_FEMC if INIT_EXT_RAM_FOR_DATA
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
endmenu
+menu "HPMicro Interrupt Config"
endmenu
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
+endmenu
+
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+endmenu
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/boards/hpm6e00evk.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/boards/hpm6e00evk.cfg
index 3147f1b559ad..4814347e616f 100644
--- a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/boards/hpm6e00evk.cfg
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/boards/hpm6e00evk.cfg
@@ -50,23 +50,10 @@
flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x7
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-dual-core.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-dual-core.cfg
index 377657360466..9bc53968794a 100644
--- a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-dual-core.cfg
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-dual-core.cfg
@@ -1,9 +1,12 @@
-# Copyright (c) 2024 HPMicro
+# Copyright (c) 2024-2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
-
-set _CHIP hpm6e00
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6e00
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -14,35 +17,19 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-proc dmi_write {reg value} {
- $::_TARGET0 riscv dmi_write ${reg} ${value}
-}
-
-proc dmi_read {reg} {
- set v [$::_TARGET0 riscv dmi_read ${reg}]
- return ${v}
-}
-proc dmi_write_memory {addr value} {
- dmi_write 0x39 ${addr}
- dmi_write 0x3C ${value}
-}
-
-proc dmi_read_memory {addr} {
- set sbcs [expr { 0x100000 | [dmi_read 0x38] }]
- dmi_write 0x38 ${sbcs}
- dmi_write 0x39 ${addr}
- set value [dmi_read 0x3C]
- return ${value}
-}
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
proc release_core1 {} {
- dmi_write_memory 0xF4002C00 0x1000
+ sba_write_mem 0xF4002C00 0x1000
}
set _TARGET1 $_CHIP.cpu1
target create $_TARGET1 riscv -chain-position $_CHIP.cpu -coreid 1
$_TARGET1 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
+source [find soc/hpm_common_csr.cfg]
+
$_TARGET1 configure -event examine-start {
release_core1
}
@@ -53,11 +40,9 @@ $_TARGET1 configure -event reset-deassert-pre {
}
$_TARGET0 configure -event reset-end {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002010
- $::_TARGET0 riscv dmi_write 0x3C 0x2
+ sba_write_mem 0xF4002010 0x2
}
proc reset_soc {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF410001C
- $::_TARGET0 riscv dmi_write 0x3C 24000000
+ sba_write_mem 0xF410001C 24000000
}
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-single-core.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-single-core.cfg
index b80ad2027b72..3e020331c7e7 100644
--- a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-single-core.cfg
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm6e80-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2024 HPMicro
+# Copyright (c) 2024-2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6e00
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6e00
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -12,7 +16,9 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
proc reset_soc {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF410001C
- $::_TARGET0 riscv dmi_write 0x3C 24000000
+ sba_write_mem 0xF410001C 24000000
}
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6e00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt.ld
index f2cbfced976f..6f6b31b2bb76 100644
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -28,6 +28,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -175,7 +184,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -185,6 +194,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -276,7 +294,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -303,7 +321,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index e1068d6059ba..000000000000
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,354 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 128K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 16M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 512K;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 256K
- DLM (w) : ORIGIN = 0x00200000, LENGTH = 256K
- AXI_SRAM (wx) : ORIGIN = 0x01200000, LENGTH = 512K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x01280000, LENGTH = NONCACHEABLE_SIZE
- AHB_SRAM (w): ORIGIN = 0xF0200000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*ip*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/ram_rtt.ld
index 8bcf794005a2..4a9b7523fedb 100644
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -113,6 +113,16 @@ SECTIONS
. = ALIGN(8);
} > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt.icf b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt.icf
deleted file mode 100644
index d098add1f131..000000000000
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt.icf
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (c) 2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-
-define memory with size = 4G;
-
-/* Regions */
-define region NOR_CFG_OPTION = [ from 0x80000400 size 0xc00 ];
-define region BOOT_HEADER = [ from 0x80001000 size 0x2000 ];
-define region FLASH = [from 0x80003000 size 16M - 0x3000 ]; /* FLASH */
-define region ILM = [from 0x00000000 size 256k]; /* ILM */
-define region DLM = [from 0x00200000 size 256k]; /* DLM */
-define region AXI_SRAM = [from 0x01200000 size 512k];
-define region NONCACHEABLE_RAM = [from 0x01280000 size 256k];
-define region AHB_SRAM = [from 0xF0200000 size 32k];
-
-/* Blocks */
-define block vectors with fixed order { section .vector_table, section .isr_vector, section .isr_vector.* };
-define block vectors_s with fixed order { section .vector_s_table, section .isr_s_vector };
-define block ctors { section .ctors, section .ctors.*, block with alphabetical order { init_array } };
-define block dtors { section .dtors, section .dtors.*, block with reverse alphabetical order { fini_array } };
-define block eh_frame { section .eh_frame, section .eh_frame.* };
-define block tbss { section .tbss, section .tbss.* };
-define block tdata { section .tdata, section .tdata.* };
-define block tls with fixed order { block tbss, block tdata };
-define block tdata_load { copy of block tdata };
-define block heap with size = 64K, alignment = 8, /* fill =0x00, */ readwrite access { };
-define block stack with size = __STACKSIZE__, alignment = 16, /* fill =0xCD, */ readwrite access { };
-define block cherryusb_usbh_class_info with alignment = 8 { section .usbh_class_info };
-define block framebuffer with alignment = 8 { section .framebuffer, section .framebuffer.* };
-define block boot_header with fixed order { section .boot_header, section .fw_info_table, section .dc_info };
-define block rtthread_FSymTab { section FSymTab };
-define block rtthread_VSymTab { section VSymTab };
-define block rtthread_rti_fn with alphabetical order { section .rti_fn* };
-define block rtthread_RTMSymTab { section RTMSymTab };
-
-/* Symbols */
-define exported symbol __nor_cfg_option_load_addr__ = start of region NOR_CFG_OPTION;
-define exported symbol __boot_header_load_addr__ = start of region BOOT_HEADER;
-define exported symbol __app_load_addr__ = start of region FLASH;
-define exported symbol __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-define exported symbol __boot_header_length__ = size of block boot_header;
-
-
-define exported symbol __noncacheable_start__ = start of region NONCACHEABLE_RAM;
-define exported symbol __noncacheable_end__ = end of region NONCACHEABLE_RAM + 1;
-
-define exported symbol _stack_safe = end of block stack + 1;
-define exported symbol _stack = end of block stack + 1;
-define exported symbol __rt_rvstack = end of block stack + 1;
-define exported symbol __usbh_class_info_start__ = start of block cherryusb_usbh_class_info;
-define exported symbol __usbh_class_info_end__ = end of block cherryusb_usbh_class_info + 1;
-
-define exported symbol __fsymtab_start = start of block rtthread_FSymTab;
-define exported symbol __fsymtab_end = end of block rtthread_FSymTab + 1;
-
-define exported symbol __vsymtab_start = start of block rtthread_VSymTab;
-define exported symbol __vsymtab_end = end of block rtthread_VSymTab + 1;
-
-define exported symbol __rt_init_start = start of block rtthread_rti_fn;
-define exported symbol __rt_init_end = end of block rtthread_rti_fn + 1;
-
-define exported symbol __rtmsymtab_start = start of block rtthread_RTMSymTab;
-define exported symbol __rtmsymtab_end = end of block rtthread_RTMSymTab + 1;
-
-/* Initialization */
-do not initialize { section .noncacheable, section .fast_ram }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .non_init, section .non_init.*, section .*.non_init, section .*.non_init.* };
-do not initialize { section .no_init, section .no_init.*, section .*.no_init, section .*.no_init.* }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .noinit, section .noinit.*, section .*.noinit, section .*.noinit.* }; // Legacy sections, used by some SDKs/HALs
-
-initialize by copy with packing=auto { section .noncacheable.init, section .noncacheable.init.*, section .fast_ram.init, section .fast_ram.init.* };
-initialize by copy with packing=none { section .data, section .data.*, section .*.data, section .*.data.* }; // Static data sections
-initialize by copy with packing=auto { section .sdata, section .sdata.* };
-initialize by copy with packing=auto { section .fast, section .fast.*, section .*.fast, section .*.fast.*, section .text.*nx* }; // "RAM Code" sections
-
-initialize by calling __SEGGER_init_heap { block heap }; // Init the heap if there is one
-initialize by calling __SEGGER_init_ctors { block ctors }; // Call constructors for global objects which need to be constructed before reaching main (if any). Make sure this is done after setting up heap.
-initialize by copy { block vectors, block vectors_s };
-
-initialize by copy {
- section .text.rt_*,
- section .text.trap*,
- section .text.entry,
- section .text.context_gcc,
- };
-place in ILM {
- section .text.rt_*,
- section .text.trap*,
- section .text.entry,
- section .text.context_gcc,
- };
-
-
-/* Placement */
-place in NOR_CFG_OPTION { section .nor_cfg_option };
-place in BOOT_HEADER with fixed order { block boot_header };
-place at start of FLASH with fixed order { symbol _start };
-place at start of ILM with fixed order { block vectors, block vectors_s };
-place in FLASH with minimum size order {
- block tdata_load, // Thread-local-storage load image
- block ctors, // Constructors block
- block dtors, // Destructors block
- block eh_frame, // Exception frames placed directly into flash overriding default placement (sections writable)
- block rtthread_FSymTab,
- block rtthread_VSymTab,
- block rtthread_rti_fn,
- block rtthread_RTMSymTab,
- block cherryusb_usbh_class_info,
- readonly, // Catch-all for readonly data (e.g. .rodata, .srodata)
- readexec // Catch-all for (readonly) executable code (e.g. .text)
- };
-
-//
-// The GNU compiler creates these exception-related sections as writeable.
-// Override the section header flag and make them readonly so they can be
-// placed into flash.
-//
-define access readonly { section .gcc_except_table, section .gcc_except_table.* };
-define access readonly { section .eh_frame, section .eh_frame.* };
-define access readonly { section .sdata.DW.* };
-
-place in ILM { section .fast, section .fast.*, section .text.*nx* }; // "ramfunc" section
-place in AXI_SRAM { block framebuffer };
-place in AXI_SRAM {
- block tls, // Thread-local-storage block
- readwrite, // Catch-all for initialized/uninitialized data sections (e.g. .data, .noinit)
- zeroinit // Catch-all for zero-initialized data sections (e.g. .bss)
- };
-place in NONCACHEABLE_RAM { section .noncacheable.non_init, section .noncacheable.non_init.*, section .noncacheable.init, section .noncacheable.init.*, section .noncacheable.bss, section .noncacheable.bss.*, section .noncacheable };
-place in AHB_SRAM { section .ahb_sram, section .ahb_sram.*}; // AHB SRAM memory
-place in DLM { section .fast_ram.init, section .fast_ram.init.*, section .fast_ram.non_init, section .fast_ram.non_init.*, section .fast_ram.bss, section .fast_ram.bss.*, section .fast_ram }; // Fast access memory
-place in DLM { block heap }; // Heap reserved block
-place at end of DLM { block stack }; // Stack reserved block
-
-/* Keep */
-keep { section .nor_cfg_option, section .boot_header, section .fw_info_table, section .dc_info };
-keep { section .usbh_class_info, section FSymTab, section VSymTab, section .rti_fn*, section RTMSymTab };
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt_enet.icf b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt_enet.icf
deleted file mode 100644
index e41aca2d4e2e..000000000000
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/flash_rtt_enet.icf
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-
-define memory with size = 4G;
-
-/* Regions */
-define region NOR_CFG_OPTION = [ from 0x80000400 size 0xc00 ];
-define region BOOT_HEADER = [ from 0x80001000 size 0x2000 ];
-define region FLASH = [from 0x80003000 size 16M - 0x3000 ]; /* FLASH */
-define region ILM = [from 0x00000000 size 256k]; /* ILM */
-define region DLM = [from 0x00200000 size 256k]; /* DLM */
-define region AXI_SRAM = [from 0x01200000 size 512k];
-define region NONCACHEABLE_RAM = [from 0x01280000 size 256k];
-define region AHB_SRAM = [from 0xF0200000 size 32k];
-
-/* Blocks */
-define block vectors with fixed order { section .vector_table, section .isr_vector, section .isr_vector.* };
-define block vectors_s with fixed order { section .vector_s_table, section .isr_s_vector };
-define block ctors { section .ctors, section .ctors.*, block with alphabetical order { init_array } };
-define block dtors { section .dtors, section .dtors.*, block with reverse alphabetical order { fini_array } };
-define block eh_frame { section .eh_frame, section .eh_frame.* };
-define block tbss { section .tbss, section .tbss.* };
-define block tdata { section .tdata, section .tdata.* };
-define block tls with fixed order { block tbss, block tdata };
-define block tdata_load { copy of block tdata };
-define block heap with size = 32K, alignment = 8, /* fill =0x00, */ readwrite access { };
-define block stack with size = __STACKSIZE__, alignment = 16, /* fill =0xCD, */ readwrite access { };
-define block cherryusb_usbh_class_info with alignment = 8 { section .usbh_class_info };
-define block framebuffer with alignment = 8 { section .framebuffer, section .framebuffer.* };
-define block boot_header with fixed order { section .boot_header, section .fw_info_table, section .dc_info };
-define block rtthread_FSymTab { section FSymTab };
-define block rtthread_VSymTab { section VSymTab };
-define block rtthread_rti_fn with alphabetical order { section .rti_fn* };
-define block rtthread_RTMSymTab { section RTMSymTab };
-
-/* Symbols */
-define exported symbol __nor_cfg_option_load_addr__ = start of region NOR_CFG_OPTION;
-define exported symbol __boot_header_load_addr__ = start of region BOOT_HEADER;
-define exported symbol __app_load_addr__ = start of region FLASH;
-define exported symbol __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-define exported symbol __boot_header_length__ = size of block boot_header;
-
-define exported symbol __noncacheable_start__ = start of region NONCACHEABLE_RAM;
-define exported symbol __noncacheable_end__ = end of region NONCACHEABLE_RAM + 1;
-
-define exported symbol _stack_safe = end of block stack + 1;
-define exported symbol _stack = end of block stack + 1;
-define exported symbol __rt_rvstack = end of block stack + 1;
-define exported symbol __usbh_class_info_start__ = start of block cherryusb_usbh_class_info;
-define exported symbol __usbh_class_info_end__ = end of block cherryusb_usbh_class_info + 1;
-
-define exported symbol __fsymtab_start = start of block rtthread_FSymTab;
-define exported symbol __fsymtab_end = end of block rtthread_FSymTab + 1;
-
-define exported symbol __vsymtab_start = start of block rtthread_VSymTab;
-define exported symbol __vsymtab_end = end of block rtthread_VSymTab + 1;
-
-define exported symbol __rt_init_start = start of block rtthread_rti_fn;
-define exported symbol __rt_init_end = end of block rtthread_rti_fn + 1;
-
-define exported symbol __rtmsymtab_start = start of block rtthread_RTMSymTab;
-define exported symbol __rtmsymtab_end = end of block rtthread_RTMSymTab + 1;
-
-/* Initialization */
-do not initialize { section .noncacheable, section .fast_ram }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .non_init, section .non_init.*, section .*.non_init, section .*.non_init.* };
-do not initialize { section .no_init, section .no_init.*, section .*.no_init, section .*.no_init.* }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .noinit, section .noinit.*, section .*.noinit, section .*.noinit.* }; // Legacy sections, used by some SDKs/HALs
-
-initialize by copy with packing=auto { section .noncacheable.init, section .noncacheable.init.*, section .fast_ram.init, section .fast_ram.init.* };
-initialize by copy with packing=none { section .data, section .data.*, section .*.data, section .*.data.* }; // Static data sections
-initialize by copy with packing=auto { section .sdata, section .sdata.* };
-initialize by copy with packing=auto { section .fast, section .fast.*, section .*.fast, section .*.fast.*, section .text.*nx* }; // "RAM Code" sections
-
-initialize by calling __SEGGER_init_heap { block heap }; // Init the heap if there is one
-initialize by calling __SEGGER_init_ctors { block ctors }; // Call constructors for global objects which need to be constructed before reaching main (if any). Make sure this is done after setting up heap.
-initialize by copy { block vectors, block vectors_s };
-
-initialize by copy {
- section .text.rt_*,
- section .text.trap*,
- section .text.entry,
- section .text.context_gcc,
-
- section .text.tcpip_*,
- section .text.tcp_*,
- section .text.ethernet_*,
- section .text.lwip_*,
- section .text.eth_rx_thread_entry,
- section .text.enet0_pbuf_free_custom,
- section .text.enet1_pbuf_free_custom,
- section .text.free_rx_dma_descriptor,
- section .text.isr_enet,
- section .text.eth_rx_callback,
- section .text.eth_device_ready,
- section .text._rt_*,
- section .text.enet_*,
- section .text.pbuf_*,
- section .text.do_memp_malloc_pool,
- section .text.do_memp_free_pool,
- section .text.sys_*,
- section .text.*tcp*,
- section .text.*udp*,
- section .text.raw*,
- section .text.iperf*,
- section .text.netconn*,
- section .text.net*,
- section .text.ip4*,
- section .text.recv*,
- section .text.sal*,
- section .text.send*,
- section .text.etharp*,
- section .text.phy*,
- section .text.ethernetif*,
- section .text.mem*,
- section .text.memp*,
- section .text.event_callback,
- };
-place in ILM {
- section .text.rt_*,
- section .text.trap*,
- section .text.entry,
- section .text.context_gcc,
-
- section .text.tcpip_*,
- section .text.tcp_*,
- section .text.ethernet_*,
- section .text.lwip_*,
- section .text.eth_rx_thread_entry,
- section .text.enet0_pbuf_free_custom,
- section .text.enet1_pbuf_free_custom,
- section .text.free_rx_dma_descriptor,
- section .text.isr_enet,
- section .text.eth_rx_callback,
- section .text.eth_device_ready,
- section .text._rt_*,
- section .text.enet_*,
- section .text.pbuf_*,
- section .text.do_memp_malloc_pool,
- section .text.do_memp_free_pool,
- section .text.sys_*,
- section .text.*tcp*,
- section .text.*udp*,
- section .text.raw*,
- section .text.iperf*,
- section .text.netconn*,
- section .text.net*,
- section .text.ip4*,
- section .text.recv*,
- section .text.sal*,
- section .text.send*,
- section .text.etharp*,
- section .text.phy*,
- section .text.ethernetif*,
- section .text.mem*,
- section .text.memp*,
- section .text.event_callback,
- };
-
-
-/* Placement */
-place in NOR_CFG_OPTION { section .nor_cfg_option };
-place in BOOT_HEADER with fixed order { block boot_header };
-place at start of FLASH with fixed order { symbol _start };
-place at start of ILM with fixed order { block vectors, block vectors_s };
-place in FLASH with minimum size order {
- block tdata_load, // Thread-local-storage load image
- block ctors, // Constructors block
- block dtors, // Destructors block
- block eh_frame, // Exception frames placed directly into flash overriding default placement (sections writable)
- block rtthread_FSymTab,
- block rtthread_VSymTab,
- block rtthread_rti_fn,
- block rtthread_RTMSymTab,
- block cherryusb_usbh_class_info,
- readonly, // Catch-all for readonly data (e.g. .rodata, .srodata)
- readexec // Catch-all for (readonly) executable code (e.g. .text)
- };
-
-//
-// The GNU compiler creates these exception-related sections as writeable.
-// Override the section header flag and make them readonly so they can be
-// placed into flash.
-//
-define access readonly { section .gcc_except_table, section .gcc_except_table.* };
-define access readonly { section .eh_frame, section .eh_frame.* };
-define access readonly { section .sdata.DW.* };
-
-place in ILM { section .fast, section .fast.*, section .text.*nx* }; // "ramfunc" section
-place in AXI_SRAM { block framebuffer };
-place in AXI_SRAM {
- block tls, // Thread-local-storage block
- readwrite, // Catch-all for initialized/uninitialized data sections (e.g. .data, .noinit)
- zeroinit // Catch-all for zero-initialized data sections (e.g. .bss)
- };
-place in NONCACHEABLE_RAM { section .noncacheable.non_init, section .noncacheable.non_init.*, section .noncacheable.init, section .noncacheable.init.*, section .noncacheable.bss, section .noncacheable.bss.*, section .noncacheable };
-place in AHB_SRAM { section .ahb_sram, section .ahb_sram.*}; // AHB SRAM memory
-place in DLM { section .fast_ram.init, section .fast_ram.init.*, section .fast_ram.non_init, section .fast_ram.non_init.*, section .fast_ram.bss, section .fast_ram.bss.*, section .fast_ram }; // Fast access memory
-place in DLM { block heap }; // Heap reserved block
-place at end of DLM { block stack }; // Stack reserved block
-
-/* Keep */
-keep { section .nor_cfg_option, section .boot_header, section .fw_info_table, section .dc_info };
-keep { section .usbh_class_info, section FSymTab, section VSymTab, section .rti_fn*, section RTMSymTab };
diff --git a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/ram_rtt.icf b/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/ram_rtt.icf
deleted file mode 100644
index bd71a9e7dd85..000000000000
--- a/bsp/hpmicro/hpm6e00evk/board/linker_scripts/segger/ram_rtt.icf
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-
-define memory with size = 4G;
-
-/* Regions */
-define region ILM = [from 0x00000000 size 256k]; /* ILM */
-define region DLM = [from 0x00200000 size 256k]; /* DLM */
-define region AXI_SRAM = [from 0x01200000 size 512k];
-define region NONCACHEABLE_RAM = [from 0x01280000 size 512k];
-define region AHB_SRAM = [from 0xF0200000 size 32k];
-
-/* Blocks */
-define block vectors with fixed order { section .vector_table, section .isr_vector, section .isr_vector.* };
-define block vectors_s with fixed order { section .vector_s_table, section .isr_s_vector };
-define block ctors { section .ctors, section .ctors.*, block with alphabetical order { init_array } };
-define block dtors { section .dtors, section .dtors.*, block with reverse alphabetical order { fini_array } };
-define block eh_frame { section .eh_frame, section .eh_frame.* };
-define block tbss { section .tbss, section .tbss.* };
-define block tdata { section .tdata, section .tdata.* };
-define block tls with fixed order { block tbss, block tdata };
-define block tdata_load { copy of block tdata };
-define block heap with size = 128K, alignment = 8, /* fill =0x00, */ readwrite access { };
-define block stack with size = __STACKSIZE__, alignment = 16, /* fill =0xCD, */ readwrite access { };
-define block cherryusb_usbh_class_info with alignment = 8 { section .usbh_class_info };
-define block framebuffer with alignment = 8 { section .framebuffer, section .framebuffer.* };
-define block rtthread_FSymTab { section FSymTab };
-define block rtthread_VSymTab { section VSymTab };
-define block rtthread_rti_fn with alphabetical order { section .rti_fn* };
-define block rtthread_RTMSymTab { section RTMSymTab };
-
-/* Symbols */
-define exported symbol __noncacheable_start__ = start of region NONCACHEABLE_RAM;
-define exported symbol __noncacheable_end__ = end of region NONCACHEABLE_RAM + 1;
-define exported symbol _stack_safe = end of block stack + 1;
-define exported symbol _stack = end of block stack + 1;
-define exported symbol __rt_rvstack = end of block stack + 1;
-define exported symbol __usbh_class_info_start__ = start of block cherryusb_usbh_class_info;
-define exported symbol __usbh_class_info_end__ = end of block cherryusb_usbh_class_info + 1;
-
-define exported symbol __fsymtab_start = start of block rtthread_FSymTab;
-define exported symbol __fsymtab_end = end of block rtthread_FSymTab + 1;
-
-define exported symbol __vsymtab_start = start of block rtthread_VSymTab;
-define exported symbol __vsymtab_end = end of block rtthread_VSymTab + 1;
-
-define exported symbol __rt_init_start = start of block rtthread_rti_fn;
-define exported symbol __rt_init_end = end of block rtthread_rti_fn + 1;
-
-define exported symbol __rtmsymtab_start = start of block rtthread_RTMSymTab;
-define exported symbol __rtmsymtab_end = end of block rtthread_RTMSymTab + 1;
-
-/* Initialization */
-do not initialize { section .noncacheable, section .fast_ram }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .non_init, section .non_init.*, section .*.non_init, section .*.non_init.* };
-do not initialize { section .no_init, section .no_init.*, section .*.no_init, section .*.no_init.* }; // Legacy sections, kept for backwards compatibility
-do not initialize { section .noinit, section .noinit.*, section .*.noinit, section .*.noinit.* }; // Legacy sections, used by some SDKs/HALs
-
-initialize by copy with packing=auto { section .noncacheable.init, section .noncacheable.init.*, section .fast_ram.init, section .fast_ram.init.* };
-initialize by copy with packing=none { section .data, section .data.*, section .*.data, section .*.data.* }; // Static data sections
-initialize by copy with packing=auto { section .sdata, section .sdata.* };
-initialize by copy with packing=auto { section .fast, section .fast.*, section .*.fast, section .*.fast.*, section .text.*nx* }; // "RAM Code" sections
-
-initialize by calling __SEGGER_init_heap { block heap }; // Init the heap if there is one
-initialize by calling __SEGGER_init_ctors { block ctors }; // Call constructors for global objects which need to be constructed before reaching main (if any). Make sure this is done after setting up heap.
-initialize by copy { block vectors, block vectors_s };
-
-
-/* Placement */
-place at start of AXI_SRAM with fixed order { symbol _start, block vectors, block vectors_s };
-place in AXI_SRAM with minimum size order {
- block tdata_load, // Thread-local-storage load image
- block ctors, // Constructors block
- block dtors, // Destructors block
- block eh_frame, // Exception frames placed directly into flash overriding default placement (sections writable)
- block rtthread_FSymTab,
- block rtthread_VSymTab,
- block rtthread_rti_fn,
- block rtthread_RTMSymTab,
- block cherryusb_usbh_class_info,
- readonly, // Catch-all for readonly data (e.g. .rodata, .srodata)
- readexec // Catch-all for (readonly) executable code (e.g. .text)
- };
-
-//
-// The GNU compiler creates these exception-related sections as writeable.
-// Override the section header flag and make them readonly so they can be
-// placed into flash.
-//
-define access readonly { section .gcc_except_table, section .gcc_except_table.* };
-define access readonly { section .eh_frame, section .eh_frame.* };
-define access readonly { section .sdata.DW.* };
-
-place in AXI_SRAM { section .fast, section .fast.*, section .text.*nx* }; // "ramfunc" section
-place in AXI_SRAM { block framebuffer };
-place in DLM {
- block tls, // Thread-local-storage block
- readwrite, // Catch-all for initialized/uninitialized data sections (e.g. .data, .noinit)
- zeroinit // Catch-all for zero-initialized data sections (e.g. .bss)
- };
-place in NONCACHEABLE_RAM { section .noncacheable.non_init, section .noncacheable.non_init.*, section .noncacheable.init, section .noncacheable.init.*, section .noncacheable.bss, section .noncacheable.bss.*, section .noncacheable };
-place in AHB_SRAM { section .ahb_sram, section .ahb_sram.*}; // AHB SRAM memory
-place in DLM { section .fast_ram.init, section .fast_ram.init.*, section .fast_ram.non_init, section .fast_ram.non_init.*, section .fast_ram.bss, section .fast_ram.bss.*, section .fast_ram }; // Fast access memory
-place in AXI_SRAM { block heap }; // Heap reserved block
-place at end of DLM { block stack }; // Stack reserved block
-
-/* Keep */
-keep { section .usbh_class_info, section FSymTab, section VSymTab, section .rti_fn*, section RTMSymTab };
diff --git a/bsp/hpmicro/hpm6e00evk/board/pinmux.c b/bsp/hpmicro/hpm6e00evk/board/pinmux.c
index 1de940b4a0e4..a88b53f6e94b 100644
--- a/bsp/hpmicro/hpm6e00evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm6e00evk/board/pinmux.c
@@ -49,7 +49,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C0) {
HPM_IOC->PAD[IOC_PAD_PY02].FUNC_CTL = IOC_PY02_FUNC_CTL_I2C0_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
@@ -70,8 +70,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PF12].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PF13].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- ;
+ return status_invalid_argument;
}
+ return status_success;
}
void init_femc_pins(void)
diff --git a/bsp/hpmicro/hpm6e00evk/board/pinmux.h b/bsp/hpmicro/hpm6e00evk/board/pinmux.h
index 01aa0f437f64..4b7fbdcaeabc 100644
--- a/bsp/hpmicro/hpm6e00evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm6e00evk/board/pinmux.h
@@ -13,7 +13,7 @@ extern "C" {
#endif
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_femc_pins(void);
void init_ppi_pins(void);
void init_sdm_pins(void);
diff --git a/bsp/hpmicro/hpm6e00evk/board/rtt_board.c b/bsp/hpmicro/hpm6e00evk/board/rtt_board.c
index 034b6ea751b0..a260758cb521 100644
--- a/bsp/hpmicro/hpm6e00evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6e00evk/board/rtt_board.c
@@ -41,14 +41,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
@@ -132,7 +138,7 @@ void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
}
#endif
-uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
+uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
{
uint32_t freq = 0;
@@ -148,7 +154,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
}
clock_add_to_group(clock_adc0, 0);
freq = clock_get_frequency(clock_adc0);
- } else if (ptr == (void *)HPM_ADC1) {
+ } else if (ptr == HPM_ADC1) {
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
clock_set_adc_source(clock_adc1, clk_adc_src_ahb0);
@@ -159,7 +165,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
}
clock_add_to_group(clock_adc1, 0);
freq = clock_get_frequency(clock_adc1);
- } else if (ptr == (void *)HPM_ADC2) {
+ } else if (ptr == HPM_ADC2) {
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
clock_set_adc_source(clock_adc2, clk_adc_src_ahb0);
@@ -170,7 +176,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
}
clock_add_to_group(clock_adc2, 0);
freq = clock_get_frequency(clock_adc2);
- } else if (ptr == (void *)HPM_ADC3) {
+ } else if (ptr == HPM_ADC3) {
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
clock_set_adc_source(clock_adc3, clk_adc_src_ahb0);
diff --git a/bsp/hpmicro/hpm6e00evk/makefile.targets b/bsp/hpmicro/hpm6e00evk/makefile.targets
new file mode 100644
index 000000000000..4583a13f1cd3
--- /dev/null
+++ b/bsp/hpmicro/hpm6e00evk/makefile.targets
@@ -0,0 +1,6 @@
+clean2:
+ -$(RM) $(CC_DEPS)$(C++_DEPS)$(C_UPPER_DEPS)$(CXX_DEPS)$(SECONDARY_FLASH)$(SECONDARY_SIZE)$(ASM_DEPS)$(S_UPPER_DEPS)$(C_DEPS)$(CPP_DEPS)
+ -$(RM) $(OBJS) *.elf
+ -@echo ' '
+
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
diff --git a/bsp/hpmicro/hpm6e00evk/rtconfig.h b/bsp/hpmicro/hpm6e00evk/rtconfig.h
index 47db2c1614da..4a699f214eb3 100644
--- a/bsp/hpmicro/hpm6e00evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6e00evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -104,7 +114,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -290,6 +300,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -317,12 +331,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -402,7 +428,7 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6E00_SERIES
+#define SOC_SERIES_HPM6E00
/* Hardware Drivers Config */
@@ -417,7 +443,32 @@
#define BSP_UART0_RX_BUFSIZE 128
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
+#define BSP_USING_FEMC
+#define INIT_EXT_RAM_FOR_DATA
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6e00evk/rtconfig.py b/bsp/hpmicro/hpm6e00evk/rtconfig.py
index 81110453e9ec..72dd5318049f 100644
--- a/bsp/hpmicro/hpm6e00evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6e00evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,30 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
-try:
- from building import *
-except:
- print('Cannot found RT-Thread root directory, please check RTT_ROOT')
- print(RTT_ROOT)
- exit(-1)
-
-def bsp_pkg_check():
- import subprocess
-
- need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
- if need_update:
- print("\n===============================================================================")
- print("Dependency packages missing, please running 'pkgs --update'...")
- print("If no packages are fetched, run 'pkgs --upgrade' first, then 'pkgs --update'...")
- print("===============================================================================")
- exit(1)
-
-RegisterPreBuildingAction(bsp_pkg_check)
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
@@ -83,9 +59,13 @@ def bsp_pkg_check():
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -105,7 +85,7 @@ def bsp_pkg_check():
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -113,8 +93,8 @@ def bsp_pkg_check():
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -123,8 +103,8 @@ def bsp_pkg_check():
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6e00evk/rtconfig_preinc.h b/bsp/hpmicro/hpm6e00evk/rtconfig_preinc.h
index b7ae18b32666..e4431f23a517 100644
--- a/bsp/hpmicro/hpm6e00evk/rtconfig_preinc.h
+++ b/bsp/hpmicro/hpm6e00evk/rtconfig_preinc.h
@@ -6,7 +6,6 @@
/* RT-Thread pre-include file */
#define D45
-#define HPM6880
#define HPM6E80
#define HPMSOC_HAS_HPMSDK_DMAV2
#define RT_USING_LIBC
diff --git a/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/startup.c b/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/startup.c
index e3f85a9e0ee0..78705526d884 100644
--- a/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/startup.c
+++ b/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/startup.c
@@ -54,6 +54,8 @@ __attribute__((weak)) void c_startup(void)
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@ __attribute__((weak)) void c_startup(void)
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/toolchains/gcc/start.S b/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/toolchains/gcc/start.S
index c2000769245a..0262684ad38f 100644
--- a/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6e00evk/startup/HPM6E80/toolchains/gcc/start.S
@@ -77,6 +77,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -89,3 +90,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6e00evk/startup/SConscript b/bsp/hpmicro/hpm6e00evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm6e00evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6e00evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6p00evk/.config b/bsp/hpmicro/hpm6p00evk/.config
index 1f8257f0f7c9..b3905d1c2fa7 100644
--- a/bsp/hpmicro/hpm6p00evk/.config
+++ b/bsp/hpmicro/hpm6p00evk/.config
@@ -11,8 +11,18 @@
# rt_vsnprintf options
#
# CONFIG_RT_KLIBC_USING_LIBC_VSNPRINTF is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG is not set
-# CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LONGLONG=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_STANDARD=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS=y
+CONFIG_RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER=y
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_CHECK_NUL_IN_FORMAT_SPECIFIER is not set
+# CONFIG_RT_KLIBC_USING_VSNPRINTF_MSVC_STYLE_INTEGER_SPECIFIERS is not set
+CONFIG_RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE=32
+CONFIG_RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION=6
+CONFIG_RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL=9
+CONFIG_RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS=4
# end of rt_vsnprintf options
#
@@ -182,7 +192,7 @@ CONFIG_RT_USING_CONSOLE=y
CONFIG_RT_CONSOLEBUF_SIZE=128
CONFIG_RT_CONSOLE_DEVICE_NAME="uart0"
CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y
-CONFIG_RT_VER_NUM=0x50300
+CONFIG_RT_VER_NUM=0x50301
# CONFIG_RT_USING_STDC_ATOMIC is not set
CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32
# end of RT-Thread Kernel
@@ -241,11 +251,11 @@ CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y
CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_SERIAL_BYPASS is not set
# CONFIG_RT_USING_CAN is not set
+# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_CLOCK_TIME is not set
# CONFIG_RT_USING_I2C is not set
# CONFIG_RT_USING_PHY is not set
# CONFIG_RT_USING_PHY_V2 is not set
-# CONFIG_RT_USING_ADC is not set
# CONFIG_RT_USING_DAC is not set
# CONFIG_RT_USING_NULL is not set
# CONFIG_RT_USING_ZERO is not set
@@ -266,10 +276,10 @@ CONFIG_RT_SERIAL_USING_DMA=y
# CONFIG_RT_USING_LCD is not set
# CONFIG_RT_USING_HWCRYPTO is not set
# CONFIG_RT_USING_WIFI is not set
+# CONFIG_RT_USING_RPMSG is not set
# CONFIG_RT_USING_BLK is not set
# CONFIG_RT_USING_REGULATOR is not set
# CONFIG_RT_USING_POWER_SUPPLY is not set
-# CONFIG_RT_USING_VIRTIO is not set
CONFIG_RT_USING_PIN=y
# CONFIG_RT_USING_CHERRYUSB is not set
# end of Device Drivers
@@ -462,6 +472,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_ABUP_FOTA is not set
# CONFIG_PKG_USING_LIBCURL2RTT is not set
# CONFIG_PKG_USING_CAPNP is not set
+# CONFIG_PKG_USING_ERPC is not set
# CONFIG_PKG_USING_AGILE_TELNET is not set
# CONFIG_PKG_USING_NMEALIB is not set
# CONFIG_PKG_USING_PDULIB is not set
@@ -577,6 +588,7 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_QRCODE is not set
# CONFIG_PKG_USING_GUIENGINE is not set
# CONFIG_PKG_USING_3GPP_AMRNB is not set
+# CONFIG_PKG_USING_LITETYPE is not set
# end of multimedia packages
#
@@ -636,6 +648,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_UORB is not set
# CONFIG_PKG_USING_RT_TUNNEL is not set
# CONFIG_PKG_USING_VIRTUAL_TERMINAL is not set
+# CONFIG_PKG_USING_FEE is not set
+# CONFIG_PKG_USING_MRAMTRACE is not set
# end of tools packages
#
@@ -784,6 +798,8 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_STM32WB_CMSIS_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_HAL_DRIVER is not set
# CONFIG_PKG_USING_STM32MP1_M4_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_HAL_DRIVER is not set
+# CONFIG_PKG_USING_STM32N6_CMSIS_DRIVER is not set
# end of STM32 HAL & SDK Drivers
#
@@ -817,7 +833,21 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
# CONFIG_PKG_USING_NUCLEI_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_RP2350_SDK is not set
# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set
-# CONFIG_PKG_USING_MM32 is not set
+
+#
+# MM32 HAL & SDK Drivers
+#
+# CONFIG_PKG_USING_MM32F103XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F3270X_CMSIS is not set
+# CONFIG_PKG_USING_MM32F5260X_CMSIS is not set
+# CONFIG_PKG_USING_MM32L0XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32L3XX_CMSIS is not set
+# CONFIG_PKG_USING_MM32F103XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F3270X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32F5260X_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L0XX_HAL_DRIVER is not set
+# CONFIG_PKG_USING_MM32L3XX_HAL_DRIVER is not set
+# end of MM32 HAL & SDK Drivers
#
# WCH HAL & SDK Drivers
@@ -896,11 +926,18 @@ CONFIG_RT_LIBC_TZ_DEFAULT_SEC=0
#
CONFIG_PKG_USING_HPM_SDK=y
CONFIG_PKG_HPM_SDK_PATH="/packages/peripherals/hal-sdk/hpmicro/hpm_sdk"
-CONFIG_PKG_USING_HPM_SDK_V110=y
+# CONFIG_PKG_USING_HPM_SDK_V110 is not set
+CONFIG_PKG_USING_HPM_SDK_V113=y
# CONFIG_PKG_USING_HPM_SDK_LATEST_VERSION is not set
-CONFIG_PKG_HPM_SDK_VER="v1.10.0"
+CONFIG_PKG_HPM_SDK_VER="v1.13.0"
# end of HPMicro SDK
+#
+# FM33 Drivers
+#
+# CONFIG_PKG_USING_FM33LG0XX_FL_LIBRARY is not set
+# end of FM33 Drivers
+
#
# FT32 HAL & SDK Drivers
#
@@ -909,6 +946,23 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_FT32F4_STD_DRIVER is not set
# CONFIG_PKG_USING_FT32F4_CMSIS_DRIVER is not set
# end of FT32 HAL & SDK Drivers
+
+#
+# NOVOSNS Drivers
+#
+# CONFIG_PKG_USING_NOVOSNS_SERIES_DRIVER is not set
+# end of NOVOSNS Drivers
+
+#
+# N32 Drivers
+#
+# CONFIG_PKG_USING_N32H7XX_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H7XX_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H49X_CMSIS_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_STD_DRIVER is not set
+# CONFIG_PKG_USING_N32H47X_48X_CMSIS_DRIVER is not set
+# end of N32 Drivers
# end of HAL & SDK Drivers
#
@@ -988,6 +1042,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QMI8658 is not set
# CONFIG_PKG_USING_ICM20948 is not set
# CONFIG_PKG_USING_SCD4X is not set
+# CONFIG_PKG_USING_BMI270 is not set
# end of sensors drivers
#
@@ -1042,6 +1097,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_WK2124 is not set
# CONFIG_PKG_USING_LY68L6400 is not set
# CONFIG_PKG_USING_DM9051 is not set
+# CONFIG_PKG_USING_CH390 is not set
# CONFIG_PKG_USING_SSD1306 is not set
# CONFIG_PKG_USING_QKEY is not set
# CONFIG_PKG_USING_RS485 is not set
@@ -1092,6 +1148,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_IRUART is not set
# CONFIG_PKG_USING_ST7305 is not set
# CONFIG_PKG_USING_TM1668 is not set
+# CONFIG_PKG_USING_TCA9548A is not set
# CONFIG_PKG_USING_SPI_TOOLS is not set
# end of peripheral libraries and drivers
@@ -1109,6 +1166,9 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_NAXOS is not set
# CONFIG_PKG_USING_R_TINYMAIX is not set
# CONFIG_PKG_USING_LLMCHAT is not set
+# CONFIG_PKG_USING_LIME_TM is not set
+# CONFIG_PKG_USING_AIFES is not set
+# CONFIG_PKG_USING_AGENT is not set
# end of AI packages
#
@@ -1166,6 +1226,8 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_MULTIBUTTON is not set
# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set
# CONFIG_PKG_USING_CANFESTIVAL is not set
+# CONFIG_PKG_USING_CANOPENNODE is not set
+# CONFIG_PKG_USING_LELY is not set
# CONFIG_PKG_USING_ZLIB is not set
# CONFIG_PKG_USING_MINIZIP is not set
# CONFIG_PKG_USING_HEATSHRINK is not set
@@ -1191,6 +1253,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# CONFIG_PKG_USING_QPARAM is not set
# CONFIG_PKG_USING_CorevMCU_CLI is not set
# CONFIG_PKG_USING_DRMP is not set
+# CONFIG_PKG_USING_AUTOGEN_PARAMETER_MANAGER is not set
# end of miscellaneous packages
#
@@ -1430,7 +1493,7 @@ CONFIG_PKG_HPM_SDK_VER="v1.10.0"
# end of Arduino libraries
# end of RT-Thread online packages
-CONFIG_SOC_HPM6P00_SERIES=y
+CONFIG_SOC_SERIES_HPM6P00=y
#
# Hardware Drivers Config
@@ -1456,6 +1519,7 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_UART5 is not set
# CONFIG_BSP_USING_UART6 is not set
# CONFIG_BSP_USING_UART7 is not set
+# CONFIG_BSP_USING_PUART is not set
# CONFIG_BSP_USING_SPI is not set
# CONFIG_BSP_USING_ETH is not set
# CONFIG_BSP_USING_GPTMR is not set
@@ -1469,5 +1533,64 @@ CONFIG_BSP_UART0_IRQ_PRIORITY=1
# CONFIG_BSP_USING_PWMV2 is not set
# CONFIG_BSP_USING_MCAN is not set
# CONFIG_BSP_USING_ADC is not set
+# CONFIG_BSP_USING_WDG is not set
+# CONFIG_BSP_USING_CRC is not set
+# CONFIG_BSP_USING_TSNS is not set
+# CONFIG_BSP_USING_ACMP is not set
+# CONFIG_BSP_USING_DAC is not set
+# CONFIG_BSP_USING_QEIV2 is not set
+# CONFIG_BSP_USING_QEOV2 is not set
+# CONFIG_BSP_USING_RDC is not set
+# CONFIG_BSP_USING_SEI is not set
+# CONFIG_BSP_USING_MTGV2 is not set
+# CONFIG_BSP_USING_VSC is not set
+# CONFIG_BSP_USING_CLC is not set
+# CONFIG_BSP_USING_SDM is not set
+# CONFIG_BSP_USING_PLB is not set
+# CONFIG_BSP_USING_PPI is not set
+# CONFIG_BSP_USING_LOBS is not set
+# CONFIG_BSP_USING_PTPC is not set
+# CONFIG_BSP_USING_RNG is not set
+# CONFIG_BSP_USING_SDP is not set
+# CONFIG_BSP_USING_MCHTMR is not set
+# CONFIG_BSP_USING_SOFT_I2C is not set
+# CONFIG_BSP_USING_SOFT_SPI is not set
# end of On-chip Peripheral Drivers
+
+#
+# HPMicro Interrupt Config
+#
+
+#
+# HPMicro RT-Thread Interrupt Framework
+#
+
+#
+# HPMicro Use Generic Startup Implementation
+#
+# end of HPMicro Use Generic Startup Implementation
+
+#
+# HPMicro RT-Thread backtrace configuration (experimental)
+#
+# CONFIG_HPM_ENABLE_RTTHREAD_BACKTRACE_PORT is not set
+# CONFIG_HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER is not set
+# end of HPMicro RT-Thread backtrace configuration (experimental)
# end of Hardware Drivers Config
+
+#
+# Third-Party Add-ons
+#
+
+#
+# Segger SystemView Config
+#
+# CONFIG_BSP_USING_SYSTEMVIEW is not set
+# end of Segger SystemView Config
+
+#
+# RT-Thread Insight Config
+#
+# CONFIG_BSP_USING_RTI is not set
+# end of RT-Thread Insight Config
+# end of Third-Party Add-ons
diff --git a/bsp/hpmicro/hpm6p00evk/.cproject b/bsp/hpmicro/hpm6p00evk/.cproject
index eafefd8ef55a..a38d6697905d 100644
--- a/bsp/hpmicro/hpm6p00evk/.cproject
+++ b/bsp/hpmicro/hpm6p00evk/.cproject
@@ -20,7 +20,7 @@
-
+
@@ -70,9 +70,9 @@
-
-
-
+
+
+
@@ -87,10 +87,10 @@
-
+
-
+
@@ -111,7 +111,7 @@
-
+
@@ -135,7 +135,7 @@
-
+
@@ -168,9 +168,9 @@
-
-
-
+
+
+
@@ -185,18 +185,18 @@
-
+
-
+
-
+
diff --git a/bsp/hpmicro/hpm6p00evk/.settings/projcfg.ini b/bsp/hpmicro/hpm6p00evk/.settings/projcfg.ini
index 421ec3853eed..d0fbffb9b7a5 100644
--- a/bsp/hpmicro/hpm6p00evk/.settings/projcfg.ini
+++ b/bsp/hpmicro/hpm6p00evk/.settings/projcfg.ini
@@ -17,4 +17,4 @@ project_type=rt-thread
os_branch=master
os_version=latest
project_name=blink_led
-output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm6e00evk
\ No newline at end of file
+output_project_path=D:\oss\rt-thread\bsp\hpmicro\hpm6p00evk
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6p00evk/README.md b/bsp/hpmicro/hpm6p00evk/README.md
index 355edee54ed1..3e4ee4ce2011 100644
--- a/bsp/hpmicro/hpm6p00evk/README.md
+++ b/bsp/hpmicro/hpm6p00evk/README.md
@@ -73,7 +73,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Users can download the project via the below command:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6p80-single-core.cfg -f boards\debug_scripts\boards\hpm6p00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6p80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6p00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- Users can debug the project via the below command:
@@ -81,7 +81,7 @@ Open RT-Thread ENV command-line, and change directory to this BSP directory, the
- Connect debugger via `OpenOCD`:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6p80-single-core.cfg -f boards\debug_scripts\boards\hpm6p00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6p80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6p00evk.cfg
```
- Start Debugger via `GDB`:
diff --git a/bsp/hpmicro/hpm6p00evk/README_zh.md b/bsp/hpmicro/hpm6p00evk/README_zh.md
index e4a10fef31ef..13b92c11fddf 100644
--- a/bsp/hpmicro/hpm6p00evk/README_zh.md
+++ b/bsp/hpmicro/hpm6p00evk/README_zh.md
@@ -73,14 +73,14 @@ HPM6P00EVK 是由先楫半导体推出的一款基于RISCV内核的开发板,
- 通过如下命令完成下载:
```console
- %OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6p80-single-core.cfg -f boards\debug_scripts\boards\hpm6p00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
+ %OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6p80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6p00evk.cfg -c "init; halt; flash write_image erase rtthread.elf; reset; shutdown"
```
- 通过如下命令实现调试:
- 通过 `OpenOCD` 来连接开发板:
```console
-%OPENOCD_HPMICRO%\openocd.exe -f boards\debug_scripts\probes\ft2232.cfg -f boards\debug_scripts\soc\hpm6p80-single-core.cfg -f boards\debug_scripts\boards\hpm6p00evk.cfg
+%OPENOCD_HPMICRO%\openocd.exe -f board\debug_scripts\openocd\probes\ft2232.cfg -f board\debug_scripts\openocd\soc\hpm6p80-single-core.cfg -f board\debug_scripts\openocd\boards\hpm6p00evk.cfg
```
- 通过 `GDB` 实现调试:
```console
diff --git a/bsp/hpmicro/hpm6p00evk/SConscript b/bsp/hpmicro/hpm6p00evk/SConscript
index 014c428d0a37..606b65445b0a 100644
--- a/bsp/hpmicro/hpm6p00evk/SConscript
+++ b/bsp/hpmicro/hpm6p00evk/SConscript
@@ -7,7 +7,6 @@ cwd = GetCurrentDir()
objs = []
list = os.listdir(cwd)
-ASFLAGS = ' -I' + cwd
for d in list:
path = os.path.join(cwd, d)
diff --git a/bsp/hpmicro/hpm6p00evk/SConstruct b/bsp/hpmicro/hpm6p00evk/SConstruct
index d48a9a0956c3..c0ae22c1c28f 100644
--- a/bsp/hpmicro/hpm6p00evk/SConstruct
+++ b/bsp/hpmicro/hpm6p00evk/SConstruct
@@ -16,13 +16,16 @@ except:
exit(-1)
def bsp_pkg_check():
- import subprocess
-
+ if GetOption('clean'):
+ return
+
need_update = True
- for p in os.listdir("packages"):
- if p.startswith("hpm_sdk-"):
- need_update = False
- break
+
+ if os.path.isdir("packages"):
+ for p in os.listdir("packages"):
+ if p.startswith("hpm_sdk-"):
+ need_update = False
+ break
if need_update:
print("\n===============================================================================")
print("Dependency packages missing, please running 'pkgs --update'...")
@@ -64,9 +67,6 @@ if os.path.exists(os.path.join(SDK_ROOT, 'libraries')):
else:
libraries_path_prefix = os.path.join(os.path.dirname(SDK_ROOT), 'libraries')
-SDK_LIB = libraries_path_prefix
-Export('SDK_LIB')
-
GDB = rtconfig.GDB
@@ -77,6 +77,7 @@ objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False)
# includes rtt drivers
objs.extend(SConscript(os.path.join(libraries_path_prefix, 'drivers', 'SConscript'), variant_dir='build/libraries/drivers', duplicate=0))
+objs.extend(SConscript(os.path.join(libraries_path_prefix, 'misc', 'SConscript'), variant_dir='build/libraries/misc', duplicate=0))
# make a building
DoBuilding(TARGET, objs)
diff --git a/bsp/hpmicro/hpm6p00evk/applications/SConscript b/bsp/hpmicro/hpm6p00evk/applications/SConscript
index a65aa4d8553b..00bf6b8d8f7e 100644
--- a/bsp/hpmicro/hpm6p00evk/applications/SConscript
+++ b/bsp/hpmicro/hpm6p00evk/applications/SConscript
@@ -1,5 +1,3 @@
-import rtconfig
-
from building import *
cwd = GetCurrentDir()
diff --git a/bsp/hpmicro/hpm6p00evk/applications/main.c b/bsp/hpmicro/hpm6p00evk/applications/main.c
index a5a7f07c7373..8aff6b812685 100644
--- a/bsp/hpmicro/hpm6p00evk/applications/main.c
+++ b/bsp/hpmicro/hpm6p00evk/applications/main.c
@@ -19,7 +19,10 @@ int main(void)
static uint32_t led_thread_arg = 0;
rt_thread_t led_thread = rt_thread_create("led_th", thread_entry, &led_thread_arg, 1024, 1, 10);
- rt_thread_startup(led_thread);
+ if (led_thread != RT_NULL)
+ {
+ rt_thread_startup(led_thread);
+ }
return 0;
}
diff --git a/bsp/hpmicro/hpm6p00evk/board/Kconfig b/bsp/hpmicro/hpm6p00evk/board/Kconfig
index 7cb6b9a9963b..e3b792d30d6a 100644
--- a/bsp/hpmicro/hpm6p00evk/board/Kconfig
+++ b/bsp/hpmicro/hpm6p00evk/board/Kconfig
@@ -2,7 +2,7 @@ menu "Hardware Drivers Config"
config SOC_HPM6P00
bool
- select SOC_HPM6P00_SERIES
+ select SOC_SERIES_HPM6P00
select RT_USING_COMPONENTS_INIT
select RT_USING_USER_MAIN
default y
@@ -87,6 +87,11 @@ menu "On-chip Peripheral Drivers"
int "UART1 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART1_DMA_PINGPONG_BUFSIZE
+ int "Set UART1 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART1_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART2
bool "Enable UART2"
@@ -114,6 +119,11 @@ menu "On-chip Peripheral Drivers"
int "UART2 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART2_DMA_PINGPONG_BUFSIZE
+ int "Set UART2 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART2_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART3
bool "Enable UART3"
@@ -141,10 +151,15 @@ menu "On-chip Peripheral Drivers"
int "UART3 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART3_DMA_PINGPONG_BUFSIZE
+ int "Set UART3 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART3_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART4
bool "Enable UART4"
- default n
+ default y
if BSP_USING_UART4
config BSP_UART4_RX_USING_DMA
bool "Enable UART4 RX DMA"
@@ -168,6 +183,11 @@ menu "On-chip Peripheral Drivers"
int "UART4 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART4_DMA_PINGPONG_BUFSIZE
+ int "Set UART4 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART4_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART5
bool "Enable UART5"
@@ -195,6 +215,11 @@ menu "On-chip Peripheral Drivers"
int "UART5 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART5_DMA_PINGPONG_BUFSIZE
+ int "Set UART5 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART5_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART6
bool "Enable UART6"
@@ -222,6 +247,11 @@ menu "On-chip Peripheral Drivers"
int "UART6 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART6_DMA_PINGPONG_BUFSIZE
+ int "Set UART6 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART6_RX_USING_DMA
+ default 128
endif
menuconfig BSP_USING_UART7
bool "Enable UART7"
@@ -249,10 +279,33 @@ menu "On-chip Peripheral Drivers"
int "UART7 Interrupt Priority"
range 1 7
default 1
+ config BSP_UART7_DMA_PINGPONG_BUFSIZE
+ int "Set UART7 RX DMA ping-pong buffer size"
+ range 32 8192
+ depends on RT_USING_SERIAL_V2 && BSP_UART7_RX_USING_DMA
+ default 128
+ endif
+ menuconfig BSP_USING_PUART
+ bool "Enable PUART"
+ default n
+ if BSP_USING_PUART
+ config BSP_PUART_RX_BUFSIZE
+ int "Set PUART RX buffer size"
+ range 64 65535
+ depends on RT_USING_SERIAL_V2
+ default 1024
+ config BSP_PUART_TX_BUFSIZE
+ int "Set PUART TX buffer size"
+ range 0 65535
+ depends on RT_USING_SERIAL_V2
+ default 128
+ config BSP_PUART_IRQ_PRIORITY
+ int "PUART Interrupt Priority"
+ range 1 7
+ default 1
endif
endif
-
menuconfig BSP_USING_SPI
bool "Enable SPI"
default n
@@ -269,7 +322,7 @@ menu "On-chip Peripheral Drivers"
int "SPI0 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI0_CS_SEL
+ choice
prompt "Select SPI0 CS TYPE"
default BSP_SPI0_USING_SOFT_CS
config BSP_SPI0_USING_SOFT_CS
@@ -277,7 +330,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI0_USING_HARD_CS
bool "Enable SPI0 hardware cs"
endchoice
- choice BSP_SPI0_IO_MODE_SEL
+ choice
prompt "Select SPI0 IO mode"
default BSP_SPI0_USING_SINGLE_IO
config BSP_SPI0_USING_SINGLE_IO
@@ -299,7 +352,7 @@ menu "On-chip Peripheral Drivers"
int "SPI1 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI1_CS_SEL
+ choice
prompt "Select SPI1 CS TYPE"
default BSP_SPI1_USING_SOFT_CS
config BSP_SPI1_USING_SOFT_CS
@@ -307,7 +360,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI1_USING_HARD_CS
bool "Enable SPI1 hardware cs"
endchoice
- choice BSP_SPI1_IO_MODE_SEL
+ choice
prompt "Select SPI1 IO mode"
default BSP_SPI1_USING_SINGLE_IO
config BSP_SPI1_USING_SINGLE_IO
@@ -329,7 +382,7 @@ menu "On-chip Peripheral Drivers"
int "SPI2 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI2_CS_SEL
+ choice
prompt "Select SPI2 CS TYPE"
default BSP_SPI2_USING_SOFT_CS
config BSP_SPI2_USING_SOFT_CS
@@ -337,7 +390,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI2_USING_HARD_CS
bool "Enable SPI2 hardware cs"
endchoice
- choice BSP_SPI2_IO_MODE_SEL
+ choice
prompt "Select SPI2 IO mode"
default BSP_SPI2_USING_SINGLE_IO
config BSP_SPI2_USING_SINGLE_IO
@@ -359,7 +412,7 @@ menu "On-chip Peripheral Drivers"
int "SPI3 Interrupt Priority"
range 1 7
default 1
- choice BSP_SPI3_CS_SEL
+ choice
prompt "Select SPI3 CS TYPE"
default BSP_SPI3_USING_SOFT_CS
config BSP_SPI3_USING_SOFT_CS
@@ -367,7 +420,7 @@ menu "On-chip Peripheral Drivers"
config BSP_SPI3_USING_HARD_CS
bool "Enable SPI3 hardware cs"
endchoice
- choice BSP_SPI3_IO_MODE_SEL
+ choice
prompt "Select SPI3 IO mode"
default BSP_SPI3_USING_SINGLE_IO
config BSP_SPI3_USING_SINGLE_IO
@@ -388,7 +441,7 @@ menu "On-chip Peripheral Drivers"
select RT_USING_PHY if BSP_USING_ETH
if BSP_USING_ETH
- choice BSP_ETH0_SEL
+ choice
prompt "ETH"
default BSP_USING_ETH0
@@ -405,6 +458,7 @@ menu "On-chip Peripheral Drivers"
if BSP_USING_GPTMR
config BSP_USING_GPTMR0
bool "Enable GPTMR0"
+ depends on !HPM_USING_VECTOR_PREEMPTED_MODE
default n
if BSP_USING_GPTMR0
config BSP_GPTMR0_IRQ_PRIORITY
@@ -439,6 +493,15 @@ menu "On-chip Peripheral Drivers"
range 1 7
default 1
endif
+ config BSP_USING_PTMR
+ bool "Enable PTMR"
+ default n
+ if BSP_USING_PTMR
+ config BSP_PTMR_IRQ_PRIORITY
+ int "PTMR Interrupt Priority"
+ range 1 7
+ default 1
+ endif
endif
menuconfig BSP_USING_I2C
@@ -496,7 +559,6 @@ menu "On-chip Peripheral Drivers"
endif
endif
-
menuconfig BSP_USING_XPI_FLASH
bool "Enable XPI FLASH"
default n
@@ -539,7 +601,6 @@ menu "On-chip Peripheral Drivers"
default n
endif
-
menuconfig BSP_USING_EWDG
bool "Enable EWDG"
default n
@@ -556,7 +617,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_PWMV2
bool "Enable PWM"
default n
- select RT_USING_PWM if BSP_USING_PWMV2
+ select RT_USING_PWM
menuconfig BSP_USING_MCAN
bool "Enable MCAN"
@@ -604,7 +665,7 @@ menu "On-chip Peripheral Drivers"
menuconfig BSP_USING_ADC
bool "Enable ADC"
default n
- select RT_USING_ADC if BSP_USING_ADC
+ select RT_USING_ADC
if BSP_USING_ADC
menuconfig BSP_USING_ADC16
bool "Enable ADC16"
@@ -622,13 +683,362 @@ menu "On-chip Peripheral Drivers"
config BSP_USING_ADC3
bool "Enable ADC3"
default n
+ config BSP_USING_ADC1
+ bool "Enable ADC1"
+ default n
+ config BSP_USING_ADC2
+ bool "Enable ADC2"
+ default n
endif
endif
+ menuconfig BSP_USING_WDG
+ bool "Enable WDG"
+ default n
+ select RT_USING_WDT if BSP_USING_WDG
+
+ menuconfig BSP_USING_CRC
+ bool "Enable CRC"
+ default n
+
+ menuconfig BSP_USING_TSNS
+ bool "Enable TSNS (Temperature Sensor)"
+ default n
+
+ menuconfig BSP_USING_ACMP
+ bool "Enable ACMP (Analog Comparator)"
+ default n
+
+ menuconfig BSP_USING_DAC
+ bool "Enable DAC"
+ default n
+
+ menuconfig BSP_USING_QEIV2
+ bool "Enable QEIV2 (Quadrature Encoder Interface V2)"
+ default n
+
+ menuconfig BSP_USING_QEOV2
+ bool "Enable QEOV2 (Quadrature Encoder Output V2)"
+ default n
+
+ menuconfig BSP_USING_RDC
+ bool "Enable RDC (Resolver to Digital Converter)"
+ default n
+
+ menuconfig BSP_USING_SEI
+ bool "Enable SEI (Synchronous Encoder Interface)"
+ default n
+
+ menuconfig BSP_USING_MTGV2
+ bool "Enable MTGV2 (Motor Timing Generator V2)"
+ default n
+
+ menuconfig BSP_USING_VSC
+ bool "Enable VSC"
+ default n
+
+ menuconfig BSP_USING_CLC
+ bool "Enable CLC"
+ default n
+
+ menuconfig BSP_USING_SDM
+ bool "Enable SDM (Sigma-Delta Modulator)"
+ default n
+
+ menuconfig BSP_USING_PLB
+ bool "Enable PLB"
+ default n
+
+ menuconfig BSP_USING_PPI
+ bool "Enable PPI (Parallel Port Interface)"
+ default n
+
+ menuconfig BSP_USING_LOBS
+ bool "Enable LOBS"
+ default n
+
+ menuconfig BSP_USING_PTPC
+ bool "Enable PTPC (PTP Controller)"
+ default n
+
+ menuconfig BSP_USING_RNG
+ bool "Enable RNG (Random Number Generator)"
+ default n
+
+ menuconfig BSP_USING_SDP
+ bool "Enable SDP (Secure Data Processing)"
+ default n
+
+ menuconfig BSP_USING_MCHTMR
+ bool "Enable MCHTMR (Machine Timer)"
+ default n
+
+ menuconfig BSP_USING_SOFT_I2C
+ bool "Enable Software I2C"
+ default n
+ select RT_USING_I2C if BSP_USING_SOFT_I2C
+ if BSP_USING_SOFT_I2C
+
+ config BSP_USING_SOFT_I2C_TIMING_DELAY_US
+ int "Soft I2C timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_I2C_TIMING_TIMEOUT
+ int "Soft I2C timing timeout"
+ range 10 10000
+ default 100
+
+ config BSP_USING_SOFT_I2C0
+ bool "Enable Soft I2C0"
+ default n
+ if BSP_USING_SOFT_I2C0
+ config BSP_SOFT_I2C0_SCL_PIN
+ string "Soft I2C0 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C0_SDA_PIN
+ string "Soft I2C0 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C1
+ bool "Enable Soft I2C1"
+ default n
+ if BSP_USING_SOFT_I2C1
+ config BSP_SOFT_I2C1_SCL_PIN
+ string "Soft I2C1 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C1_SDA_PIN
+ string "Soft I2C1 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C2
+ bool "Enable Soft I2C2"
+ default n
+ if BSP_USING_SOFT_I2C2
+ config BSP_SOFT_I2C2_SCL_PIN
+ string "Soft I2C2 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C2_SDA_PIN
+ string "Soft I2C2 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C3
+ bool "Enable Soft I2C3"
+ default n
+ if BSP_USING_SOFT_I2C3
+ config BSP_SOFT_I2C3_SCL_PIN
+ string "Soft I2C3 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C3_SDA_PIN
+ string "Soft I2C3 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C4
+ bool "Enable Soft I2C4"
+ default n
+ if BSP_USING_SOFT_I2C4
+ config BSP_SOFT_I2C4_SCL_PIN
+ string "Soft I2C4 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C4_SDA_PIN
+ string "Soft I2C4 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C5
+ bool "Enable Soft I2C5"
+ default n
+ if BSP_USING_SOFT_I2C5
+ config BSP_SOFT_I2C5_SCL_PIN
+ string "Soft I2C5 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C5_SDA_PIN
+ string "Soft I2C5 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C6
+ bool "Enable Soft I2C6"
+ default n
+ if BSP_USING_SOFT_I2C6
+ config BSP_SOFT_I2C6_SCL_PIN
+ string "Soft I2C6 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C6_SDA_PIN
+ string "Soft I2C6 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C7
+ bool "Enable Soft I2C7"
+ default n
+ if BSP_USING_SOFT_I2C7
+ config BSP_SOFT_I2C7_SCL_PIN
+ string "Soft I2C7 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C7_SDA_PIN
+ string "Soft I2C7 SDA pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_I2C8
+ bool "Enable Soft I2C8"
+ default n
+ if BSP_USING_SOFT_I2C8
+ config BSP_SOFT_I2C8_SCL_PIN
+ string "Soft I2C8 SCL pin name"
+ default "None"
+ config BSP_SOFT_I2C8_SDA_PIN
+ string "Soft I2C8 SDA pin name"
+ default "None"
+ endif
+
+ endif
+
+ menuconfig BSP_USING_SOFT_SPI
+ bool "Enable Software SPI"
+ default n
+ select RT_USING_SPI if BSP_USING_SOFT_SPI
+ select RT_USING_PIN if BSP_USING_SOFT_SPI
+ select RT_USING_SPI_BITOPS if BSP_USING_SOFT_SPI
+ if BSP_USING_SOFT_SPI
+
+ config BSP_USING_SOFT_SPI_TIMING_DELAY_US
+ int "Soft SPI timing delay in microseconds"
+ range 1 1000
+ default 1
+
+ config BSP_USING_SOFT_SPI0
+ bool "Enable Soft SPI0"
+ default n
+ if BSP_USING_SOFT_SPI0
+ config BSP_SOFT_SPI0_SCK_PIN
+ string "Soft SPI0 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MOSI_PIN
+ string "Soft SPI0 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI0_MISO_PIN
+ string "Soft SPI0 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI1
+ bool "Enable Soft SPI1"
+ default n
+ if BSP_USING_SOFT_SPI1
+ config BSP_SOFT_SPI1_SCK_PIN
+ string "Soft SPI1 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MOSI_PIN
+ string "Soft SPI1 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI1_MISO_PIN
+ string "Soft SPI1 MISO pin name"
+ default "None"
+ endif
+
+ config BSP_USING_SOFT_SPI2
+ bool "Enable Soft SPI2"
+ default n
+ if BSP_USING_SOFT_SPI2
+ config BSP_SOFT_SPI2_SCK_PIN
+ string "Soft SPI2 SCK pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MOSI_PIN
+ string "Soft SPI2 MOSI pin name"
+ default "None"
+ config BSP_SOFT_SPI2_MISO_PIN
+ string "Soft SPI2 MISO pin name"
+ default "None"
+ endif
+
+ endif
+
+endmenu
+
+menu "HPMicro Interrupt Config"
endmenu
+menu "HPMicro RT-Thread Interrupt Framework"
+endmenu
+menu "HPMicro Use Generic Startup Implementation"
+ config HPM_BSP_USING_GENERIC_STARTUP
+ bool "Enable this to use the common/startup/generic implementation"
+ default n
+ depends on HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ help
+ Enable this to use the common/startup/generic implementation.
+ This option is only available when RT-Thread Interrupt Framework is enabled.
+endmenu
+menu "HPMicro RT-Thread backtrace configuration (experimental)"
+ config HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Enable RT-Thread Backtrace for HPMicro BSP"
+ default n
+ help
+ Enable RT-Thread Backtrace to support backtrace feature
+ config HPM_USE_RTTHREAD_BACKTRACE_IN_EXCEPTION_HANDLER
+ select HPM_ENABLE_RTTHREAD_BACKTRACE_PORT
+ bool "Use RT-Thread Backtrace in Exception Handler"
+ default n
+ help
+ Use RT-Thread Backtrace in Exception Handler to print backtrace information
+endmenu
+
+endmenu
+
+menu "Third-Party Add-ons"
+
+menu "Segger SystemView Config"
+ config BSP_USING_SYSTEMVIEW
+ select RT_USING_SYSTEMVIEW
+ select RT_USING_LEGACY
+ bool "Enable Segger SystemView"
+ default n
+
+ if BSP_USING_SYSTEMVIEW
+ menuconfig BSP_SYSTEMVIEW_RTT_SECTION
+ bool "enable SystemView RTT section"
+ default y
+ if BSP_SYSTEMVIEW_RTT_SECTION
+ config SEGGER_RTT_SECTION
+ string "segger rtt section"
+ default ".noncacheable.bss"
+ config SEGGER_RTT_BUFFER_SECTION
+ string "segger rtt buffer section"
+ default ".noncacheable.bss"
+ config SEGGER_SYSVIEW_SECTION
+ string "segger sysview section"
+ default ".noncacheable.bss"
+ endif
+ endif
endmenu
+menu "RT-Thread Insight Config"
+ config BSP_USING_RTI
+ select BSP_USING_MCHTMR
+ select RT_USING_RTI
+ select RT_USING_RT_TUNNEL
+ bool "Enable RT-Thread Insight(experimental)"
+ default n
+
+ if BSP_USING_RTI
+ config RT_TUNNEL_USE_NONCACHE_RAM
+ bool "Enable RT-Thread Insight Non-cacheable RAM support"
+ default y
+ help
+ Enable this to use non-cacheable RAM for RT-Thread Insight data transfer.
+ This option is useful when RT-Thread Insight is used with cache enabled.
+
+ endif
+
+endmenu
+
+endmenu
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/boards/hpm6p00evk.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/boards/hpm6p00evk.cfg
index 9e3359ae885a..2dc61768c2fa 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/boards/hpm6p00evk.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/boards/hpm6p00evk.cfg
@@ -51,23 +51,10 @@
flash bank xpi0 hpm_xpi 0x80000000 0x2000000 1 1 $_TARGET0 0xF3000000 0x5 0x1000
proc init_clock {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x1
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4002000
- $::_TARGET0 riscv dmi_write 0x3C 0x2
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000800
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000810
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000820
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
-
- $::_TARGET0 riscv dmi_write 0x39 0xF4000830
- $::_TARGET0 riscv dmi_write 0x3C 0xFFFFFFFF
+ mww 0xF4000800 0xFFFFFFFF
+ mww 0xF4000810 0xFFFFFFFF
+ mww 0xF4000820 0xFFFFFFFF
+ mww 0xF4000830 0xFFFFFFFF
echo "clocks has been enabled!"
}
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
index b9ae11210446..0aa1eed3dad5 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/cmsis_dap.cfg
@@ -1,8 +1,8 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
bindto 0.0.0.0
-adapter speed 10000
+adapter speed 8000
adapter srst delay 500
source [find interface/cmsis-dap.cfg]
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft2232.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft2232.cfg
index 580d98ef853f..39cc8580f9bd 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft2232.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft2232.cfg
@@ -1,10 +1,8 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
bindto 0.0.0.0
adapter speed 10000
-reset_config trst_and_srst
-adapter srst delay 50
adapter driver ftdi
ftdi_vid_pid 0x0403 0x6010
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft232.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft232.cfg
index 4fb0fba2e70e..e2c01a2d7883 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft232.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/ft232.cfg
@@ -1,4 +1,4 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
bindto 0.0.0.0
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/jlink.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/jlink.cfg
index fd8f04428c9b..5d565c0ecc31 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/jlink.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/jlink.cfg
@@ -1,4 +1,4 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
bindto 0.0.0.0
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
index e9d6e6d69848..a9421a838779 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/probes/nds_aice_micro.cfg
@@ -1,4 +1,4 @@
-# Copyright 2021 hpmicro
+# Copyright (c) 2021 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
bindto 0.0.0.0
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-dual-core.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-dual-core.cfg
index a3f2ee73f0c3..877324c042b2 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-dual-core.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-dual-core.cfg
@@ -1,9 +1,12 @@
-# Copyright (c) 2024 HPMicro
+# Copyright (c) 2024-2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
#
-
-set _CHIP hpm6p00
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6p00
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -14,39 +17,18 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-# source [find soc/hpm_common_csr.cfg]
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
-proc dmi_write {reg value} {
- $::_TARGET0 riscv dmi_write ${reg} ${value}
-}
-
-proc dmi_read {reg} {
- set v [$::_TARGET0 riscv dmi_read ${reg}]
- return ${v}
-}
-proc dmi_write_memory {addr value} {
- dmi_write 0x39 ${addr}
- dmi_write 0x3C ${value}
-}
-
-proc dmi_read_memory {addr} {
- set sbcs [expr { 0x100000 | [dmi_read 0x38] }]
- dmi_write 0x38 ${sbcs}
- dmi_write 0x39 ${addr}
- set value [dmi_read 0x3C]
- return ${value}
-}
proc release_core1 {} {
- dmi_write_memory 0xF4002C00 0x1000
+ sba_write_mem 0xF4002C00 0x1000
}
set _TARGET1 $_CHIP.cpu1
target create $_TARGET1 riscv -chain-position $_CHIP.cpu -coreid 1
$_TARGET1 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-area-backup 0
-# source [find soc/hpm_common_csr.cfg]
-
$_TARGET1 configure -event examine-start {
release_core1
}
@@ -57,11 +39,9 @@ $_TARGET1 configure -event reset-deassert-pre {
}
$_TARGET0 configure -event reset-end {
- $::_TARGET0 riscv dmi_write 0x39 0xF4002010
- $::_TARGET0 riscv dmi_write 0x3C 0x2
+ sba_write_mem 0xF4002010 0x2
}
proc reset_soc {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF410001C
- $::_TARGET0 riscv dmi_write 0x3C 24000000
+ sba_write_mem 0xF410001C 24000000
}
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-single-core.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-single-core.cfg
index e370159ab6fe..2a1a8e04117a 100644
--- a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-single-core.cfg
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm6p80-single-core.cfg
@@ -1,7 +1,11 @@
-# Copyright (c) 2024 HPMicro
+# Copyright (c) 2024-2025 HPMicro
# SPDX-License-Identifier: BSD-3-Clause
-set _CHIP hpm6p00
+if { [info exists CHIPNAME] } {
+ set _CHIP $CHIPNAME
+} else {
+ set _CHIP hpm6p00
+}
set _CPUTAPID 0x1000563D
jtag newtap $_CHIP cpu -irlen 5 -expected-id $_CPUTAPID
@@ -12,9 +16,10 @@ $_TARGET0 configure -work-area-phys 0x00000000 -work-area-size 0x20000 -work-are
targets $_TARGET0
-# source [find soc/hpm_common_csr.cfg]
+source [file join [file dirname [info script]] hpm_common.cfg]
+source [file join [file dirname [info script]] hpm_common_csr.cfg]
+
proc reset_soc {} {
- $::_TARGET0 riscv dmi_write 0x39 0xF410001C
- $::_TARGET0 riscv dmi_write 0x3C 24000000
+ sba_write_mem 0xF410001C 24000000
}
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
new file mode 100644
index 000000000000..ae9233e5e5b2
--- /dev/null
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common.cfg
@@ -0,0 +1,29 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+source [file join [file dirname [info script]] hpm_reset.cfg]
+
+set dmsbcs 0x38
+set dmsbaddress0 0x39
+set dmsbdata0 0x3C
+
+proc target0_dmi_write_reg {reg value} {
+ $::_TARGET0 riscv dmi_write ${reg} ${value}
+}
+
+proc target0_dmi_read_reg {reg} {
+ set v [$::_TARGET0 riscv dmi_read ${reg}]
+ return ${v}
+}
+proc sba_write_mem {addr value} {
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ target0_dmi_write_reg $::dmsbdata0 ${value}
+}
+
+proc sba_read_mem {addr} {
+ set sbcs [expr { 0x100000 | [target0_dmi_read_reg $::dmsbcs] }]
+ target0_dmi_write_reg $::dmsbcs ${sbcs}
+ target0_dmi_write_reg $::dmsbaddress0 ${addr}
+ set value [target0_dmi_read_reg $::dmsbdata0]
+ return ${value}
+}
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
new file mode 100644
index 000000000000..4f4b6dcd86a1
--- /dev/null
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr.cfg
@@ -0,0 +1,101 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# mslideleg
+riscv expose_csrs 2005
+# mclk_ctl
+riscv expose_csrs 2015
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# slie
+riscv expose_csrs 2500
+# slip
+riscv expose_csrs 2501
+# sdcause
+riscv expose_csrs 2505
+# scctldata
+riscv expose_csrs 2509
+# scounterinten
+riscv expose_csrs 2511
+# scountermask_m
+riscv expose_csrs 2513
+# scountermask_s
+riscv expose_csrs 2514
+# scountermask_u
+riscv expose_csrs 2515
+# scounterovf
+riscv expose_csrs 2516
+# scountinhibit
+riscv expose_csrs 2528
+# shpmevent3
+riscv expose_csrs 2531
+# shpmevent4
+riscv expose_csrs 2532
+# shpmevent5
+riscv expose_csrs 2533
+# shpmevent6
+riscv expose_csrs 2534
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
new file mode 100644
index 000000000000..096cee06355e
--- /dev/null
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_common_csr_lite.cfg
@@ -0,0 +1,69 @@
+# Copyright (c) 2024 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+# expose non-standard csr registers
+# milmb
+riscv expose_csrs 1984
+# mdlmb
+riscv expose_csrs 1985
+# mecc_code
+riscv expose_csrs 1986
+# mnvec
+riscv expose_csrs 1987
+# mxstatus
+riscv expose_csrs 1988
+# mpft_ctl
+riscv expose_csrs 1989
+# mhsp_ctl
+riscv expose_csrs 1990
+# msp_bound
+riscv expose_csrs 1991
+# msp_base
+riscv expose_csrs 1992
+# mdcause
+riscv expose_csrs 1993
+# mcache_ctl
+riscv expose_csrs 1994
+# mcctlbeginaddr
+riscv expose_csrs 1995
+# mcctlcommand
+riscv expose_csrs 1996
+# mcctldata
+riscv expose_csrs 1997
+# mcounterwen
+riscv expose_csrs 1998
+# mcounterinten
+riscv expose_csrs 1999
+# mmisc_ctl
+riscv expose_csrs 2000
+# mcountermask_m
+riscv expose_csrs 2001
+# mcountermask_s
+riscv expose_csrs 2002
+# mcountermask_u
+riscv expose_csrs 2003
+# mcounterovf
+riscv expose_csrs 2004
+# dexc2dbg
+riscv expose_csrs 2016
+# ddcause
+riscv expose_csrs 2017
+# uitb
+riscv expose_csrs 2048
+# ucode
+riscv expose_csrs 2049
+# udcause
+riscv expose_csrs 2057
+# ucctlbeginaddr
+riscv expose_csrs 2059
+# ucctlcommand
+riscv expose_csrs 2060
+# micm_cfg
+riscv expose_csrs 4032
+# mdcm_cfg
+riscv expose_csrs 4033
+# mmsc_cfg
+riscv expose_csrs 4034
+# mmsc_cfg2
+riscv expose_csrs 4035
+
diff --git a/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
new file mode 100644
index 000000000000..681c59954789
--- /dev/null
+++ b/bsp/hpmicro/hpm6p00evk/board/debug_scripts/openocd/soc/hpm_reset.cfg
@@ -0,0 +1,9 @@
+# Copyright (c) 2025 HPMicro
+# SPDX-License-Identifier: BSD-3-Clause
+
+$_TARGET0 configure -event reset-deassert-pre {
+ sleep 1
+ if {$halt} {
+ $::_TARGET0 arp_halt
+ }
+}
diff --git a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt.ld b/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt.ld
index 8dc4e5efc8d6..acb9bb4829f9 100644
--- a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt.ld
+++ b/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt.ld
@@ -28,6 +28,15 @@ __app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
SECTIONS
{
+ /* Anchor the lowest LMA at the flash base address (0x80000000): objcopy takes the
+ * lowest LMA as the start address of the generated .bin, so without this marker the
+ * .bin starts at .nor_cfg_option (0x80000400). The value is all ones (erased flash),
+ * so programming it does not change the flash state.
+ */
+ .flash_base ORIGIN(XPI0) : {
+ LONG(0xFFFFFFFF)
+ } > XPI0
+
.nor_cfg_option __nor_cfg_option_load_addr__ : {
KEEP(*(.nor_cfg_option))
} > XPI0
@@ -175,7 +184,7 @@ SECTIONS
KEEP(*(.fast_ram))
} > DLM
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
+ __fast_ram_init_load_addr__ = __noncacheable_init_load_addr__ + SIZEOF(.noncacheable.init);
.fast_ram.init : AT(__fast_ram_init_load_addr__) {
. = ALIGN(8);
__fast_ram_init_start__ = .;
@@ -185,6 +194,15 @@ SECTIONS
. = ALIGN(8);
} > DLM
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
@@ -276,7 +294,7 @@ SECTIONS
PROVIDE (_edata = .);
PROVIDE (edata = .);
} > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
+ __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
__fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
@@ -304,7 +322,7 @@ SECTIONS
PROVIDE( __rt_rvstack = . );
} > AXI_SRAM
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
+ __noncacheable_init_load_addr__ = __fast_load_addr__ + SIZEOF(.fast);
.noncacheable.init : AT(__noncacheable_init_load_addr__) {
. = ALIGN(8);
__noncacheable_init_start__ = .;
diff --git a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt_enet.ld b/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
deleted file mode 100644
index 5790d33157ad..000000000000
--- a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/flash_rtt_enet.ld
+++ /dev/null
@@ -1,355 +0,0 @@
-/*
- * Copyright 2021-2025 HPMicro
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-ENTRY(_start)
-
-STACK_SIZE = DEFINED(_stack_size) ? _stack_size : 0x4000;
-HEAP_SIZE = DEFINED(_heap_size) ? _heap_size : 32K;
-FLASH_SIZE = DEFINED(_flash_size) ? _flash_size : 1M;
-NONCACHEABLE_SIZE = DEFINED(_noncacheable_size) ? _noncacheable_size : 128K;
-
-MEMORY
-{
- XPI0 (rx) : ORIGIN = 0x80000000, LENGTH = FLASH_SIZE
- ILM (wx) : ORIGIN = 0, LENGTH = 128K
- DLM (w) : ORIGIN = 0x00200000, LENGTH = 128K
- NONCACHEABLE_RAM (wx) : ORIGIN = 0x01200000, LENGTH = NONCACHEABLE_SIZE
- AXI_SRAM (wx) : ORIGIN = 0x01220000, LENGTH = 128K
- AHB_SRAM (w): ORIGIN = 0xF0200000, LENGTH = 32k
-}
-
-__nor_cfg_option_load_addr__ = ORIGIN(XPI0) + 0x400;
-__boot_header_load_addr__ = ORIGIN(XPI0) + 0x1000;
-__app_load_addr__ = ORIGIN(XPI0) + 0x3000;
-__boot_header_length__ = __boot_header_end__ - __boot_header_start__;
-__app_offset__ = __app_load_addr__ - __boot_header_load_addr__;
-
-SECTIONS
-{
- .nor_cfg_option __nor_cfg_option_load_addr__ : {
- KEEP(*(.nor_cfg_option))
- } > XPI0
-
- .boot_header __boot_header_load_addr__ : {
- __boot_header_start__ = .;
- KEEP(*(.boot_header))
- KEEP(*(.fw_info_table))
- KEEP(*(.dc_info))
- __boot_header_end__ = .;
- } > XPI0
-
- .start __app_load_addr__ : {
- . = ALIGN(8);
- KEEP(*(.start))
- . = ALIGN(16);
- } > XPI0
-
- __vector_load_addr__ = ADDR(.start) + SIZEOF(.start);
- .vectors : AT(__vector_load_addr__) {
- . = ALIGN(16);
- __vector_ram_start__ = .;
- KEEP(*(.vector_table))
- KEEP(*(.isr_vector))
-
- . = ALIGN(16);
- __vector_ram_end__ = .;
- } > ILM
-
- .fast : AT(__fast_load_addr__) {
- . = ALIGN(16);
- __ramfunc_start__ = .;
- *(.fast)
- *(.fast.*)
- . = ALIGN(16);
-
- /* RT-Thread Core Start */
- KEEP(*context_gcc.o(.text* .rodata*))
- KEEP(*port*.o (.text .text* .rodata .rodata*))
- KEEP(*interrupt_gcc.o (.text .text* .rodata .rodata*))
- KEEP(*trap_common.o (.text .text* .rodata .rodata*))
- KEEP(*irq.o (.text .text* .rodata .rodata*))
- KEEP(*clock.o (.text .text* .rodata .rodata*))
- KEEP(*kservice.o (.text .text* .rodata .rodata*))
- KEEP(*scheduler*.o (.text .text* .rodata .rodata*))
- KEEP(*trap*.o (.text .text* .rodata .rodata*))
- KEEP(*idle.o (.text .text* .rodata .rodata*))
- KEEP(*ipc.o (.text .text* .rodata .rodata*))
- KEEP(*slab.o (.text .text* .rodata .rodata*))
- KEEP(*thread.o (.text .text* .rodata .rodata*))
- KEEP(*object.o (.text .text* .rodata .rodata*))
- KEEP(*timer.o (.text .text* .rodata .rodata*))
- KEEP(*mem.o (.text .text* .rodata .rodata*))
- KEEP(*memheap.o (.text .text* .rodata .rodata*))
- KEEP(*mempool.o (.text .text* .rodata .rodata*))
- /* RT-Thread Core End */
-
- /* HPMicro Driver Wrapper */
- KEEP(*drv_*.o (.text .text* .rodata .rodata*))
- KEEP(*api_lib*.o (.text .text* .rodata .rodata*))
- KEEP(*api_msg*.o (.text .text* .rodata .rodata*))
- KEEP(*if_api*.o (.text .text* .rodata .rodata*))
- KEEP(*netbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*netdb*.o (.text .text* .rodata .rodata*))
- KEEP(*netifapi*.o (.text .text* .rodata .rodata*))
- KEEP(*sockets*.o (.text .text* .rodata .rodata*))
- KEEP(*tcpip*.o (.text .text* .rodata .rodata*))
- KEEP(*inet_chksum*.o (.text .text* .rodata .rodata*))
- KEEP(*memp*.o (.text .text* .rodata .rodata*))
- KEEP(*netif*.o (.text .text* .rodata .rodata*))
- KEEP(*pbuf*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_in*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp_out*.o (.text .text* .rodata .rodata*))
- KEEP(*tcp*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernet*.o (.text .text* .rodata .rodata*))
- KEEP(*ethernetif*.o (.text .text* .rodata .rodata*))
-
- . = ALIGN(16);
- __ramfunc_end__ = .;
- } > ILM
-
- .text (__vector_load_addr__ + SIZEOF(.vectors)) : {
- . = ALIGN(16);
- *(.text)
- *(.text*)
- *(.rodata)
- *(.rodata*)
- *(.srodata)
- *(.srodata*)
-
- *(.hash)
- *(.dyn*)
- *(.gnu*)
- *(.pl*)
-
- KEEP(*(.eh_frame))
- *(.eh_frame*)
-
- KEEP (*(.init))
- KEEP (*(.fini))
- . = ALIGN(8);
-
- /*********************************************
- *
- * RT-Thread related sections - Start
- *
- *********************************************/
- /* section information for finsh shell */
- . = ALIGN(4);
- __fsymtab_start = .;
- KEEP(*(FSymTab))
- __fsymtab_end = .;
- . = ALIGN(4);
- __vsymtab_start = .;
- KEEP(*(VSymTab))
- __vsymtab_end = .;
- . = ALIGN(4);
-
- . = ALIGN(4);
- __rt_init_start = .;
- KEEP(*(SORT(.rti_fn*)))
- __rt_init_end = .;
- . = ALIGN(4);
-
- /* section information for modules */
- . = ALIGN(4);
- __rtmsymtab_start = .;
- KEEP(*(RTMSymTab))
- __rtmsymtab_end = .;
-
- /* RT-Thread related sections - end */
-
- /* section information for usbh class */
- . = ALIGN(8);
- __usbh_class_info_start__ = .;
- KEEP(*(.usbh_class_info))
- __usbh_class_info_end__ = .;
-
- } > XPI0
-
-
- .eh_frame :
- {
- __eh_frame_start = .;
- KEEP(*(.eh_frame))
- __eh_frame_end = .;
- } > XPI0
-
- .eh_frame_hdr :
- {
- KEEP(*(.eh_frame_hdr))
- } > XPI0
- __eh_frame_hdr_start = SIZEOF(.eh_frame_hdr) > 0 ? ADDR(.eh_frame_hdr) : 0;
- __eh_frame_hdr_end = SIZEOF(.eh_frame_hdr) > 0 ? . : 0;
-
- .rel : {
- KEEP(*(.rel*))
- } > XPI0
-
- PROVIDE (__etext = .);
- PROVIDE (_etext = .);
- PROVIDE (etext = .);
-
- .fast_ram (NOLOAD) : {
- KEEP(*(.fast_ram))
- } > DLM
-
- __fast_ram_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init);
- .fast_ram.init : AT(__fast_ram_init_load_addr__) {
- . = ALIGN(8);
- __fast_ram_init_start__ = .;
- KEEP(*(.fast_ram.init))
- KEEP(*(.fast_ram.init.*))
- __fast_ram_init_end__ = .;
- . = ALIGN(8);
- } > DLM
-
- .bss(NOLOAD) : {
- . = ALIGN(8);
- __bss_start__ = .;
- *(.bss)
- *(.bss*)
- *(.sbss*)
- *(.scommon)
- *(.scommon*)
- *(.dynsbss*)
- *(COMMON)
- . = ALIGN(8);
- _end = .;
- __bss_end__ = .;
- } > AXI_SRAM
-
- /* Note: the .tbss and .tdata section should be adjacent */
- .tbss(NOLOAD) : {
- . = ALIGN(8);
- __tbss_start__ = .;
- *(.tbss*)
- *(.gnu.linkonce.tb.*)
- *(.tcommon*)
- _end = .;
- __tbss_end__ = .;
- } > AXI_SRAM
-
- __tdata_load_addr__ = etext;
- .tdata : AT(__tdata_load_addr__) {
- . = ALIGN(8);
- __tdata_start__ = .;
- __thread_pointer = .;
- *(.tdata)
- *(.tdata*)
- *(.gnu.linkonce.td.*)
- . = ALIGN(8);
- __tdata_end__ = .;
- } > AXI_SRAM
-
- __data_load_addr__ = etext + SIZEOF(.tdata);
- .data : AT(__data_load_addr__) {
- . = ALIGN(8);
- __data_start__ = .;
- __global_pointer$ = . + 0x800;
- *(.data)
- *(.data*)
- *(.sdata)
- *(.sdata*)
-
- KEEP(*(.jcr))
- KEEP(*(.dynamic))
- KEEP(*(.got*))
- KEEP(*(.got))
- KEEP(*(.gcc_except_table))
- KEEP(*(.gcc_except_table.*))
-
- . = ALIGN(8);
- PROVIDE(__preinit_array_start = .);
- KEEP(*(.preinit_array))
- PROVIDE(__preinit_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__init_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*)))
- KEEP(*(.init_array))
- PROVIDE(__init_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__fini_array_start = .);
- KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*)))
- KEEP(*(.fini_array))
- PROVIDE(__fini_array_end = .);
-
- . = ALIGN(8);
- PROVIDE(__ctors_start__ = .);
- KEEP(*crtbegin*.o(.ctors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .ctors))
- KEEP(*(SORT(.ctors.*)))
- KEEP(*(.ctors))
- PROVIDE(__ctors_end__ = .);
-
- . = ALIGN(8);
- KEEP(*crtbegin*.o(.dtors))
- KEEP(*(EXCLUDE_FILE (*crtend*.o) .dtors))
- KEEP(*(SORT(.dtors.*)))
- KEEP(*(.dtors))
- . = ALIGN(8);
- __data_end__ = .;
- PROVIDE (__edata = .);
- PROVIDE (_edata = .);
- PROVIDE (edata = .);
- } > AXI_SRAM
- __fast_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata);
-
- __fw_size__ = SIZEOF(.start) + SIZEOF(.vectors) + SIZEOF(.rel) + SIZEOF(.text) + SIZEOF(.data) + SIZEOF(.fast) + SIZEOF(.tdata) + SIZEOF(.noncacheable.init) + SIZEOF(.fast_ram.init) + SIZEOF(.eh_frame) + SIZEOF(.eh_frame_hdr);
-
-
-
- .heap(NOLOAD) : {
- . = ALIGN(8);
- __heap_start__ = .;
- . += HEAP_SIZE;
- __heap_end__ = .;
- } > AXI_SRAM
-
- .framebuffer (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.framebuffer))
- . = ALIGN(8);
- } > AXI_SRAM
-
- .stack(NOLOAD) : {
- . = ALIGN(8);
- __stack_base__ = .;
- . += STACK_SIZE;
- . = ALIGN(8);
- PROVIDE (_stack = .);
- PROVIDE (_stack_in_dlm = .);
- PROVIDE( __rt_rvstack = . );
- } > AXI_SRAM
-
- __noncacheable_init_load_addr__ = etext + SIZEOF(.data) + SIZEOF(.tdata) + SIZEOF(.fast);
- .noncacheable.init : AT(__noncacheable_init_load_addr__) {
- . = ALIGN(8);
- __noncacheable_init_start__ = .;
- KEEP(*(.noncacheable.init))
- __noncacheable_init_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .noncacheable.bss (NOLOAD) : {
- . = ALIGN(8);
- KEEP(*(.noncacheable))
- KEEP(*(.noncacheable.non_init))
- KEEP(*(.noncacheable.non_init.*))
- __noncacheable_bss_start__ = .;
- KEEP(*(.noncacheable.bss))
- KEEP(*(.noncacheable.bss.*))
- __noncacheable_bss_end__ = .;
- . = ALIGN(8);
- } > NONCACHEABLE_RAM
-
- .ahb_sram (NOLOAD) : {
- KEEP(*(.ahb_sram))
- } > AHB_SRAM
-
- __noncacheable_start__ = ORIGIN(NONCACHEABLE_RAM);
- __noncacheable_end__ = ORIGIN(NONCACHEABLE_RAM) + LENGTH(NONCACHEABLE_RAM);
-}
diff --git a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/ram_rtt.ld b/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/ram_rtt.ld
index 717bb0582748..05726ca78b0a 100644
--- a/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/ram_rtt.ld
+++ b/bsp/hpmicro/hpm6p00evk/board/linker_scripts/gcc/ram_rtt.ld
@@ -113,6 +113,16 @@ SECTIONS
. = ALIGN(8);
} > DLM
+
+ .fast_ram.bss (NOLOAD) : {
+ . = ALIGN(8);
+ __fast_ram_bss_start__ = .;
+ *(.fast_ram.bss)
+ *(.fast_ram.bss.*)
+ __fast_ram_bss_end__ = .;
+ . = ALIGN(8);
+ } > DLM
+
.bss(NOLOAD) : {
. = ALIGN(8);
__bss_start__ = .;
diff --git a/bsp/hpmicro/hpm6p00evk/board/pinmux.c b/bsp/hpmicro/hpm6p00evk/board/pinmux.c
index 00da125e993a..f2d4a5b1537a 100644
--- a/bsp/hpmicro/hpm6p00evk/board/pinmux.c
+++ b/bsp/hpmicro/hpm6p00evk/board/pinmux.c
@@ -50,7 +50,7 @@ void init_uart_pin_as_gpio(UART_Type *ptr)
}
}
-void init_i2c_pins(I2C_Type *ptr)
+hpm_stat_t init_i2c_pins(I2C_Type *ptr)
{
if (ptr == HPM_I2C3) { /* Codec */
HPM_IOC->PAD[IOC_PAD_PB07].FUNC_CTL = IOC_PB07_FUNC_CTL_I2C3_SCL | IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
@@ -63,8 +63,9 @@ void init_i2c_pins(I2C_Type *ptr)
HPM_IOC->PAD[IOC_PAD_PC29].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
HPM_IOC->PAD[IOC_PAD_PC28].PAD_CTL = IOC_PAD_PAD_CTL_OD_MASK;
} else {
- ;
+ return status_invalid_argument;
}
+ return status_success;
}
void init_femc_pins(void)
diff --git a/bsp/hpmicro/hpm6p00evk/board/pinmux.h b/bsp/hpmicro/hpm6p00evk/board/pinmux.h
index 66c226788da8..9f3d7ccfb2e3 100644
--- a/bsp/hpmicro/hpm6p00evk/board/pinmux.h
+++ b/bsp/hpmicro/hpm6p00evk/board/pinmux.h
@@ -13,7 +13,7 @@ extern "C" {
#endif
void init_uart_pins(UART_Type *ptr);
void init_uart_pin_as_gpio(UART_Type *ptr);
-void init_i2c_pins(I2C_Type *ptr);
+hpm_stat_t init_i2c_pins(I2C_Type *ptr);
void init_femc_pins(void);
void init_ppi_pins(void);
void init_sdm_pins(void);
diff --git a/bsp/hpmicro/hpm6p00evk/board/rtt_board.c b/bsp/hpmicro/hpm6p00evk/board/rtt_board.c
index a20fe8ea455f..cc36dc9d9bcd 100644
--- a/bsp/hpmicro/hpm6p00evk/board/rtt_board.c
+++ b/bsp/hpmicro/hpm6p00evk/board/rtt_board.c
@@ -40,14 +40,20 @@ void os_tick_config(void)
void rtt_board_init(void)
{
board_init_clock();
+
+ /* initialize memory system
+ * NOTE: this must happen before board_init_console(), because the SDK console_init()
+ * calls setvbuf(), which allocates through the C library malloc() -> rt_malloc() and
+ * therefore requires the RT-Thread heap to be ready. Otherwise RT_ASSERT() fires in
+ * rt_smem_alloc() whenever RT_USING_DEBUG is enabled.
+ */
+ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
+
board_init_console();
board_init_pmp();
dma_mgr_init();
- /* initialize memory system */
- rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END);
-
/* Configure the OS Tick */
os_tick_config();
@@ -121,11 +127,11 @@ void rt_hw_cpu_dcache_ops(int ops, void *addr, int size)
}
#endif
-uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
+uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb) /* motor system should be use clk_adc_src_ahb0 */
{
uint32_t freq = 0;
- if (ptr == (void *)HPM_ADC0) {
+ if (ptr == HPM_ADC0) {
clock_add_to_group(clock_adc0, 0);
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
@@ -136,7 +142,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
clock_set_source_divider(clock_ana0, clk_src_pll1_clk0, 4U);
}
freq = clock_get_frequency(clock_adc0);
- } else if (ptr == (void *)HPM_ADC1) {
+ } else if (ptr == HPM_ADC1) {
clock_add_to_group(clock_adc1, 0);
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
@@ -147,7 +153,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
clock_set_source_divider(clock_ana0, clk_src_pll1_clk0, 4U);
}
freq = clock_get_frequency(clock_adc1);
- } else if (ptr == (void *)HPM_ADC2) {
+ } else if (ptr == HPM_ADC2) {
clock_add_to_group(clock_adc2, 0);
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
@@ -158,7 +164,7 @@ uint32_t rtt_board_init_adc16_clock(void *ptr, bool clk_src_ahb) /* motor syste
clock_set_source_divider(clock_ana0, clk_src_pll1_clk0, 4U);
}
freq = clock_get_frequency(clock_adc2);
- } else if (ptr == (void *)HPM_ADC3) {
+ } else if (ptr == HPM_ADC3) {
clock_add_to_group(clock_adc3, 0);
if (clk_src_ahb) {
/* Configure the ADC clock from AHB (@200MHz by default)*/
diff --git a/bsp/hpmicro/hpm6p00evk/makefile.targets b/bsp/hpmicro/hpm6p00evk/makefile.targets
index e71da5a6e1e8..8469d7d2aaf3 100644
--- a/bsp/hpmicro/hpm6p00evk/makefile.targets
+++ b/bsp/hpmicro/hpm6p00evk/makefile.targets
@@ -3,4 +3,4 @@ clean2:
-$(RM) $(OBJS) *.elf
-@echo ' '
-*.elf: $(wildcard ../linkscripts/*/*.lds) $(wildcard ../linkscripts/*/*/*.lds)
\ No newline at end of file
+*.elf: $(wildcard board/linker_scripts/gcc/*.ld)
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6p00evk/rtconfig.h b/bsp/hpmicro/hpm6p00evk/rtconfig.h
index 908c7f404f70..7886de79293f 100644
--- a/bsp/hpmicro/hpm6p00evk/rtconfig.h
+++ b/bsp/hpmicro/hpm6p00evk/rtconfig.h
@@ -7,6 +7,16 @@
/* rt_vsnprintf options */
+#define RT_KLIBC_USING_VSNPRINTF_LONGLONG
+#define RT_KLIBC_USING_VSNPRINTF_STANDARD
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_EXPONENTIAL_SPECIFIERS
+#define RT_KLIBC_USING_VSNPRINTF_WRITEBACK_SPECIFIER
+#define RT_KLIBC_USING_VSNPRINTF_INTEGER_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_DECIMAL_BUFFER_SIZE 32
+#define RT_KLIBC_USING_VSNPRINTF_FLOAT_PRECISION 6
+#define RT_KLIBC_USING_VSNPRINTF_MAX_INTEGRAL_DIGITS_FOR_DECIMAL 9
+#define RT_KLIBC_USING_VSNPRINTF_LOG10_TAYLOR_TERMS 4
/* end of rt_vsnprintf options */
/* rt_vsscanf options */
@@ -108,7 +118,7 @@
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#define RT_USING_CONSOLE_OUTPUT_CTL
-#define RT_VER_NUM 0x50300
+#define RT_VER_NUM 0x50301
#define RT_BACKTRACE_LEVEL_MAX_NR 32
/* end of RT-Thread Kernel */
#define ARCH_RISCV
@@ -294,6 +304,10 @@
/* end of Kendryte SDK */
+/* MM32 HAL & SDK Drivers */
+
+/* end of MM32 HAL & SDK Drivers */
+
/* WCH HAL & SDK Drivers */
/* end of WCH HAL & SDK Drivers */
@@ -321,12 +335,24 @@
/* HPMicro SDK */
#define PKG_USING_HPM_SDK
-#define PKG_USING_HPM_SDK_V110
+#define PKG_USING_HPM_SDK_V113
/* end of HPMicro SDK */
+/* FM33 Drivers */
+
+/* end of FM33 Drivers */
+
/* FT32 HAL & SDK Drivers */
/* end of FT32 HAL & SDK Drivers */
+
+/* NOVOSNS Drivers */
+
+/* end of NOVOSNS Drivers */
+
+/* N32 Drivers */
+
+/* end of N32 Drivers */
/* end of HAL & SDK Drivers */
/* sensors drivers */
@@ -406,7 +432,7 @@
/* end of Arduino libraries */
/* end of RT-Thread online packages */
-#define SOC_HPM6P00_SERIES
+#define SOC_SERIES_HPM6P00
/* Hardware Drivers Config */
@@ -422,6 +448,29 @@
#define BSP_UART0_TX_BUFSIZE 0
#define BSP_UART0_IRQ_PRIORITY 1
/* end of On-chip Peripheral Drivers */
+
+/* HPMicro Interrupt Config */
+
+/* HPMicro RT-Thread Interrupt Framework */
+
+/* HPMicro Use Generic Startup Implementation */
+
+/* end of HPMicro Use Generic Startup Implementation */
+
+/* HPMicro RT-Thread backtrace configuration (experimental) */
+
+/* end of HPMicro RT-Thread backtrace configuration (experimental) */
/* end of Hardware Drivers Config */
+/* Third-Party Add-ons */
+
+/* Segger SystemView Config */
+
+/* end of Segger SystemView Config */
+
+/* RT-Thread Insight Config */
+
+/* end of RT-Thread Insight Config */
+/* end of Third-Party Add-ons */
+
#endif
diff --git a/bsp/hpmicro/hpm6p00evk/rtconfig.py b/bsp/hpmicro/hpm6p00evk/rtconfig.py
index accc54ed8c1c..52990f6b60bf 100644
--- a/bsp/hpmicro/hpm6p00evk/rtconfig.py
+++ b/bsp/hpmicro/hpm6p00evk/rtconfig.py
@@ -3,7 +3,6 @@
import os
import sys
-import rtconfig
if os.getenv('RTT_ROOT'):
@@ -11,7 +10,7 @@
else:
RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..')
-sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')]
+sys.path.insert(0, os.path.join(RTT_ROOT, 'tools'))
# toolchains options
ARCH='risc-v'
@@ -59,9 +58,13 @@
else:
EXEC_PATH = r'/opt/riscv-gnu-gcc/bin'
else:
- print("CROSS_TOOL = {} not yet supported" % CROSS_TOOL)
+ print("CROSS_TOOL = {} not yet supported, only gcc is supported".format(CROSS_TOOL))
+ exit(-1)
-BUILD = 'flash_debug'
+if os.getenv('RTT_BUILD_TYPE'):
+ BUILD = os.getenv('RTT_BUILD_TYPE')
+else:
+ BUILD = 'flash_debug'
if PLATFORM == 'gcc':
PREFIX = 'riscv32-unknown-elf-'
@@ -81,7 +84,7 @@
DEVICE = ARCH_ABI + ' -DUSE_NONVECTOR_MODE=1 ' + ' -ffunction-sections -fdata-sections -fno-common '
CFLAGS = DEVICE
AFLAGS = CFLAGS
- LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -u _printf_float -u _scanf_float -nostartfiles -Wl,--gc-sections '
+ LFLAGS = ARCH_ABI + ' --specs=nano.specs --specs=nosys.specs -nostartfiles -Wl,--gc-sections '
CPATH = ''
LPATH = ''
@@ -89,8 +92,8 @@
if BUILD == 'ram_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
LINKER_FILE = 'board/linker_scripts/gcc/ram_rtt.ld'
elif BUILD == 'ram_release':
CFLAGS += ' -O2'
@@ -99,8 +102,8 @@
elif BUILD == 'flash_debug':
CFLAGS += ' -gdwarf-2'
AFLAGS += ' -gdwarf-2'
- CFLAGS += ' -O0'
- LFLAGS += ' -O0'
+ CFLAGS += ' -Og'
+ LFLAGS += ' -Og'
CFLAGS += ' -DFLASH_XIP=1'
LINKER_FILE = 'board/linker_scripts/gcc/flash_rtt.ld'
elif BUILD == 'flash_release':
diff --git a/bsp/hpmicro/hpm6p00evk/rtconfig_preinc.h b/bsp/hpmicro/hpm6p00evk/rtconfig_preinc.h
index b7ae18b32666..a21f4c7482bd 100644
--- a/bsp/hpmicro/hpm6p00evk/rtconfig_preinc.h
+++ b/bsp/hpmicro/hpm6p00evk/rtconfig_preinc.h
@@ -6,8 +6,7 @@
/* RT-Thread pre-include file */
#define D45
-#define HPM6880
-#define HPM6E80
+#define HPM6P81
#define HPMSOC_HAS_HPMSDK_DMAV2
#define RT_USING_LIBC
#define RT_USING_NEWLIBC
diff --git a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/startup.c b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/startup.c
index e3f85a9e0ee0..78705526d884 100644
--- a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/startup.c
+++ b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/startup.c
@@ -54,6 +54,8 @@ __attribute__((weak)) void c_startup(void)
extern uint8_t __noncacheable_bss_start__[], __noncacheable_bss_end__[];
extern uint8_t __ramfunc_start__[], __ramfunc_end__[];
extern uint8_t __noncacheable_init_start__[], __noncacheable_init_end__[];
+ extern uint8_t __fast_ram_bss_start__[], __fast_ram_bss_end__[];
+ extern uint8_t __fast_ram_init_start__[], __fast_ram_init_end__[], __fast_ram_init_load_addr__[];
/* tbss section */
size = __tbss_end__ - __tbss_start__;
@@ -96,6 +98,18 @@ __attribute__((weak)) void c_startup(void)
for (i = 0; i < size; i++) {
*(__noncacheable_init_start__ + i) = *(__noncacheable_init_load_addr__ + i);
}
+
+ /* fast_ram bss section */
+ size = __fast_ram_bss_end__ - __fast_ram_bss_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_bss_start__ + i) = 0;
+ }
+
+ /* fast_ram init section LMA: etext + data length + ramfunc length + tdata length */
+ size = __fast_ram_init_end__ - __fast_ram_init_start__;
+ for (i = 0; i < size; i++) {
+ *(__fast_ram_init_start__ + i) = *(__fast_ram_init_load_addr__ + i);
+ }
#endif
}
diff --git a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/start.S b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/start.S
index c2000769245a..0262684ad38f 100644
--- a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/start.S
+++ b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/start.S
@@ -77,6 +77,7 @@ _start:
nmi_handler:
1: j 1b
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
.weak default_irq_handler
.align 2
default_irq_handler:
@@ -89,3 +90,13 @@ default_irq_handler:
.endm
#include "vectors.S"
+#else
+ .section .vector_table, "a"
+ .global __vector_table
+ .align 9
+
+__vector_table:
+ .rept RT_HW_ISR_NUM
+ .long handle_trap
+ .endr
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
diff --git a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/vectors.S b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/vectors.S
index 51d8f5dc5c63..cc6604ec3ba7 100644
--- a/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/vectors.S
+++ b/bsp/hpmicro/hpm6p00evk/startup/HPM6P81/toolchains/gcc/vectors.S
@@ -15,109 +15,160 @@ __vector_table:
IRQ_HANDLER 2 /* GPIO0_B IRQ handler */
IRQ_HANDLER 3 /* GPIO0_C IRQ handler */
IRQ_HANDLER 4 /* GPIO0_D IRQ handler */
- IRQ_HANDLER 5 /* GPIO0_X IRQ handler */
- IRQ_HANDLER 6 /* GPIO0_Y IRQ handler */
- IRQ_HANDLER 7 /* GPIO1_A IRQ handler */
- IRQ_HANDLER 8 /* GPIO1_B IRQ handler */
- IRQ_HANDLER 9 /* GPIO1_C IRQ handler */
- IRQ_HANDLER 10 /* GPIO1_D IRQ handler */
- IRQ_HANDLER 11 /* GPIO1_X IRQ handler */
- IRQ_HANDLER 12 /* GPIO1_Y IRQ handler */
- IRQ_HANDLER 13 /* GPTMR0 IRQ handler */
- IRQ_HANDLER 14 /* GPTMR1 IRQ handler */
- IRQ_HANDLER 15 /* GPTMR2 IRQ handler */
- IRQ_HANDLER 16 /* GPTMR3 IRQ handler */
- IRQ_HANDLER 17 /* Reserved */
- IRQ_HANDLER 18 /* Reserved */
- IRQ_HANDLER 19 /* Reserved */
- IRQ_HANDLER 20 /* Reserved */
- IRQ_HANDLER 21 /* UART0 IRQ handler */
- IRQ_HANDLER 22 /* UART1 IRQ handler */
- IRQ_HANDLER 23 /* UART2 IRQ handler */
- IRQ_HANDLER 24 /* UART3 IRQ handler */
- IRQ_HANDLER 25 /* UART4 IRQ handler */
- IRQ_HANDLER 26 /* UART5 IRQ handler */
- IRQ_HANDLER 27 /* UART6 IRQ handler */
- IRQ_HANDLER 28 /* UART7 IRQ handler */
- IRQ_HANDLER 29 /* I2C0 IRQ handler */
- IRQ_HANDLER 30 /* I2C1 IRQ handler */
- IRQ_HANDLER 31 /* I2C2 IRQ handler */
- IRQ_HANDLER 32 /* I2C3 IRQ handler */
- IRQ_HANDLER 33 /* SPI0 IRQ handler */
- IRQ_HANDLER 34 /* SPI1 IRQ handler */
- IRQ_HANDLER 35 /* SPI2 IRQ handler */
- IRQ_HANDLER 36 /* SPI3 IRQ handler */
- IRQ_HANDLER 37 /* TSNS IRQ handler */
- IRQ_HANDLER 38 /* MBX0A IRQ handler */
- IRQ_HANDLER 39 /* MBX0B IRQ handler */
- IRQ_HANDLER 40 /* MBX1A IRQ handler */
- IRQ_HANDLER 41 /* MBX1B IRQ handler */
- IRQ_HANDLER 42 /* EWDG0 IRQ handler */
- IRQ_HANDLER 43 /* EWDG1 IRQ handler */
- IRQ_HANDLER 44 /* EWDG2 IRQ handler */
- IRQ_HANDLER 45 /* EWDG3 IRQ handler */
- IRQ_HANDLER 46 /* HDMA IRQ handler */
- IRQ_HANDLER 47 /* LOBS IRQ handler */
- IRQ_HANDLER 48 /* ADC0 IRQ handler */
- IRQ_HANDLER 49 /* ADC1 IRQ handler */
- IRQ_HANDLER 50 /* ADC2 IRQ handler */
- IRQ_HANDLER 51 /* ADC3 IRQ handler */
- IRQ_HANDLER 52 /* DAC0 IRQ handler */
- IRQ_HANDLER 53 /* DAC1 IRQ handler */
- IRQ_HANDLER 54 /* ACMP0[0] IRQ handler */
- IRQ_HANDLER 55 /* ACMP0[1] IRQ handler */
- IRQ_HANDLER 56 /* ACMP1[0] IRQ handler */
- IRQ_HANDLER 57 /* ACMP1[1] IRQ handler */
- IRQ_HANDLER 58 /* ACMP2[0] IRQ handler */
- IRQ_HANDLER 59 /* ACMP2[1] IRQ handler */
- IRQ_HANDLER 60 /* ACMP3[0] IRQ handler */
- IRQ_HANDLER 61 /* ACMP3[1] IRQ handler */
- IRQ_HANDLER 62 /* I2S0 IRQ handler */
- IRQ_HANDLER 63 /* I2S1 IRQ handler */
- IRQ_HANDLER 64 /* DAO IRQ handler */
- IRQ_HANDLER 65 /* PDM IRQ handler */
- IRQ_HANDLER 66 /* MCAN0 IRQ handler */
- IRQ_HANDLER 67 /* MCAN1 IRQ handler */
- IRQ_HANDLER 68 /* MCAN2 IRQ handler */
- IRQ_HANDLER 69 /* MCAN3 IRQ handler */
- IRQ_HANDLER 70 /* PTPC IRQ handler */
- IRQ_HANDLER 71 /* QEI0 IRQ handler */
- IRQ_HANDLER 72 /* QEI1 IRQ handler */
- IRQ_HANDLER 73 /* PWM0 IRQ handler */
- IRQ_HANDLER 74 /* PWM1 IRQ handler */
- IRQ_HANDLER 75 /* PWM2 IRQ handler */
- IRQ_HANDLER 76 /* PWM3 IRQ handler */
- IRQ_HANDLER 77 /* RDC0 IRQ handler */
- IRQ_HANDLER 78 /* SDM0 IRQ handler */
- IRQ_HANDLER 79 /* SEI0[0] IRQ handler */
- IRQ_HANDLER 80 /* SEI0[1] IRQ handler */
- IRQ_HANDLER 81 /* MTG0 IRQ handler */
- IRQ_HANDLER 82 /* VSC0 IRQ handler */
- IRQ_HANDLER 83 /* CLC0[0] IRQ handler */
- IRQ_HANDLER 84 /* CLC0[1] IRQ handler */
- IRQ_HANDLER 85 /* TRGMUX0 IRQ handler */
- IRQ_HANDLER 86 /* TRGMUX1 IRQ handler */
- IRQ_HANDLER 87 /* ENET0 IRQ handler */
- IRQ_HANDLER 88 /* NTMR0 IRQ handler */
- IRQ_HANDLER 89 /* USB0 IRQ handler */
- IRQ_HANDLER 90 /* XPI0 IRQ handler */
- IRQ_HANDLER 91 /* FEMC IRQ handler */
- IRQ_HANDLER 92 /* PPI IRQ handler */
- IRQ_HANDLER 93 /* XDMA IRQ handler */
- IRQ_HANDLER 94 /* FFA IRQ handler */
- IRQ_HANDLER 95 /* SDP IRQ handler */
- IRQ_HANDLER 96 /* RNG IRQ handler */
- IRQ_HANDLER 97 /* PSEC IRQ handler */
- IRQ_HANDLER 98 /* PGPIO IRQ handler */
- IRQ_HANDLER 99 /* PEWDG IRQ handler */
- IRQ_HANDLER 100 /* PTMR IRQ handler */
- IRQ_HANDLER 101 /* PUART IRQ handler */
- IRQ_HANDLER 102 /* FUSE IRQ handler */
- IRQ_HANDLER 103 /* SECMON IRQ handler */
- IRQ_HANDLER 104 /* PAD_WAKEUP IRQ handler */
- IRQ_HANDLER 105 /* BROWNOUT IRQ handler */
- IRQ_HANDLER 106 /* SYSCTL IRQ handler */
- IRQ_HANDLER 107 /* CPU0 IRQ handler */
- IRQ_HANDLER 108 /* CPU1 IRQ handler */
- IRQ_HANDLER 109 /* DEBUG0 IRQ handler */
- IRQ_HANDLER 110 /* DEBUG1 IRQ handler */
\ No newline at end of file
+ IRQ_HANDLER 5 /* GPIO0_E IRQ handler */
+ IRQ_HANDLER 6 /* GPIO0_F IRQ handler */
+ IRQ_HANDLER 7 /* GPIO0_V IRQ handler */
+ IRQ_HANDLER 8 /* GPIO0_W IRQ handler */
+ IRQ_HANDLER 9 /* GPIO0_X IRQ handler */
+ IRQ_HANDLER 10 /* GPIO0_Y IRQ handler */
+ IRQ_HANDLER 11 /* GPIO0_Z IRQ handler */
+ IRQ_HANDLER 12 /* GPIO1_A IRQ handler */
+ IRQ_HANDLER 13 /* GPIO1_B IRQ handler */
+ IRQ_HANDLER 14 /* GPIO1_C IRQ handler */
+ IRQ_HANDLER 15 /* GPIO1_D IRQ handler */
+ IRQ_HANDLER 16 /* GPIO1_E IRQ handler */
+ IRQ_HANDLER 17 /* GPIO1_F IRQ handler */
+ IRQ_HANDLER 18 /* GPIO1_V IRQ handler */
+ IRQ_HANDLER 19 /* GPIO1_W IRQ handler */
+ IRQ_HANDLER 20 /* GPIO1_X IRQ handler */
+ IRQ_HANDLER 21 /* GPIO1_Y IRQ handler */
+ IRQ_HANDLER 22 /* GPIO1_Z IRQ handler */
+ IRQ_HANDLER 23 /* GPTMR0 IRQ handler */
+ IRQ_HANDLER 24 /* GPTMR1 IRQ handler */
+ IRQ_HANDLER 25 /* GPTMR2 IRQ handler */
+ IRQ_HANDLER 26 /* GPTMR3 IRQ handler */
+ IRQ_HANDLER 27 /* GPTMR4 IRQ handler */
+ IRQ_HANDLER 28 /* GPTMR5 IRQ handler */
+ IRQ_HANDLER 29 /* GPTMR6 IRQ handler */
+ IRQ_HANDLER 30 /* GPTMR7 IRQ handler */
+ IRQ_HANDLER 31 /* UART0 IRQ handler */
+ IRQ_HANDLER 32 /* UART1 IRQ handler */
+ IRQ_HANDLER 33 /* UART2 IRQ handler */
+ IRQ_HANDLER 34 /* UART3 IRQ handler */
+ IRQ_HANDLER 35 /* UART4 IRQ handler */
+ IRQ_HANDLER 36 /* UART5 IRQ handler */
+ IRQ_HANDLER 37 /* UART6 IRQ handler */
+ IRQ_HANDLER 38 /* UART7 IRQ handler */
+ IRQ_HANDLER 39 /* I2C0 IRQ handler */
+ IRQ_HANDLER 40 /* I2C1 IRQ handler */
+ IRQ_HANDLER 41 /* I2C2 IRQ handler */
+ IRQ_HANDLER 42 /* I2C3 IRQ handler */
+ IRQ_HANDLER 43 /* SPI0 IRQ handler */
+ IRQ_HANDLER 44 /* SPI1 IRQ handler */
+ IRQ_HANDLER 45 /* SPI2 IRQ handler */
+ IRQ_HANDLER 46 /* SPI3 IRQ handler */
+ IRQ_HANDLER 47 /* TSNS IRQ handler */
+ IRQ_HANDLER 48 /* MBX0A IRQ handler */
+ IRQ_HANDLER 49 /* MBX0B IRQ handler */
+ IRQ_HANDLER 50 /* MBX1A IRQ handler */
+ IRQ_HANDLER 51 /* MBX1B IRQ handler */
+ IRQ_HANDLER 52 /* EWDG0 IRQ handler */
+ IRQ_HANDLER 53 /* EWDG1 IRQ handler */
+ IRQ_HANDLER 54 /* EWDG2 IRQ handler */
+ IRQ_HANDLER 55 /* EWDG3 IRQ handler */
+ IRQ_HANDLER 56 /* HDMA IRQ handler */
+ IRQ_HANDLER 57 /* LOBS IRQ handler */
+ IRQ_HANDLER 58 /* ADC0 IRQ handler */
+ IRQ_HANDLER 59 /* ADC1 IRQ handler */
+ IRQ_HANDLER 60 /* ADC2 IRQ handler */
+ IRQ_HANDLER 61 /* ADC3 IRQ handler */
+ IRQ_HANDLER 62 /* ACMP0[0] IRQ handler */
+ IRQ_HANDLER 63 /* ACMP0[1] IRQ handler */
+ IRQ_HANDLER 64 /* ACMP1[0] IRQ handler */
+ IRQ_HANDLER 65 /* ACMP1[1] IRQ handler */
+ IRQ_HANDLER 66 /* ACMP2[0] IRQ handler */
+ IRQ_HANDLER 67 /* ACMP2[1] IRQ handler */
+ IRQ_HANDLER 68 /* ACMP3[0] IRQ handler */
+ IRQ_HANDLER 69 /* ACMP3[1] IRQ handler */
+ IRQ_HANDLER 70 /* I2S0 IRQ handler */
+ IRQ_HANDLER 71 /* I2S1 IRQ handler */
+ IRQ_HANDLER 72 /* DAO IRQ handler */
+ IRQ_HANDLER 73 /* PDM IRQ handler */
+ IRQ_HANDLER 74 /* UART8 IRQ handler */
+ IRQ_HANDLER 75 /* UART9 IRQ handler */
+ IRQ_HANDLER 76 /* UART10 IRQ handler */
+ IRQ_HANDLER 77 /* UART11 IRQ handler */
+ IRQ_HANDLER 78 /* UART12 IRQ handler */
+ IRQ_HANDLER 79 /* UART13 IRQ handler */
+ IRQ_HANDLER 80 /* UART14 IRQ handler */
+ IRQ_HANDLER 81 /* UART15 IRQ handler */
+ IRQ_HANDLER 82 /* I2C4 IRQ handler */
+ IRQ_HANDLER 83 /* I2C5 IRQ handler */
+ IRQ_HANDLER 84 /* I2C6 IRQ handler */
+ IRQ_HANDLER 85 /* I2C7 IRQ handler */
+ IRQ_HANDLER 86 /* SPI4 IRQ handler */
+ IRQ_HANDLER 87 /* SPI5 IRQ handler */
+ IRQ_HANDLER 88 /* SPI6 IRQ handler */
+ IRQ_HANDLER 89 /* SPI7 IRQ handler */
+ IRQ_HANDLER 90 /* MCAN0 IRQ handler */
+ IRQ_HANDLER 91 /* MCAN1 IRQ handler */
+ IRQ_HANDLER 92 /* MCAN2 IRQ handler */
+ IRQ_HANDLER 93 /* MCAN3 IRQ handler */
+ IRQ_HANDLER 94 /* MCAN4 IRQ handler */
+ IRQ_HANDLER 95 /* MCAN5 IRQ handler */
+ IRQ_HANDLER 96 /* MCAN6 IRQ handler */
+ IRQ_HANDLER 97 /* MCAN7 IRQ handler */
+ IRQ_HANDLER 98 /* PTPC IRQ handler */
+ IRQ_HANDLER 99 /* QEI0 IRQ handler */
+ IRQ_HANDLER 100 /* QEI1 IRQ handler */
+ IRQ_HANDLER 101 /* QEI2 IRQ handler */
+ IRQ_HANDLER 102 /* QEI3 IRQ handler */
+ IRQ_HANDLER 103 /* PWM0 IRQ handler */
+ IRQ_HANDLER 104 /* PWM1 IRQ handler */
+ IRQ_HANDLER 105 /* PWM2 IRQ handler */
+ IRQ_HANDLER 106 /* PWM3 IRQ handler */
+ IRQ_HANDLER 107 /* RDC0 IRQ handler */
+ IRQ_HANDLER 108 /* RDC1 IRQ handler */
+ IRQ_HANDLER 109 /* SDM0 IRQ handler */
+ IRQ_HANDLER 110 /* SDM1 IRQ handler */
+ IRQ_HANDLER 111 /* SEI[0] IRQ handler */
+ IRQ_HANDLER 112 /* SEI[1] IRQ handler */
+ IRQ_HANDLER 113 /* SEI[2] IRQ handler */
+ IRQ_HANDLER 114 /* SEI[3] IRQ handler */
+ IRQ_HANDLER 115 /* MTG0 IRQ handler */
+ IRQ_HANDLER 116 /* MTG1 IRQ handler */
+ IRQ_HANDLER 117 /* VSC0 IRQ handler */
+ IRQ_HANDLER 118 /* VSC1 IRQ handler */
+ IRQ_HANDLER 119 /* CLC0[0] IRQ handler */
+ IRQ_HANDLER 120 /* CLC0[1] IRQ handler */
+ IRQ_HANDLER 121 /* CLC1[0] IRQ handler */
+ IRQ_HANDLER 122 /* CLC1[1] IRQ handler */
+ IRQ_HANDLER 123 /* TRGMUX0 IRQ handler */
+ IRQ_HANDLER 124 /* TRGMUX1 IRQ handler */
+ IRQ_HANDLER 125 /* ENET0 IRQ handler */
+ IRQ_HANDLER 126 /* NTMR0 IRQ handler */
+ IRQ_HANDLER 127 /* USB0 IRQ handler */
+ IRQ_HANDLER 128 /* TSW[0] IRQ handler */
+ IRQ_HANDLER 129 /* TSW[1] IRQ handler */
+ IRQ_HANDLER 130 /* TSW[2] IRQ handler */
+ IRQ_HANDLER 131 /* TSW[3] IRQ handler */
+ IRQ_HANDLER 132 /* TSW_PTP_EVT IRQ handler */
+ IRQ_HANDLER 133 /* ESC IRQ handler */
+ IRQ_HANDLER 134 /* ESC_SYNC0 IRQ handler */
+ IRQ_HANDLER 135 /* ESC_SYNC1 IRQ handler */
+ IRQ_HANDLER 136 /* ESC_RESET IRQ handler */
+ IRQ_HANDLER 137 /* XPI0 IRQ handler */
+ IRQ_HANDLER 138 /* FEMC IRQ handler */
+ IRQ_HANDLER 139 /* PPI IRQ handler */
+ IRQ_HANDLER 140 /* XDMA IRQ handler */
+ IRQ_HANDLER 141 /* FFA IRQ handler */
+ IRQ_HANDLER 142 /* SDP IRQ handler */
+ IRQ_HANDLER 143 /* RNG IRQ handler */
+ IRQ_HANDLER 144 /* PKA IRQ handler */
+ IRQ_HANDLER 145 /* PSEC IRQ handler */
+ IRQ_HANDLER 146 /* PGPIO IRQ handler */
+ IRQ_HANDLER 147 /* PEWDG IRQ handler */
+ IRQ_HANDLER 148 /* PTMR IRQ handler */
+ IRQ_HANDLER 149 /* PUART IRQ handler */
+ IRQ_HANDLER 150 /* FUSE IRQ handler */
+ IRQ_HANDLER 151 /* SECMON IRQ handler */
+ IRQ_HANDLER 152 /* RTC IRQ handler */
+ IRQ_HANDLER 153 /* PAD_WAKEUP IRQ handler */
+ IRQ_HANDLER 154 /* BGPIO IRQ handler */
+ IRQ_HANDLER 155 /* BVIO IRQ handler */
+ IRQ_HANDLER 156 /* BROWNOUT IRQ handler */
+ IRQ_HANDLER 157 /* SYSCTL IRQ handler */
+ IRQ_HANDLER 158 /* CPU0 IRQ handler */
+ IRQ_HANDLER 159 /* CPU1 IRQ handler */
+ IRQ_HANDLER 160 /* DEBUG0 IRQ handler */
+ IRQ_HANDLER 161 /* DEBUG1 IRQ handler */
\ No newline at end of file
diff --git a/bsp/hpmicro/hpm6p00evk/startup/SConscript b/bsp/hpmicro/hpm6p00evk/startup/SConscript
index 10776376b717..11a9d203d4ce 100644
--- a/bsp/hpmicro/hpm6p00evk/startup/SConscript
+++ b/bsp/hpmicro/hpm6p00evk/startup/SConscript
@@ -8,6 +8,5 @@ cwd = GetCurrentDir()
objs = []
objs = objs + SConscript(os.path.join(rtconfig.CHIP_NAME, 'SConscript'))
-ASFLAGS = ' -I' + cwd
Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/libraries/Kconfig b/bsp/hpmicro/libraries/Kconfig
index 2384b5317659..1a1608e1784d 100644
--- a/bsp/hpmicro/libraries/Kconfig
+++ b/bsp/hpmicro/libraries/Kconfig
@@ -1,47 +1,42 @@
-config SOC_HPM6700_SERIES
+config SOC_SERIES_HPM5000
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM6300_SERIES
+config SOC_SERIES_HPM5100
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM6200_SERIES
+config SOC_SERIES_HPM5300
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM5300_SERIES
+config SOC_SERIES_HPM5E00
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM6800_SERIES
+config SOC_SERIES_HPM6000
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM6E00_SERIES
+config SOC_SERIES_HPM6E00
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM6P00_SERIES
+config SOC_SERIES_HPM6P00
bool
select ARCH_RISCV32
select ARCH_RISCV_DPU
select PKG_USING_HPM_SDK
-config SOC_HPM5E00_SERIES
- bool
- select ARCH_RISCV32
- select ARCH_RISCV_DPU
- select PKG_USING_HPM_SDK
\ No newline at end of file
diff --git a/bsp/hpmicro/libraries/drivers/SConscript b/bsp/hpmicro/libraries/drivers/SConscript
index 4f5fa25d84f2..0a93a0b282a4 100644
--- a/bsp/hpmicro/libraries/drivers/SConscript
+++ b/bsp/hpmicro/libraries/drivers/SConscript
@@ -33,7 +33,7 @@ if GetDepend('BSP_USING_SDXC'):
if GetDepend('BSP_USING_PWM') or GetDepend('BSP_USING_PWMV2'):
src += ['drv_pwm.c']
-if GetDepend('BSP_USING_GPTMR'):
+if GetDepend('BSP_USING_GPTMR') or GetDepend('BSP_USING_GPTMRV2'):
src += ['drv_timer.c']
if GetDepend('BSP_USING_CAN'):
@@ -72,6 +72,12 @@ if GetDepend(['BSP_USING_RTT_LCD_DRIVER']):
if GetDepend('BSP_USING_TSW'):
src += ['drv_tsw.c']
src += ['drv_tsw_phy.c']
+
+if GetDepend('BSP_USING_SOFT_I2C'):
+ src += ['drv_soft_i2c.c']
+
+if GetDepend('BSP_USING_SOFT_SPI'):
+ src += ['drv_soft_spi.c']
path = [cwd]
diff --git a/bsp/hpmicro/libraries/drivers/drv_adc.c b/bsp/hpmicro/libraries/drivers/drv_adc.c
index f29ad1531067..f0192b1613d0 100644
--- a/bsp/hpmicro/libraries/drivers/drv_adc.c
+++ b/bsp/hpmicro/libraries/drivers/drv_adc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021-2024 HPMicro
+ * Copyright (c) 2021-2023 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*/
@@ -17,11 +17,17 @@
#endif
#include "hpm_sysctl_drv.h"
+#if defined(BSP_USING_ADC16) && defined(ADC16_SOC_TEMP_CH_EN) && ADC16_SOC_TEMP_CH_EN
+#define HPM_ADC16_HAS_TEMP_SENSOR (1)
+#define HPM_ADC16_TEMP_SAMPLE_CYCLE (511U)
+#else
+#define HPM_ADC16_HAS_TEMP_SENSOR (0)
+#endif
+
+#ifndef BOARD_ADC_VREF_MV
+#define BOARD_ADC_VREF_MV (3300)
+#endif
-typedef struct
-{
- bool enabled;
-} adc_channel_state_t;
typedef struct
{
@@ -30,16 +36,17 @@ typedef struct
bool is_adc12;
bool adc_enabled;
uint32_t adc_base;
- adc_channel_state_t chn_state[16];
+ rt_atomic_t enabled_channels;
}hpm_rtt_adc;
#if defined(ADC12_SOC_MAX_CH_NUM)
-extern uint32_t rtt_board_init_adc12_clock(ADC16_Type *ptr);
+extern uint32_t rtt_board_init_adc12_clock(ADC12_Type *ptr, bool clk_src_ahb);
#endif
extern uint32_t rtt_board_init_adc16_clock(ADC16_Type *ptr, bool clk_src_ahb);
static uint32_t hpm_adc_init_clock(struct rt_adc_device *device);
static void hpm_adc_init_pins(struct rt_adc_device *device);
+static bool hpm_adc_get_channel(const hpm_rtt_adc *adc, rt_int8_t channel, uint8_t *adc_chn);
static rt_err_t hpm_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled);
static rt_err_t hpm_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value);
@@ -106,6 +113,39 @@ static hpm_rtt_adc hpm_adc_config_tbl[] =
static uint8_t adc_nums = sizeof(hpm_adc_config_tbl) / sizeof(hpm_rtt_adc);
+static bool hpm_adc_get_channel(const hpm_rtt_adc *adc, rt_int8_t channel, uint8_t *adc_chn)
+{
+ RT_ASSERT(adc_chn != RT_NULL);
+
+#if HPM_ADC16_HAS_TEMP_SENSOR
+ if (!adc->is_adc12 && channel == RT_ADC_INTERN_CH_TEMPER) {
+ *adc_chn = ADC16_SOC_TEMP_CH_NUM;
+ return true;
+ }
+#endif
+
+ if (channel < 0) {
+ return false;
+ }
+
+ *adc_chn = (uint8_t)channel;
+
+ if (adc->is_adc12) {
+#ifdef BSP_USING_ADC12
+ return !ADC12_IS_CHANNEL_INVALID(*adc_chn);
+#else
+ return false;
+#endif
+ }
+
+#ifdef BSP_USING_ADC16
+ return !ADC16_IS_CHANNEL_INVALID(*adc_chn);
+#else
+ return false;
+#endif
+}
+
+
static uint32_t hpm_adc_init_clock(struct rt_adc_device *device)
{
hpm_rtt_adc *hpm_adc;
@@ -116,7 +156,7 @@ static uint32_t hpm_adc_init_clock(struct rt_adc_device *device)
#if defined(ADC12_SOC_MAX_CH_NUM)
if (hpm_adc->is_adc12)
{
- clock_freq = rtt_board_init_adc12_clock((ADC12_Type*)hpm_adc->adc_base,true);
+ clock_freq = rtt_board_init_adc12_clock((ADC12_Type *)hpm_adc->adc_base, true);
} else
#endif
{
@@ -151,8 +191,8 @@ static rt_err_t init_adc_config(hpm_rtt_adc *adc)
adc12_get_default_config(&cfg);
cfg.res = adc12_res_12_bits;
cfg.conv_mode = adc12_conv_mode_oneshot;
- cfg.adc_ahb_en = true;
cfg.adc_clk_div = 3;
+ cfg.wait_dis = false;
ret = adc12_init((ADC12_Type *)adc->adc_base, &cfg);
if (ret != status_success) {
return -RT_ERROR;
@@ -166,8 +206,9 @@ static rt_err_t init_adc_config(hpm_rtt_adc *adc)
cfg.conv_mode = adc16_conv_mode_oneshot;
cfg.res = adc16_res_16_bits;
cfg.adc_clk_div = 4;
+#if !defined(HPM_IP_FEATURE_ADC16_FORCE_SYNC_AHB) || !HPM_IP_FEATURE_ADC16_FORCE_SYNC_AHB
cfg.sel_sync_ahb = true;
- cfg.adc_ahb_en = true;
+#endif
cfg.wait_dis = 0;
ret = adc16_init((ADC16_Type *)adc->adc_base, &cfg);
if (ret != status_success) {
@@ -206,11 +247,23 @@ static rt_err_t init_channel_config(hpm_rtt_adc *adc, uint16_t channel)
adc16_get_channel_default_config(&ch_cfg);
ch_cfg.ch = channel;
- ch_cfg.sample_cycle = 20;
+#if HPM_ADC16_HAS_TEMP_SENSOR
+ if (channel == ADC16_SOC_TEMP_CH_NUM) {
+ ch_cfg.sample_cycle = HPM_ADC16_TEMP_SAMPLE_CYCLE;
+ } else
+#endif
+ {
+ ch_cfg.sample_cycle = 20;
+ }
ret = adc16_init_channel((ADC16_Type *)adc->adc_base, &ch_cfg);
if (ret != status_success) {
return -RT_ERROR;
}
+#if HPM_ADC16_HAS_TEMP_SENSOR
+ if (channel == ADC16_SOC_TEMP_CH_NUM) {
+ adc16_enable_temp_sensor((ADC16_Type *)adc->adc_base);
+ }
+#endif
#endif
}
return RT_EOK;
@@ -219,12 +272,21 @@ static rt_err_t init_channel_config(hpm_rtt_adc *adc, uint16_t channel)
static rt_err_t hpm_adc_enabled(struct rt_adc_device *device, rt_int8_t channel, rt_bool_t enabled)
{
hpm_rtt_adc *hpm_adc;
- rt_err_t ret;
+ rt_err_t ret = RT_EOK;
+ rt_base_t critical_level;
+ rt_atomic_t channel_mask;
+ uint8_t adc_chn;
RT_ASSERT(device != RT_NULL);
hpm_adc = (hpm_rtt_adc *)device->parent.user_data;
+ if (!hpm_adc_get_channel(hpm_adc, channel, &adc_chn)) {
+ return -RT_EINVAL;
+ }
+
+ channel_mask = (rt_atomic_t)1U << adc_chn;
+ critical_level = rt_enter_critical();
if (enabled == RT_TRUE) {
- if (!hpm_adc->chn_state[channel].enabled)
+ if ((rt_atomic_load(&hpm_adc->enabled_channels) & channel_mask) == 0)
{
if (!hpm_adc->adc_enabled)
{
@@ -232,49 +294,76 @@ static rt_err_t hpm_adc_enabled(struct rt_adc_device *device, rt_int8_t channel,
(void)hpm_adc_init_clock(device);
ret = init_adc_config(hpm_adc);
if (ret != RT_EOK) {
- return -RT_ERROR;
+ goto exit;
}
hpm_adc->adc_enabled = true;
}
- hpm_adc->chn_state[channel].enabled = true;
- ret = init_channel_config(hpm_adc, channel);
+ ret = init_channel_config(hpm_adc, adc_chn);
if (ret != RT_EOK) {
- return -RT_ERROR;
+ goto exit;
}
+ (void)rt_atomic_or(&hpm_adc->enabled_channels, channel_mask);
}
}
else
{
- /* Since the ADC channel cannot be truly disabled, do nothing here */
+ /* The hardware has no per-channel disable in oneshot mode. */
+#if HPM_ADC16_HAS_TEMP_SENSOR
+ rt_atomic_t old_channels;
+
+ old_channels = rt_atomic_and(&hpm_adc->enabled_channels, ~channel_mask);
+ if (!hpm_adc->is_adc12 && adc_chn == ADC16_SOC_TEMP_CH_NUM
+ && (old_channels & channel_mask) != 0) {
+ adc16_disable_temp_sensor((ADC16_Type *)hpm_adc->adc_base);
+ }
+#else
+ (void)rt_atomic_and(&hpm_adc->enabled_channels, ~channel_mask);
+#endif
}
- return RT_EOK;
+exit:
+ rt_exit_critical_safe(critical_level);
+ return ret;
}
static rt_err_t hpm_get_adc_value(struct rt_adc_device *device, rt_int8_t channel, rt_uint32_t *value)
{
hpm_rtt_adc *hpm_adc;
- rt_err_t ret;
+ hpm_stat_t status;
rt_uint16_t val;
+ uint8_t adc_chn;
RT_ASSERT(device != RT_NULL);
RT_ASSERT(value != RT_NULL);
hpm_adc = (hpm_rtt_adc *)device->parent.user_data;
- uint32_t adc_chn = (uint16_t)channel;
+ if (!hpm_adc_get_channel(hpm_adc, channel, &adc_chn)) {
+ return -RT_EINVAL;
+ }
+ if ((rt_atomic_load(&hpm_adc->enabled_channels) & ((rt_atomic_t)1U << adc_chn)) == 0) {
+ return -RT_EINVAL;
+ }
+
if (hpm_adc->is_adc12) {
#ifdef BSP_USING_ADC12
- adc12_get_oneshot_result((ADC12_Type *)hpm_adc->adc_base, adc_chn, &val);
- *value = val;
+ status = adc12_get_oneshot_result((ADC12_Type *)hpm_adc->adc_base, adc_chn, &val);
+#else
+ return -RT_ENOSYS;
#endif
} else {
#ifdef BSP_USING_ADC16
- hpm_stat_t status = adc16_get_oneshot_result((ADC16_Type *)hpm_adc->adc_base, adc_chn, &val);
- *value = val;
+ status = adc16_get_oneshot_result((ADC16_Type *)hpm_adc->adc_base, adc_chn, &val);
+#else
+ return -RT_ENOSYS;
#endif
}
+ if (status != status_success) {
+ return -RT_ERROR;
+ }
+ *value = val;
+
return RT_EOK;
}
@@ -293,7 +382,9 @@ static rt_uint8_t hpm_get_resolution(struct rt_adc_device *device)
static rt_int16_t hpm_get_vref(struct rt_adc_device *device)
{
- return -RT_EIO;
+ RT_UNUSED(device);
+
+ return BOARD_ADC_VREF_MV;
}
int rt_hw_adc_init(void)
@@ -306,7 +397,7 @@ int rt_hw_adc_init(void)
&hpm_adc_ops,
&hpm_adc_config_tbl[i]);
if (ret != RT_EOK) {
- ret = RT_ERROR;
+ ret = -RT_ERROR;
break;
}
}
diff --git a/bsp/hpmicro/libraries/drivers/drv_can.c b/bsp/hpmicro/libraries/drivers/drv_can.c
index b94f0e10ea71..b5428fe31ac0 100644
--- a/bsp/hpmicro/libraries/drivers/drv_can.c
+++ b/bsp/hpmicro/libraries/drivers/drv_can.c
@@ -3,183 +3,289 @@
*
* SPDX-License-Identifier: BSD-3-Clause
*
+ * @file drv_can.c
+ * @brief CAN driver implementation for RT-Thread
+ *
+ * This file implements the CAN (Controller Area Network) driver for HPM6700
+ * and HPM6300 series, providing a complete interface between RT-Thread's CAN
+ * framework and the HPM CAN hardware.
+ *
+ * Features:
+ * - Support for up to 4 CAN controllers (CAN0-CAN3)
+ * - CAN 2.0A/B and CAN FD support
+ * - Hardware filtering with up to 16 filters
+ * - Interrupt-driven operation
+ * - Error handling and status reporting
+ * - Configurable baud rates and timing parameters
+ *
* Change Logs:
* Date Author Notes
* 2022-05-08 HPMicro the first version
* 2023-05-08 HPMicro Adapt RT-Thread v5.0.0
+
* 2025/03-25 HPMicro Add configurable interrupt priority support
+ * 2025-09-01 HPMicro Revised the code, reduced repetitive codes
*/
+#include "rtconfig.h"
+
+#ifdef RT_USING_CAN
+
+/* RT-Thread includes */
#include
#include
-#include
+
+/* HPM SDK includes */
#include "board.h"
#include "hpm_can_drv.h"
-
#include "hpm_clock_drv.h"
+#include
-#define CAN_SEND_WAIT_MS_MAX (1000U) /* CAN maximum wait time for transmission */
-#define CAN_SENDBOX_NUM (1U) /* CAN Hardware Transmission buffer number */
-#define CAN_FILTER_NUM_MAX (16U) /* CAN Hardware Filter number */
+/* CAN Driver Configuration Constants */
+#define CAN_SEND_WAIT_MS_MAX (1000U) /* Maximum wait time for transmission (ms) */
+#define CAN_SENDBOX_NUM (1U) /* Number of hardware transmission buffers */
+#define CAN_FILTER_NUM_MAX (16U) /* Maximum number of hardware filters */
-#ifdef RT_USING_CAN
+/*
+ * Interrupt Priority Configuration Macros
+ * These macros handle the configuration of interrupt priorities for each CAN controller.
+ * If a specific priority is defined in the board configuration, it will be used;
+ * otherwise, a default priority of 1 is applied.
+ */
+
+/* CAN IRQ Priority Configuration Macros */
+#ifdef BSP_CAN0_IRQ_PRIORITY
+#define CAN_IRQ_PRI_VAL_0 BSP_CAN0_IRQ_PRIORITY
+#else
+#define CAN_IRQ_PRI_VAL_0 1
+#endif
+
+#ifdef BSP_CAN1_IRQ_PRIORITY
+#define CAN_IRQ_PRI_VAL_1 BSP_CAN1_IRQ_PRIORITY
+#else
+#define CAN_IRQ_PRI_VAL_1 1
+#endif
+#ifdef BSP_CAN2_IRQ_PRIORITY
+#define CAN_IRQ_PRI_VAL_2 BSP_CAN2_IRQ_PRIORITY
+#else
+#define CAN_IRQ_PRI_VAL_2 1
+#endif
+
+#ifdef BSP_CAN3_IRQ_PRIORITY
+#define CAN_IRQ_PRI_VAL_3 BSP_CAN3_IRQ_PRIORITY
+#else
+#define CAN_IRQ_PRI_VAL_3 1
+#endif
+
+#define CAN_IRQ_PRI_VAL(n) CAN_IRQ_PRI_VAL_##n
+
+#define CAN_UNITED (0UL)
+#define CAN_INITED (1UL)
+#define CAN_RUNNING (2UL)
+#define CAN_STOPPED (3UL)
+
+/*
+ * CAN Device Definition Macro
+ * This macro creates a complete CAN device structure and its associated ISR.
+ * It reduces code duplication by generating device-specific code for each CAN controller.
+ *
+ * @param n CAN controller number (0-3)
+ */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+#define CAN_DEVICE_DEFINE(n) \
+ static hpm_can_t dev_can##n = \
+ { \
+ .can_base = HPM_CAN##n, \
+ .name = "can" #n, \
+ .irq_num = IRQn_CAN##n, \
+ .fifo_index = n, \
+ .clk_name = clock_can##n, \
+ .irq_priority = CAN_IRQ_PRI_VAL(n), \
+ }; \
+ SDK_DECLARE_EXT_ISR_M(IRQn_CAN##n, can##n##_isr); \
+ void can##n##_isr(void) \
+ { \
+ hpm_can_isr(&dev_can##n); \
+ }
+#else
+#define CAN_DEVICE_DEFINE(n) \
+ static hpm_can_t dev_can##n = \
+ { \
+ .can_base = HPM_CAN##n, \
+ .name = "can" #n, \
+ .irq_num = IRQn_CAN##n, \
+ .fifo_index = n, \
+ .clk_name = clock_can##n, \
+ .irq_priority = CAN_IRQ_PRI_VAL(n), \
+ };
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+/*
+ * Common Pattern Macros
+ * These macros simplify repetitive code patterns throughout the driver.
+ */
+
+/* Macro to extract CAN driver context from RT-Thread device structure */
+#define CAN_GET_DRV(can) \
+ hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data; \
+ RT_ASSERT(drv_can)
+
+/* Interrupt mask definitions for different CAN event types */
+#define CAN_RX_IRQ_MASK (CAN_EVENT_RECEIVE | CAN_EVENT_RX_BUF_ALMOST_FULL | CAN_EVENT_RX_BUF_FULL | CAN_EVENT_RX_BUF_OVERRUN)
+#define CAN_TX_IRQ_MASK (CAN_EVENT_TX_PRIMARY_BUF | CAN_EVENT_TX_SECONDARY_BUF)
+#define CAN_ERR_IRQ_MASK (CAN_ERROR_ARBITRATION_LOST_INT_ENABLE | CAN_ERROR_PASSIVE_INT_ENABLE | CAN_ERROR_BUS_ERROR_INT_ENABLE)
+
+/**
+ * @brief HPM CAN driver context structure
+ *
+ * This structure contains all the necessary information to manage a CAN controller,
+ * including hardware registers, configuration, and RT-Thread device interface.
+ */
typedef struct _hpm_can_struct
{
- CAN_Type *can_base; /**< CAN Base address */
- const char *name; /**< CAN device name */
- int32_t irq_num; /**< CAN IRQ index */
- uint8_t irq_priority; /**< CAN IRQ priority */
- clock_name_t clk_name; /**< CAN clock name */
- uint32_t fifo_index; /**< FIFO index, it is a fake value to satisfy the driver framework */
- can_config_t can_config; /**< CAN configuration for IP */
- struct rt_can_device can_dev; /**< CAN device configuration in rt-thread */
- uint32_t filter_num; /**< Filter number */
- can_filter_config_t filter_list[CAN_FILTER_NUM_MAX]; /**< Filter list */
+ CAN_Type *can_base; /**< CAN hardware base address */
+ const char *name; /**< CAN device name (e.g., "can0", "can1") */
+ rt_int32_t irq_num; /**< CAN interrupt number */
+ rt_uint8_t irq_priority; /**< CAN interrupt priority */
+ clock_name_t clk_name; /**< CAN clock source name */
+ rt_uint32_t fifo_index; /**< FIFO index (used for RT-Thread framework compatibility) */
+ can_config_t can_config; /**< HPM CAN hardware configuration */
+ struct rt_can_device can_dev; /**< RT-Thread CAN device structure */
+ rt_uint32_t filter_num; /**< Number of active hardware filters */
+ can_filter_config_t filter_list[CAN_FILTER_NUM_MAX]; /**< Array of hardware filter configurations */
+ rt_uint8_t can_stat; /**< CAN status */
} hpm_can_t;
+/* ============================================================================
+ * Function Declarations
+ * ============================================================================ */
+
/**
- * @brief Configure CAN controller
- * @param [in/out] can CAN device pointer
- * @param [in] cfg CAN configuration pointer
- * @retval RT_EOK for valid configuration
- * @retval -RT_ERROR for invalid configuration
+ * @brief Configure CAN controller with specified parameters
+ *
+ * This function configures the CAN controller with the provided configuration
+ * including baud rate, mode, timing parameters, and filter settings.
+ *
+ * @param [in/out] can Pointer to RT-Thread CAN device structure
+ * @param [in] cfg Pointer to CAN configuration structure
+ * @retval RT_EOK Configuration successful
+ * @retval -RT_ERROR Configuration failed
*/
static rt_err_t hpm_can_configure(struct rt_can_device *can, struct can_configure *cfg);
/**
- * @brief Control/Get CAN state
- * including:interrupt, mode, priority, baudrate, filter, status
- * @param [in/out] can CAN device pointer
- * @param [in] cmd Control command
- * @param [in/out] arg Argument pointer
- * @retval RT_EOK for valid control command and arg
- * @retval -RT_ERROR for invalid control command or arg
+ * @brief Control CAN device and get/set various parameters
+ *
+ * This function handles various control commands including:
+ * - Interrupt enable/disable
+ * - Filter configuration
+ * - Mode changes
+ * - Baud rate changes
+ * - Status retrieval
+ *
+ * @param [in/out] can Pointer to RT-Thread CAN device structure
+ * @param [in] cmd Control command (see RT_CAN_CMD_* definitions)
+ * @param [in/out] arg Command argument (input/output depending on command)
+ * @retval RT_EOK Command executed successfully
+ * @retval -RT_ERROR Invalid command or argument
*/
static rt_err_t hpm_can_control(struct rt_can_device *can, int cmd, void *arg);
/**
- * @brief Send out CAN message
- * @param [in] can CAN device pointer
- * @param [in] buf CAN message buffer
- * @param [in] boxno Mailbox number, it is not used in this porting
- * @retval RT_EOK No error
- * @retval -RT_ETIMEOUT timeout happened
- * @retval -RT_EFULL Transmission buffer is full
+ * @brief Send CAN message
+ *
+ * This function transmits a CAN message using the hardware transmission buffers.
+ * It supports both standard and extended frame formats, as well as CAN FD.
+ *
+ * @param [in] can Pointer to RT-Thread CAN device structure
+ * @param [in] buf Pointer to CAN message structure
+ * @param [in] boxno Mailbox number (not used in this implementation)
+ * @retval RT_EOK Message sent successfully
+ * @retval -RT_ETIMEOUT Transmission timeout
+ * @retval -RT_EFULL Transmission buffer full
*/
static int hpm_can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);
/**
- * @brief Receive message from CAN
- * @param [in] can CAN device pointer
- * @param [out] buf CAN receive buffer
- * @param [in] boxno Mailbox Number, it is not used in this porting
- * @retval RT_EOK no error
- * @retval -RT_ERROR Error happened during reading receive FIFO
- * @retval -RT_EMPTY no data in receive FIFO
+ * @brief Receive CAN message
+ *
+ * This function receives a CAN message from the hardware receive FIFO.
+ * It handles both standard and extended frame formats, as well as CAN FD.
+ *
+ * @param [in] can Pointer to RT-Thread CAN device structure
+ * @param [out] buf Pointer to buffer for received CAN message
+ * @param [in] boxno Mailbox number (not used in this implementation)
+ * @retval RT_EOK Message received successfully
+ * @retval -RT_ERROR Error during reception
+ * @retval -RT_EMPTY No data available in receive FIFO
*/
static int hpm_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
/**
- * @brief Common Interrupt Service routine
- * @param [in] hpm_can HPM CAN pointer
+ * @brief CAN interrupt service routine
+ *
+ * This function handles all CAN-related interrupts including:
+ * - Transmission completion
+ * - Reception of new messages
+ * - Error conditions
+ * - FIFO overflow
+ *
+ * @param [in] hpm_can Pointer to HPM CAN driver context
*/
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_can_isr(hpm_can_t *hpm_can);
+#else
+static void hpm_can_isr(int vector, hpm_can_t *hpm_can);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
/**
- * @brief Decode data bytes from DLC
- * @param [in] dlc Data Length Code
- * @return decoded data bytes
+ * @brief Convert DLC (Data Length Code) to actual data bytes
+ *
+ * This function converts the CAN DLC field to the actual number of data bytes.
+ * It handles both CAN 2.0 (up to 8 bytes) and CAN FD (up to 64 bytes) formats.
+ *
+ * @param [in] dlc Data Length Code from CAN frame
+ * @return Number of actual data bytes
*/
static uint8_t can_get_data_bytes_from_dlc(uint32_t dlc);
-#if defined(HPM_CAN0_BASE) && defined(BSP_USING_CAN0)
-static hpm_can_t dev_can0 =
-{
- .can_base = HPM_CAN0,
- .name = "can0",
- .irq_num = IRQn_CAN0,
- .fifo_index = 0,
- .clk_name = clock_can0,
-#if defined(BSP_CAN0_IRQ_PRIORITY)
- .irq_priority = BSP_CAN0_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
-};
+/**
+ * @brief Update CAN error status from hardware registers
+ *
+ * This function reads the current error status from the CAN hardware registers
+ * and updates the driver's error status structure with the latest information.
+ *
+ * @param [in] hpm_can Pointer to HPM CAN driver context
+ */
+static void can_update_error_status(hpm_can_t *hpm_can);
-SDK_DECLARE_EXT_ISR_M(IRQn_CAN0, can0_isr);
-void can0_isr(void)
-{
- hpm_can_isr(&dev_can0);
-}
+/* ============================================================================
+ * CAN Device Instances
+ * ============================================================================ */
+/* CAN0 device instance - created if HPM_CAN0_BASE is defined and BSP_USING_CAN0 is enabled */
+#if defined(HPM_CAN0_BASE) && defined(BSP_USING_CAN0)
+CAN_DEVICE_DEFINE(0)
#endif
+/* CAN1 device instance - created if HPM_CAN1_BASE is defined and BSP_USING_CAN1 is enabled */
#if defined(HPM_CAN1_BASE) && defined(BSP_USING_CAN1)
-static hpm_can_t dev_can1 =
-{
- .can_base = HPM_CAN1,
- .name = "can1",
- .irq_num = IRQn_CAN1,
- .fifo_index = 1,
- .clk_name = clock_can1,
-#if defined(BSP_CAN1_IRQ_PRIORITY)
- .irq_priority = BSP_CAN1_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_CAN1, can1_isr);
-void can1_isr(void)
-{
- hpm_can_isr(&dev_can1);
-}
+CAN_DEVICE_DEFINE(1)
#endif
+/* CAN2 device instance - created if HPM_CAN2_BASE is defined and BSP_USING_CAN2 is enabled */
#if defined(HPM_CAN2_BASE) && defined(BSP_USING_CAN2)
-static hpm_can_t dev_can2 =
-{
- .can_base = HPM_CAN2,
- .name = "can2",
- .irq_num = IRQn_CAN2,
- .fifo_index = 2,
- .clk_name = clock_can2,
-#if defined(BSP_CAN2_IRQ_PRIORITY)
- .irq_priority = BSP_CAN2_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_CAN2, can2_isr);
-void can2_isr(void)
-{
- hpm_can_isr(&dev_can2);
-}
+CAN_DEVICE_DEFINE(2)
#endif
+/* CAN3 device instance - created if HPM_CAN3_BASE is defined and BSP_USING_CAN3 is enabled */
#if defined(HPM_CAN3_BASE) && defined(BSP_USING_CAN3)
-static hpm_can_t dev_can3 =
-{
- .can_base = HPM_CAN3,
- .name = "can3",
- .irq_num = IRQn_CAN3,
- .fifo_index = 3,
- .clk_name = clock_can3,
-#if defined(BSP_CAN3_IRQ_PRIORITY)
- .irq_priority = BSP_CAN3_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_CAN3, can3_isr);
-void can3_isr(void)
-{
- hpm_can_isr(&dev_can3);
-}
+CAN_DEVICE_DEFINE(3)
#endif
+/* Array of CAN device pointers - used for initialization and management */
static hpm_can_t *hpm_cans[] = {
#if defined(HPM_CAN0_BASE) && defined(BSP_USING_CAN0)
&dev_can0,
@@ -195,48 +301,66 @@ static hpm_can_t *hpm_cans[] = {
#endif
};
-
+/* RT-Thread CAN operations structure - defines the interface between RT-Thread and this driver */
static const struct rt_can_ops hpm_can_ops = {
- .configure = hpm_can_configure,
- .control = hpm_can_control,
- .sendmsg = hpm_can_sendmsg,
- .recvmsg = hpm_can_recvmsg,
+ .configure = hpm_can_configure, /* Configure CAN controller */
+ .control = hpm_can_control, /* Control CAN device operations */
+ .sendmsg = hpm_can_sendmsg, /* Send CAN message */
+ .recvmsg = hpm_can_recvmsg, /* Receive CAN message */
};
+/* ============================================================================
+ * Function Implementations
+ * ============================================================================ */
+
+/**
+ * @brief CAN interrupt service routine
+ *
+ * This function is called when a CAN interrupt occurs. It handles various
+ * interrupt types including transmission completion, reception, and errors.
+ *
+ * @param [in] hpm_can Pointer to HPM CAN driver context
+ */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_can_isr(hpm_can_t *hpm_can)
+#else
+static void hpm_can_isr(int vector, hpm_can_t *hpm_can)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
+ /* Read interrupt flags from hardware */
uint8_t tx_rx_flags = can_get_tx_rx_flags(hpm_can->can_base);
uint8_t error_flags = can_get_error_interrupt_flags(hpm_can->can_base);
- /* High-priority message transmission done */
+ /* Handle high-priority message transmission completion */
if ((tx_rx_flags & CAN_EVENT_TX_PRIMARY_BUF) != 0U)
{
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_TX_DONE | (0UL << 8));
}
- /* Normal priority message transmission done */
+ /* Handle normal priority message transmission completion */
if ((tx_rx_flags & CAN_EVENT_TX_SECONDARY_BUF) != 0U)
{
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_TX_DONE | (0UL << 8));
}
- /* Data available in FIFO */
- if ((tx_rx_flags & CAN_EVENT_RECEIVE) == CAN_EVENT_RECEIVE)
+ /* Handle new message reception */
+ if (((tx_rx_flags & CAN_EVENT_RECEIVE) == CAN_EVENT_RECEIVE) && ((hpm_can->can_stat != CAN_STOPPED) || (hpm_can->can_stat != CAN_UNITED)))
{
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_RX_IND | (hpm_can->fifo_index << 8));
}
- /* RX FIFO overflow */
- if ((tx_rx_flags & CAN_EVENT_RX_BUF_OVERRUN) != 0U)
+ /* Handle receive FIFO overflow */
+ if (((tx_rx_flags & CAN_EVENT_RX_BUF_OVERRUN) != 0U) && ((hpm_can->can_stat != CAN_STOPPED) || (hpm_can->can_stat != CAN_UNITED)))
{
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_RXOF_IND | (hpm_can->fifo_index << 8));
}
- /* Error happened on CAN Bus */
+ /* Handle CAN bus errors */
if (((tx_rx_flags & CAN_EVENT_ERROR) != 0U) || (error_flags != 0U))
{
+ /* Get the specific error type and update error counters */
uint8_t err_kind = can_get_last_error_kind(hpm_can->can_base);
switch(err_kind)
{
@@ -257,35 +381,32 @@ static void hpm_can_isr(hpm_can_t *hpm_can)
break;
}
- hpm_can->can_dev.status.rcverrcnt = can_get_receive_error_count(hpm_can->can_base);
- hpm_can->can_dev.status.snderrcnt = can_get_transmit_error_count(hpm_can->can_base);
- hpm_can->can_dev.status.lasterrtype = can_get_last_error_kind(hpm_can->can_base);
- hpm_can->can_dev.status.errcode = 0;
- if ((error_flags & CAN_ERROR_WARNING_LIMIT_FLAG) != 0U)
- {
- hpm_can->can_dev.status.errcode |= ERRWARNING;
- }
- if ((error_flags & CAN_ERROR_PASSIVE_INT_FLAG) != 0U)
- {
- hpm_can->can_dev.status.errcode |= ERRPASSIVE;
- }
- if (can_is_in_bus_off_mode(hpm_can->can_base))
- {
- hpm_can->can_dev.status.errcode |= BUSOFF;
- }
+ /* Update error status from hardware registers */
+ can_update_error_status(hpm_can);
}
+ /* Clear processed interrupt flags */
can_clear_tx_rx_flags(hpm_can->can_base, tx_rx_flags);
can_clear_error_interrupt_flags(hpm_can->can_base, error_flags);
}
+/**
+ * @brief Configure CAN controller with specified parameters
+ *
+ * This function configures the CAN controller with the provided configuration
+ * including baud rate, mode, timing parameters, and filter settings.
+ *
+ * @param [in/out] can Pointer to RT-Thread CAN device structure
+ * @param [in] cfg Pointer to CAN configuration structure
+ * @retval RT_EOK Configuration successful
+ * @retval -RT_ERROR Configuration failed
+ */
static rt_err_t hpm_can_configure(struct rt_can_device *can, struct can_configure *cfg)
{
RT_ASSERT(can);
RT_ASSERT(cfg);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
- RT_ASSERT(drv_can);
+ CAN_GET_DRV(can);
#ifdef RT_CAN_USING_CANFD
drv_can->can_config.enable_canfd = (cfg->enable_canfd != 0) ? true : false;
@@ -340,7 +461,7 @@ static rt_err_t hpm_can_configure(struct rt_can_device *can, struct can_configur
{
return -RT_ERROR;
}
-
+ drv_can->can_stat = CAN_INITED;
return RT_EOK;
}
@@ -348,73 +469,54 @@ static rt_err_t hpm_can_control(struct rt_can_device *can, int cmd, void *arg)
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
- RT_ASSERT(drv_can);
+ CAN_GET_DRV(can);
uint32_t arg_val;
rt_err_t err = RT_EOK;
- uint32_t temp;
-
switch (cmd)
{
case RT_DEVICE_CTRL_CLR_INT:
arg_val = (uint32_t) arg;
intc_m_disable_irq(drv_can->irq_num);
- if (arg_val == RT_DEVICE_FLAG_INT_RX)
- {
- uint8_t irq_txrx_mask = CAN_EVENT_RECEIVE | CAN_EVENT_RX_BUF_ALMOST_FULL | CAN_EVENT_RX_BUF_FULL | CAN_EVENT_RX_BUF_OVERRUN;
- drv_can->can_config.irq_txrx_enable_mask &= (uint8_t)~irq_txrx_mask;
- can_disable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
+ if (arg_val & RT_DEVICE_FLAG_INT_RX) {
+ drv_can->can_config.irq_txrx_enable_mask &= (uint8_t)~CAN_RX_IRQ_MASK;
+ can_disable_tx_rx_irq(drv_can->can_base, CAN_RX_IRQ_MASK);
}
- else if (arg_val == RT_DEVICE_FLAG_INT_TX)
- {
- uint8_t irq_txrx_mask = CAN_EVENT_TX_PRIMARY_BUF | CAN_EVENT_TX_SECONDARY_BUF;
- drv_can->can_config.irq_txrx_enable_mask &= (uint8_t)~irq_txrx_mask;
- can_disable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
+ if (arg_val & RT_DEVICE_FLAG_INT_TX) {
+ drv_can->can_config.irq_txrx_enable_mask &= (uint8_t)~CAN_TX_IRQ_MASK;
+ can_disable_tx_rx_irq(drv_can->can_base, CAN_TX_IRQ_MASK);
}
- else if (arg_val == RT_DEVICE_CAN_INT_ERR)
- {
+ if (arg_val & RT_DEVICE_CAN_INT_ERR) {
uint8_t irq_txrx_mask = CAN_EVENT_ERROR;
- uint8_t irq_error_mask = CAN_ERROR_ARBITRATION_LOST_INT_ENABLE | CAN_ERROR_PASSIVE_INT_ENABLE | CAN_ERROR_BUS_ERROR_INT_ENABLE;
drv_can->can_config.irq_txrx_enable_mask &= (uint8_t)~irq_txrx_mask;
- drv_can->can_config.irq_error_enable_mask &= (uint8_t)~irq_error_mask;
+ drv_can->can_config.irq_error_enable_mask &= (uint8_t)~CAN_ERR_IRQ_MASK;
can_disable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
- can_disable_error_irq(drv_can->can_base, irq_error_mask);
- }
- else
- {
+ can_disable_error_irq(drv_can->can_base, CAN_ERR_IRQ_MASK);
+ } else {
err = -RT_ERROR;
}
break;
case RT_DEVICE_CTRL_SET_INT:
arg_val = (uint32_t) arg;
- if (arg_val == RT_DEVICE_FLAG_INT_RX)
- {
- uint8_t irq_txrx_mask = CAN_EVENT_RECEIVE | CAN_EVENT_RX_BUF_ALMOST_FULL | CAN_EVENT_RX_BUF_FULL | CAN_EVENT_RX_BUF_OVERRUN;
- drv_can->can_config.irq_txrx_enable_mask |= irq_txrx_mask;
- can_enable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
+ if (arg_val & RT_DEVICE_FLAG_INT_RX) {
+ drv_can->can_config.irq_txrx_enable_mask |= CAN_RX_IRQ_MASK;
+ can_enable_tx_rx_irq(drv_can->can_base, CAN_RX_IRQ_MASK);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
}
- else if (arg_val == RT_DEVICE_FLAG_INT_TX)
- {
- uint8_t irq_txrx_mask = CAN_EVENT_TX_PRIMARY_BUF | CAN_EVENT_TX_SECONDARY_BUF;
- drv_can->can_config.irq_txrx_enable_mask |= irq_txrx_mask;
- can_enable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
+ if (arg_val & RT_DEVICE_FLAG_INT_TX) {
+ drv_can->can_config.irq_txrx_enable_mask |= CAN_TX_IRQ_MASK;
+ can_enable_tx_rx_irq(drv_can->can_base, CAN_TX_IRQ_MASK);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
}
- else if (arg_val == RT_DEVICE_CAN_INT_ERR)
- {
+ if (arg_val & RT_DEVICE_CAN_INT_ERR) {
uint8_t irq_txrx_mask = CAN_EVENT_ERROR;
- uint8_t irq_error_mask = CAN_ERROR_ARBITRATION_LOST_INT_ENABLE | CAN_ERROR_PASSIVE_INT_ENABLE | CAN_ERROR_BUS_ERROR_INT_ENABLE;
drv_can->can_config.irq_txrx_enable_mask |= irq_txrx_mask;
- drv_can->can_config.irq_error_enable_mask |= irq_error_mask;
+ drv_can->can_config.irq_error_enable_mask |= CAN_ERR_IRQ_MASK;
can_enable_tx_rx_irq(drv_can->can_base, irq_txrx_mask);
- can_enable_error_irq(drv_can->can_base, irq_error_mask);
+ can_enable_error_irq(drv_can->can_base, CAN_ERR_IRQ_MASK);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
- }
- else
- {
+ } else {
err = -RT_ERROR;
}
break;
@@ -520,25 +622,22 @@ static rt_err_t hpm_can_control(struct rt_can_device *can, int cmd, void *arg)
}
break;
case RT_CAN_CMD_GET_STATUS:
- drv_can->can_dev.status.rcverrcnt = can_get_receive_error_count(drv_can->can_base);
- drv_can->can_dev.status.snderrcnt = can_get_transmit_error_count(drv_can->can_base);
- drv_can->can_dev.status.lasterrtype = can_get_last_error_kind(drv_can->can_base);
- temp = can_get_error_interrupt_flags(drv_can->can_base);
- drv_can->can_dev.status.errcode = 0;
- if ((temp & CAN_ERROR_WARNING_LIMIT_FLAG) != 0U)
- {
- drv_can->can_dev.status.errcode |= ERRWARNING;
- }
- if ((temp & CAN_ERROR_PASSIVE_INT_FLAG) != 0U)
- {
- drv_can->can_dev.status.errcode |= ERRPASSIVE;
- }
- if (can_is_in_bus_off_mode(drv_can->can_base))
- {
- drv_can->can_dev.status.errcode |= BUSOFF;
- }
+ can_update_error_status(drv_can);
rt_memcpy(arg, &drv_can->can_dev.status, sizeof(drv_can->can_dev.status));
break;
+ case RT_CAN_CMD_START:
+ arg_val = (rt_uint32_t)arg;
+ if (arg_val == 0) {
+ can_deinit(drv_can->can_base);
+ drv_can->can_stat = CAN_STOPPED;
+ } else {
+ if (can_init(drv_can->can_base, &drv_can->can_config, clock_get_frequency(drv_can->clk_name)) != status_success) {
+ err = -RT_ERROR;
+ } else {
+ drv_can->can_stat = CAN_RUNNING;
+ }
+ }
+ break;
}
return err;
}
@@ -547,11 +646,14 @@ static int hpm_can_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
- RT_ASSERT(drv_can);
+ CAN_GET_DRV(can);
struct rt_can_msg *can_msg = (struct rt_can_msg *) buf;
+ if ((drv_can->can_stat == CAN_UNITED) || (drv_can->can_stat == CAN_STOPPED)) {
+ return -RT_ERROR;
+ }
+
can_transmit_buf_t tx_buf = { 0 };
tx_buf.id = can_msg->id;
if (can_msg->ide == RT_CAN_STDID)
@@ -636,8 +738,7 @@ static int hpm_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t box
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
- RT_ASSERT(drv_can);
+ CAN_GET_DRV(can);
rt_can_msg_t can_msg = (rt_can_msg_t)buf;
@@ -684,6 +785,28 @@ static int hpm_can_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t box
return RT_EOK;
}
+static void can_update_error_status(hpm_can_t *hpm_can)
+{
+ hpm_can->can_dev.status.rcverrcnt = can_get_receive_error_count(hpm_can->can_base);
+ hpm_can->can_dev.status.snderrcnt = can_get_transmit_error_count(hpm_can->can_base);
+ hpm_can->can_dev.status.lasterrtype = can_get_last_error_kind(hpm_can->can_base);
+ hpm_can->can_dev.status.errcode = 0;
+
+ uint32_t temp = can_get_error_interrupt_flags(hpm_can->can_base);
+ if ((temp & CAN_ERROR_WARNING_LIMIT_FLAG) != 0U)
+ {
+ hpm_can->can_dev.status.errcode |= ERRWARNING;
+ }
+ if ((temp & CAN_ERROR_PASSIVE_INT_FLAG) != 0U)
+ {
+ hpm_can->can_dev.status.errcode |= ERRPASSIVE;
+ }
+ if (can_is_in_bus_off_mode(hpm_can->can_base))
+ {
+ hpm_can->can_dev.status.errcode |= BUSOFF;
+ }
+}
+
static uint8_t can_get_data_bytes_from_dlc(uint32_t dlc)
{
uint32_t data_bytes = 0;
@@ -723,25 +846,55 @@ static uint8_t can_get_data_bytes_from_dlc(uint32_t dlc)
return data_bytes;
}
+/* ============================================================================
+ * Driver Initialization
+ * ============================================================================ */
+
+/**
+ * @brief Initialize CAN hardware drivers
+ *
+ * This function initializes all available CAN controllers and registers them
+ * with the RT-Thread device framework. It sets up default configurations
+ * and prepares the hardware for operation.
+ *
+ * @retval RT_EOK Initialization successful
+ */
int rt_hw_can_init(void)
{
+ /* Set up default CAN configuration */
struct can_configure config = CANDEFAULTCONFIG;
- config.privmode = RT_CAN_MODE_NOPRIV;
- config.sndboxnumber = CAN_SENDBOX_NUM;
- config.ticks = 50;
+ config.privmode = RT_CAN_MODE_NOPRIV; /* Disable private mode by default */
+ config.sndboxnumber = CAN_SENDBOX_NUM; /* Set number of send mailboxes */
+ config.ticks = 50; /* Set timeout ticks */
+
#ifdef RT_CAN_USING_HDR
- config.maxhdr = 16;
+ config.maxhdr = 16; /* Set maximum number of hardware filters */
#endif
+
+ /* Initialize each available CAN controller */
for (uint32_t i = 0; i < ARRAY_SIZE(hpm_cans); i++)
{
+ /* Set default configuration */
hpm_cans[i]->can_dev.config = config;
- hpm_cans[i]->filter_num = 0;
+ hpm_cans[i]->filter_num = 0; /* No filters active initially */
+ hpm_cans[i]->can_stat = CAN_UNITED; /* Set initial status */
+
+ /* Get default hardware configuration from HPM SDK */
can_get_default_config(&hpm_cans[i]->can_config);
+
+ /* Register CAN device with RT-Thread */
rt_hw_can_register(&hpm_cans[i]->can_dev, hpm_cans[i]->name, &hpm_can_ops, hpm_cans[i]);
+
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register CAN device to irq table */
+ rt_hw_interrupt_install(hpm_cans[i]->irq_num, (rt_isr_handler_t)hpm_can_isr, hpm_cans[i], hpm_cans[i]->name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
+
return RT_EOK;
}
+/* Register initialization function to be called during system startup */
INIT_BOARD_EXPORT(rt_hw_can_init);
-#endif
+#endif /* RT_USING_CAN */
diff --git a/bsp/hpmicro/libraries/drivers/drv_dao.c b/bsp/hpmicro/libraries/drivers/drv_dao.c
index caa73dd86bba..d81cecf0cd4f 100644
--- a/bsp/hpmicro/libraries/drivers/drv_dao.c
+++ b/bsp/hpmicro/libraries/drivers/drv_dao.c
@@ -109,17 +109,14 @@ static rt_err_t hpm_dao_set_samplerate(uint32_t samplerate)
transfer.sample_rate = samplerate;
bool is_enabled = i2s_is_enabled(DAO_I2S);
if (is_enabled) {
- dma_abort_channel(dma_resource.base, dma_resource.channel);
+ LOG_E("dao_i2s mot support to configure samplerate when dao_i2s is active\n");
+ return -RT_ERROR;
}
if (status_success != i2s_config_tx(DAO_I2S, mclk_hz, &transfer))
{
LOG_E("dao_i2s configure transfer failed\n");
return -RT_ERROR;
}
- if (is_enabled)
- {
- i2s_enable(DAO_I2S);
- }
return RT_EOK;
}
@@ -149,6 +146,7 @@ static rt_err_t hpm_dao_configure(struct rt_audio_device* audio, struct rt_audio
result = -RT_ERROR;
break;
}
+ break;
}
default:
@@ -170,7 +168,10 @@ static rt_err_t hpm_dao_init(struct rt_audio_device* audio)
board_init_dao_clock();
i2s_get_default_config(DAO_I2S, &i2s_config);
- i2s_init(DAO_I2S, &i2s_config);
+ if (status_success != i2s_init(DAO_I2S, &i2s_config)) {
+ LOG_E("dao_i2s init failed\n");
+ return -RT_ERROR;
+ }
i2s_enable_tx_dma_request(DAO_I2S);
mclk_hz = clock_get_frequency(clock_i2s1);
@@ -217,7 +218,11 @@ static rt_err_t hpm_dao_start(struct rt_audio_device* audio, int stream)
}
/* fill 2 dummy data, it is suitable for 1/2 channel of audio */
- i2s_reset_tx(DAO_I2S);
+ if (status_success != i2s_reset_tx(DAO_I2S)) {
+ LOG_E("dao_i2s reset tx failed\n");
+ return -RT_ERROR;
+ }
+ i2s_enable_tx_line(DAO_I2S, DAO_I2S_DATA_LINE);
if (i2s_fill_tx_dummy_data(DAO_I2S, DAO_I2S_DATA_LINE, 2) != status_success) {
return -RT_ERROR;
}
@@ -236,7 +241,7 @@ static rt_err_t hpm_dao_stop(struct rt_audio_device* audio, int stream)
dao_stop(HPM_DAO);
i2s_stop(DAO_I2S);
- dma_abort_channel(dma_resource.base, dma_resource.channel);
+ dma_mgr_abort_chn_transfer(&dma_resource);
dma_mgr_release_resource(&dma_resource);
return RT_EOK;
@@ -257,6 +262,7 @@ static rt_ssize_t hpm_dao_transmit(struct rt_audio_device* audio, const void* wr
ch_config.size_in_byte = size;
ch_config.dst_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
ch_config.src_burst_size = DMA_NUM_TRANSFER_PER_BURST_1T;
+ ch_config.interrupt_mask = DMA_INTERRUPT_MASK_ABORT;
if (l1c_dc_is_enabled()) {
/* cache writeback for sent buff */
diff --git a/bsp/hpmicro/libraries/drivers/drv_enet.c b/bsp/hpmicro/libraries/drivers/drv_enet.c
index 1b5a48b637c3..6ab01d76d204 100644
--- a/bsp/hpmicro/libraries/drivers/drv_enet.c
+++ b/bsp/hpmicro/libraries/drivers/drv_enet.c
@@ -5,21 +5,33 @@
*
* Change Logs:
* Date Author Notes
- * 2022-01-11 HPMicro First version
- * 2022-07-10 HPMicro Driver optimization for multiple instances
- * 2024-04-15 HPMicro Fixed an issue that received data is probabilistically overwritten
+ * 2022-01-11 Jiading First version
+ * 2022-07-10 Jiading Driver optimization for multiple instances
+ * 2025-04-15 Jiading Fixed an issue that received data is probabilistically overwritten
+ * 2025-12-01 Jiading Optimized the driver for PTP initialization
+ * 2026-07-18 Jiading Align ENET HW checksum with RT_LWIP_USING_HW_CHECKSUM
+ * 2026-07-18 Jiading Align ENET ISR and MMC interrupt init with hpm_sdk v1.12.0
+ * 2026-10-08 Jiading Use enet_set_hw_checksum_config() instead of register poke
*/
#include
#ifdef BSP_USING_ETH
+#ifdef LWIP_NO_RX_THREAD
+#error "LWIP_NO_RX_THREAD is not supported in current implementation!"
+#endif
#include
+#include "rtconfig.h"
#include "drv_enet.h"
#include "hpm_otp_drv.h"
+#if defined(LWIP_PTP) && LWIP_PTP
+#include "lwip_ptp_tx_ts.h"
+#include "hpm_soc.h"
+#endif
+
#ifdef BSP_USING_ETH0
-/* cppcheck-suppress-begin unknownMacro */
ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(ENET_SOC_DESC_ADDR_ALIGNMENT)
__RW enet_rx_desc_t enet0_dma_rx_desc_tab[ENET0_RX_BUFF_COUNT]; /* Ethernet0 Rx DMA Descriptor */
@@ -31,7 +43,6 @@ __RW uint8_t enet0_rx_buff[ENET0_RX_BUFF_COUNT][ENET0_RX_BUFF_SIZE]; /* Ethernet
ATTR_PLACE_AT_WITH_ALIGNMENT(".fast_ram", ENET_SOC_BUFF_ADDR_ALIGNMENT)
__RW uint8_t enet0_tx_buff[ENET0_TX_BUFF_COUNT][ENET0_TX_BUFF_SIZE]; /* Ethernet0 Transmit Buffer */
-/* cppcheck-suppress-end unknownMacro */
LWIP_MEMPOOL_DECLARE(enet0_rx_pool, ENET0_RX_BUFF_COUNT, sizeof(my_custom_pbuf_t), "Custom RX PBUF pool");
static enet_frame_t enet0_frame[ENET0_RX_BUFF_COUNT] = {0};
@@ -50,10 +61,7 @@ static enet_buff_config_t enet0_tx_buff_cfg = {.buffer = (uint32_t)enet0_tx_buff
#if defined(__USE_ENET_PTP) && __USE_ENET_PTP
static enet_ptp_ts_update_t ptp_timestamp0 = {0, 0};
-static enet_ptp_config_t ptp_config0 = {.timestamp_rollover_mode = enet_ts_dig_rollover_control,
- .update_method = enet_ptp_time_fine_update,
- .addend = 0xffffffff,
- };
+static enet_ptp_config_t ptp_config0 = {.update_method = enet_ptp_time_fine_update};
#endif
static hpm_enet_t enet0 = {.name = "E0",
@@ -90,7 +98,6 @@ mac_init_t mac_init[] = {
#ifdef BSP_USING_ETH1
-/* cppcheck-suppress-begin unknownMacro */
ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(ENET_SOC_DESC_ADDR_ALIGNMENT)
__RW enet_rx_desc_t enet1_dma_rx_desc_tab[ENET1_RX_BUFF_COUNT]; /* Ethernet1 Rx DMA Descriptor */
@@ -102,7 +109,6 @@ __RW uint8_t enet1_rx_buff[ENET1_RX_BUFF_COUNT][ENET1_RX_BUFF_SIZE]; /* Ethernet
ATTR_PLACE_AT_WITH_ALIGNMENT(".fast_ram", ENET_SOC_BUFF_ADDR_ALIGNMENT)
__RW uint8_t enet1_tx_buff[ENET1_TX_BUFF_COUNT][ENET1_TX_BUFF_SIZE]; /* Ethernet1 Transmit Buffer */
-/* cppcheck-suppress-end unknownMacro */
LWIP_MEMPOOL_DECLARE(enet1_rx_pool, ENET1_RX_BUFF_COUNT, sizeof(my_custom_pbuf_t), "Custom RX PBUF pool");
static enet_frame_t enet1_frame[ENET1_RX_BUFF_COUNT] = {0};
@@ -121,10 +127,7 @@ static enet_buff_config_t enet1_tx_buff_cfg = {.buffer = (uint32_t)enet1_tx_buff
#if defined(__USE_ENET_PTP) && __USE_ENET_PTP
static enet_ptp_ts_update_t ptp_timestamp1 = {0, 0};
-static enet_ptp_config_t ptp_config1 = {.timestamp_rollover_mode = enet_ts_dig_rollover_control,
- .update_method = enet_ptp_time_fine_update,
- .addend = 0xffffffff,
- };
+static enet_ptp_config_t ptp_config1 = {.update_method = enet_ptp_time_fine_update};
#endif
static hpm_enet_t enet1 = {.name = "E1",
@@ -182,7 +185,7 @@ void free_rx_dma_descriptor(void *p)
/* Clear Segment_Count */
frame->seg = 0;
- frame->free = 0;
+ frame->used = 0;
}
#ifdef BSP_USING_ETH0
@@ -252,12 +255,14 @@ ATTR_WEAK uint8_t enet_get_mac_address(ENET_Type *ptr, uint8_t *mac)
}
/* load MAC address from MACRO definitions */
- memcpy(mac, &mac_init[i], ENET_MAC);
+ memcpy(mac, &mac_init[i], ENET_MAC_SIZE);
return ENET_MAC_ADDR_FROM_MACRO;
}
static rt_err_t hpm_enet_init(enet_device *init)
{
+ enet_hw_checksum_config_t hw_cksum_cfg;
+
if (init->media_interface == enet_inf_rmii)
{
/* Initialize reference clock */
@@ -277,6 +282,15 @@ static rt_err_t hpm_enet_init(enet_device *init)
/* Initialize eth controller */
enet_controller_init(init->instance, init->media_interface, &init->desc, &init->mac_config, &init->int_config);
+ enet_get_default_tx_control_config(init->instance, &init->desc.tx_control_config);
+
+#ifdef RT_LWIP_USING_HW_CHECKSUM
+ enet_get_default_hw_checksum_config(&hw_cksum_cfg, true);
+#else
+ enet_get_default_hw_checksum_config(&hw_cksum_cfg, false);
+#endif
+ enet_set_hw_checksum_config(init->instance, &init->desc.tx_control_config, &hw_cksum_cfg);
+
/* Disable LPI interrupt */
enet_disable_lpi_interrupt(init->instance);
@@ -284,12 +298,8 @@ static rt_err_t hpm_enet_init(enet_device *init)
/* initialize PTP Clock */
board_init_enet_ptp_clock(init->instance);
- /* initialize Ethernet PTP Module */
- init->ptp_config.ssinc = ENET_ONE_SEC_IN_NANOSEC / clock_get_frequency(init->ptp_clk_src);
+ /* initialize ptp timer, the config is prepared in rt_hw_eth_init() */
enet_init_ptp(init->instance, &init->ptp_config);
-
- /* set the initial timestamp */
- enet_set_ptp_timestamp(init->instance, &init->ptp_timestamp);
#endif
/* enable irq */
@@ -300,7 +310,7 @@ static rt_err_t hpm_enet_init(enet_device *init)
static rt_err_t rt_hpm_eth_init(rt_device_t dev)
{
- uint8_t mac[ENET_MAC];
+ uint8_t mac[ENET_MAC_SIZE];
enet_device *enet_dev = (enet_device *)dev->user_data;
@@ -362,7 +372,7 @@ static rt_err_t rt_hpm_eth_control(rt_device_t dev, int cmd, void * args)
if (args != NULL)
{
enet_get_mac_address(enet_dev->instance, (uint8_t *)mac);
- SMEMCPY(args, mac, ENET_MAC);
+ SMEMCPY(args, mac, ENET_MAC_SIZE);
}
else
{
@@ -463,7 +473,30 @@ static rt_err_t rt_hpm_eth_tx(rt_device_t dev, struct pbuf * p)
LOG_D("The length of the transmitted frame: %d\n", frame_length);
frame_length += 4;
- status = enet_prepare_transmission_descriptors(enet_dev->instance, &enet_dev->desc.tx_desc_list_cur, frame_length, enet_dev->desc.tx_buff_cfg.size);
+#if defined(LWIP_PTP) && LWIP_PTP
+ {
+ enet_ptp_ts_system_t timestamp;
+ enet_tx_control_config_t tx_cfg = enet_dev->desc.tx_control_config;
+
+ tx_cfg.enable_ttse = lwip_ptp_frame_needs_tx_hw_timestamp(p);
+ status = enet_prepare_tx_desc_with_ts_record(enet_dev->instance,
+ &enet_dev->desc.tx_desc_list_cur,
+ &tx_cfg,
+ frame_length,
+ enet_dev->desc.tx_buff_cfg.size,
+ ×tamp);
+ if (tx_cfg.enable_ttse) {
+ p->time_sec = timestamp.sec;
+ p->time_nsec = timestamp.nsec;
+ }
+ }
+#else
+ status = enet_prepare_tx_desc(enet_dev->instance,
+ &enet_dev->desc.tx_desc_list_cur,
+ &enet_dev->desc.tx_control_config,
+ frame_length,
+ enet_dev->desc.tx_buff_cfg.size);
+#endif
if (status != ENET_SUCCESS)
{
LOG_E("Ethernet controller transmit unsuccessfully: %d\n", status);
@@ -486,8 +519,8 @@ static struct pbuf *rt_hpm_eth_rx(rt_device_t dev)
uint32_t i = 0;
/* Get a received frame */
- RT_ASSERT(!enet_dev->frame[enet_dev->cnt].free);
- if (enet_dev->frame[enet_dev->cnt].free == 0) {
+ RT_ASSERT(!enet_dev->frame[enet_dev->cnt].used);
+ if (enet_dev->frame[enet_dev->cnt].used == 0) {
enet_dev->frame[enet_dev->cnt] = enet_get_received_frame_interrupt(&enet_dev->desc.rx_desc_list_cur, &enet_dev->desc.rx_frame_info, enet_dev->desc.rx_buff_cfg.count);
} else {
return p;
@@ -500,7 +533,7 @@ static struct pbuf *rt_hpm_eth_rx(rt_device_t dev)
if (len > 0)
{
- enet_dev->frame[enet_dev->cnt].free = 1;
+ enet_dev->frame[enet_dev->cnt].used = 1;
#ifdef BSP_USING_ETH0
if (enet_dev->instance == HPM_ENET0) {
@@ -508,6 +541,16 @@ static struct pbuf *rt_hpm_eth_rx(rt_device_t dev)
my_pbuf->p.custom_free_function = enet0_pbuf_free_custom;
my_pbuf->dma_descriptor = (void *)&enet_dev->frame[enet_dev->cnt];
p = pbuf_alloced_custom(PBUF_RAW, enet_dev->frame[enet_dev->cnt].length, PBUF_REF, &my_pbuf->p, buffer, enet_dev->desc.rx_buff_cfg.size);
+#if defined(LWIP_PTP) && LWIP_PTP
+ if (p != NULL) {
+ enet_rx_desc_t *rx_desc = enet_dev->frame[enet_dev->cnt].rx_desc;
+
+ if (rx_desc != NULL) {
+ p->time_sec = rx_desc->rdes7_bm.rtsh;
+ p->time_nsec = rx_desc->rdes6_bm.rtsl;
+ }
+ }
+#endif
enet_dev->cnt = ++enet_dev->cnt % enet_dev->desc.rx_buff_cfg.count;
}
#endif
@@ -518,6 +561,16 @@ static struct pbuf *rt_hpm_eth_rx(rt_device_t dev)
my_pbuf->p.custom_free_function = enet1_pbuf_free_custom;
my_pbuf->dma_descriptor = (void *)&enet_dev->frame[enet_dev->cnt];
p = pbuf_alloced_custom(PBUF_RAW, enet_dev->frame[enet_dev->cnt].length, PBUF_REF, &my_pbuf->p, buffer, enet_dev->desc.rx_buff_cfg.size);
+#if defined(LWIP_PTP) && LWIP_PTP
+ if (p != NULL) {
+ enet_rx_desc_t *rx_desc = enet_dev->frame[enet_dev->cnt].rx_desc;
+
+ if (rx_desc != NULL) {
+ p->time_sec = rx_desc->rdes7_bm.rtsh;
+ p->time_nsec = rx_desc->rdes6_bm.rtsl;
+ }
+ }
+#endif
enet_dev->cnt = ++enet_dev->cnt % enet_dev->desc.rx_buff_cfg.count;
}
#endif
@@ -541,22 +594,42 @@ static void eth_rx_callback(struct eth_device* dev)
}
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void isr_enet(hpm_enet_t *obj)
+#else
+void isr_enet(int vector, hpm_enet_t *obj)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
uint32_t status;
+ uint32_t rxgbfrmis;
+ uint32_t intr_status;
+ ENET_Type *ptr = obj->base;
- status = obj->base->DMA_STATUS;
+ status = ptr->DMA_STATUS;
+ rxgbfrmis = ptr->MMC_INTR_RX;
+ intr_status = ptr->INTR_STATUS;
if (ENET_DMA_STATUS_GLPII_GET(status)) {
- (void)obj->base->LPI_CSR;
+ /* read LPI_CSR to clear interrupt status */
+ ptr->LPI_CSR;
+ }
+
+ if (ENET_INTR_STATUS_RGSMIIIS_GET(intr_status)) {
+ /* read XMII_CSR to clear interrupt status */
+ ptr->XMII_CSR;
}
if (ENET_DMA_STATUS_RI_GET(status)) {
- obj->base->DMA_STATUS |= ENET_DMA_STATUS_RI_SET(ENET_DMA_STATUS_RI_GET(status));
eth_rx_callback(obj->eth_dev);
+ ptr->DMA_STATUS |= ENET_DMA_STATUS_RI_MASK;
+ }
+
+ if (ENET_MMC_INTR_RX_RXCTRLFIS_GET(rxgbfrmis)) {
+ ptr->RXFRAMECOUNT_GB;
}
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
#ifdef BSP_USING_ETH0
SDK_DECLARE_EXT_ISR_M(IRQn_ENET0, isr_enet0)
void isr_enet0(void)
@@ -572,6 +645,7 @@ void isr_enet1(void)
isr_enet(&enet1);
}
#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
int rt_hw_eth_init(void)
{
@@ -591,10 +665,8 @@ int rt_hw_eth_init(void)
memset((uint8_t *)s_geths[i]->dma_rx_desc_tab, 0x00, sizeof(enet_rx_desc_t) * s_geths[i]->rx_buff_cfg->count);
memset((uint8_t *)s_geths[i]->dma_tx_desc_tab, 0x00, sizeof(enet_tx_desc_t) * s_geths[i]->tx_buff_cfg->count);
- memset((uint8_t *)s_geths[i]->rx_buff_cfg->buffer, 0x00,
- s_geths[i]->rx_buff_cfg->count * s_geths[i]->rx_buff_cfg->size);
- memset((uint8_t *)s_geths[i]->tx_buff_cfg->buffer, 0x00,
- s_geths[i]->tx_buff_cfg->count * s_geths[i]->tx_buff_cfg->size);
+ memset((uint8_t *)s_geths[i]->rx_buff_cfg->buffer, 0x00, sizeof(s_geths[i]->rx_buff_cfg->size));
+ memset((uint8_t *)s_geths[i]->tx_buff_cfg->buffer, 0x00, sizeof(s_geths[i]->tx_buff_cfg->size));
/* Set list heads */
s_geths[i]->enet_dev->desc.tx_desc_list_head = (enet_tx_desc_t *)core_local_mem_to_sys_address(BOARD_RUNNING_CORE, (uint32_t)s_geths[i]->dma_tx_desc_tab);
@@ -634,8 +706,16 @@ int rt_hw_eth_init(void)
#if defined(__USE_ENET_PTP) && __USE_ENET_PTP
/* Set PTP function */
s_geths[i]->enet_dev->ptp_clk_src = s_geths[i]->ptp_clk_src;
- s_geths[i]->enet_dev->ptp_config = *s_geths[i]->ptp_config;
s_geths[i]->enet_dev->ptp_timestamp = *s_geths[i]->ptp_timestamp;
+
+ /* Runtime defaults: ssinc is derived from the real PTP clock frequency */
+ enet_get_default_ptp_config(s_geths[i]->enet_dev->instance,
+ clock_get_frequency(s_geths[i]->ptp_clk_src),
+ &s_geths[i]->enet_dev->ptp_config);
+ /* Board config overrides the runtime default */
+ s_geths[i]->enet_dev->ptp_config.update_method = s_geths[i]->ptp_config->update_method;
+ /* enet_init_ptp() requires a valid timestamp pointer */
+ s_geths[i]->enet_dev->ptp_config.ptp_timestamp = &s_geths[i]->enet_dev->ptp_timestamp;
#endif
/* Set the irq number */
@@ -658,6 +738,11 @@ int rt_hw_eth_init(void)
s_geths[i]->eth_dev->eth_rx = rt_hpm_eth_rx;
s_geths[i]->eth_dev->eth_tx = rt_hpm_eth_tx;
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register ENET device to irq table */
+ rt_hw_interrupt_install(s_geths[i]->irq_num, (rt_isr_handler_t)isr_enet, s_geths[i], s_geths[i]->name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
err = eth_device_init(s_geths[i]->eth_dev, s_geths[i]->name);
if (RT_EOK == err)
diff --git a/bsp/hpmicro/libraries/drivers/drv_enet.h b/bsp/hpmicro/libraries/drivers/drv_enet.h
index c8137e365d48..298598500842 100644
--- a/bsp/hpmicro/libraries/drivers/drv_enet.h
+++ b/bsp/hpmicro/libraries/drivers/drv_enet.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021-2022 HPMicro
+ * Copyright (c) 2021-2025 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -11,6 +11,15 @@
#include
#include "hpm_enet_drv.h"
#include "board.h"
+#include "rtt_board.h"
+#include "lwip/sys.h"
+
+#if defined(LWIP_SUPPORT_CUSTOM_PBUF) && LWIP_SUPPORT_CUSTOM_PBUF
+typedef struct my_custom_pbuf {
+ struct pbuf_custom p;
+ void *dma_descriptor;
+} my_custom_pbuf_t;
+#endif
typedef enum {
ENET_MAC_ADDR_PARA_ERROR = -1,
@@ -30,6 +39,7 @@ typedef struct {
typedef struct {
ENET_Type * instance;
+ clock_name_t clock_name;
enet_desc_t desc;
enet_mac_config_t mac_config;
uint8_t media_interface;
@@ -38,7 +48,9 @@ typedef struct {
uint8_t tx_delay;
uint8_t rx_delay;
enet_int_config_t int_config;
-#if __USE_ENET_PTP
+ enet_frame_t *frame;
+ int cnt;
+#if defined(__USE_ENET_PTP) && __USE_ENET_PTP
bool ptp_enable;
uint32_t ptp_clk_src;
enet_ptp_config_t ptp_config;
@@ -62,7 +74,9 @@ typedef struct _hpm_enet
uint8_t tx_delay;
uint8_t rx_delay;
bool int_refclk;
-#if __USE_ENET_PTP
+ enet_frame_t *frame;
+ int cnt;
+#if defined(__USE_ENET_PTP) && __USE_ENET_PTP
bool ptp_enable;
uint32_t ptp_clk_src;
enet_ptp_config_t *ptp_config;
@@ -82,15 +96,7 @@ typedef struct _hpm_enet
MAC[4] == 0 && \
MAC[5] == 0)
-#if ENET_SOC_RGMII_EN
-#ifndef ENET0_TX_BUFF_COUNT
-#define ENET0_TX_BUFF_COUNT (50U)
-#endif
-#ifndef ENET0_RX_BUFF_COUNT
-#define ENET0_RX_BUFF_COUNT (60U)
-#endif
-#else
#ifndef ENET0_TX_BUFF_COUNT
#define ENET0_TX_BUFF_COUNT (10U)
#endif
@@ -98,14 +104,13 @@ typedef struct _hpm_enet
#ifndef ENET0_RX_BUFF_COUNT
#define ENET0_RX_BUFF_COUNT (20U)
#endif
-#endif
#ifndef ENET0_RX_BUFF_SIZE
-#define ENET0_RX_BUFF_SIZE ENET_MAX_FRAME_SIZE
+#define ENET0_RX_BUFF_SIZE (1536U)
#endif
#ifndef ENET0_TX_BUFF_SIZE
-#define ENET0_TX_BUFF_SIZE ENET_MAX_FRAME_SIZE
+#define ENET0_TX_BUFF_SIZE (1536U)
#endif
#ifndef ENET1_TX_BUFF_COUNT
@@ -113,15 +118,15 @@ typedef struct _hpm_enet
#endif
#ifndef ENET1_RX_BUFF_COUNT
-#define ENET1_RX_BUFF_COUNT (30U)
+#define ENET1_RX_BUFF_COUNT (20U)
#endif
#ifndef ENET1_RX_BUFF_SIZE
-#define ENET1_RX_BUFF_SIZE ENET_MAX_FRAME_SIZE
+#define ENET1_RX_BUFF_SIZE (1536U)
#endif
#ifndef ENET1_TX_BUFF_SIZE
-#define ENET1_TX_BUFF_SIZE ENET_MAX_FRAME_SIZE
+#define ENET1_TX_BUFF_SIZE (1536U)
#endif
#ifndef MAC0_ADDR0
diff --git a/bsp/hpmicro/libraries/drivers/drv_enet_phy.c b/bsp/hpmicro/libraries/drivers/drv_enet_phy.c
index 0e809a256462..d30afbdb0eed 100644
--- a/bsp/hpmicro/libraries/drivers/drv_enet_phy.c
+++ b/bsp/hpmicro/libraries/drivers/drv_enet_phy.c
@@ -7,6 +7,7 @@
* Date Author Notes
* 2023-12-20 Jiading Optimization for all-in-one version
* 2024-04-17 Jiading Support multiple PHYs
+ * 2026-09-28 Jiading Wait for enet_phy_speed_valid before announcing link-up
*/
#include "rtthread.h"
@@ -18,12 +19,13 @@
#ifdef RT_USING_PHY
#include
#include
-#include "hpm_enet_drv.h"
+#include "drv_enet.h"
#include "drv_enet_phy.h"
#include "hpm_enet_phy.h"
#include "hpm_soc.h"
#include "netif/ethernetif.h"
#include "board.h"
+#include "hpm_enet_drv.h"
typedef struct
{
@@ -117,9 +119,9 @@ static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t sr
{
rtl8211_config_t phy_config;
- rtl8211_reset((ENET_Type *)object);
+ rtl8211_reset((ENET_Type *)object, RTL8211_ADDR);
rtl8211_basic_mode_default_config((ENET_Type *)object, &phy_config);
- if (rtl8211_basic_mode_init((ENET_Type *)object, &phy_config) == true) {
+ if (rtl8211_basic_mode_init((ENET_Type *)object, RTL8211_ADDR, &phy_config) == true) {
return PHY_STATUS_OK;
} else {
return PHY_STATUS_FAIL;
@@ -131,10 +133,11 @@ static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t sr
if ((ENET_Type *)object == HPM_ENET0)
{
rtl8201_config_t phy_config;
-
- rtl8201_reset((ENET_Type *)object);
+ rtl8201_reset((ENET_Type *)object, RTL8201_ADDR);
rtl8201_basic_mode_default_config((ENET_Type *)object, &phy_config);
- if (rtl8201_basic_mode_init((ENET_Type *)object, &phy_config) == true) {
+ phy_config.media_interface = ((enet_device *)eth0_phy_handle.eth_dev->parent.user_data)->media_interface;
+ phy_config.rmii_refclk_dir = ((enet_device *)eth0_phy_handle.eth_dev->parent.user_data)->int_refclk;
+ if (rtl8201_basic_mode_init((ENET_Type *)object, RTL8201_ADDR, &phy_config) == true) {
return PHY_STATUS_OK;
} else {
return PHY_STATUS_FAIL;
@@ -162,9 +165,11 @@ static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t sr
{
rtl8201_config_t phy_config;
- rtl8201_reset((ENET_Type *)object);
+ rtl8201_reset((ENET_Type *)object, RTL8201_ADDR);
rtl8201_basic_mode_default_config((ENET_Type *)object, &phy_config);
- if (rtl8201_basic_mode_init((ENET_Type *)object, &phy_config) == true) {
+ phy_config.media_interface = ((enet_device *)eth1_phy_handle.eth_dev->parent.user_data)->media_interface;
+ phy_config.rmii_refclk_dir = ((enet_device *)eth1_phy_handle.eth_dev->parent.user_data)->int_refclk;
+ if (rtl8201_basic_mode_init((ENET_Type *)object, RTL8201_ADDR, &phy_config) == true) {
return PHY_STATUS_OK;
} else {
return PHY_STATUS_FAIL;
@@ -177,20 +182,22 @@ static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t sr
{
lan8720_config_t phy_config;
- lan8720_reset((ENET_Type *)object);
+ lan8720_reset((ENET_Type *)object, LAN8720_ADDR);
lan8720_basic_mode_default_config((ENET_Type *)object, &phy_config);
- if (lan8720_basic_mode_init((ENET_Type *)object, &phy_config) == true) {
+ if (lan8720_basic_mode_init((ENET_Type *)object, LAN8720_ADDR, &phy_config) == true) {
return PHY_STATUS_OK;
} else {
return PHY_STATUS_FAIL;
}
}
#endif
+
+ return PHY_STATUS_FAIL;
}
static rt_size_t phy_read(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size)
{
- *(uint16_t *)data = enet_read_phy(((struct rt_mdio_bus *)bus)->hw_obj, addr, reg);
+ enet_read_phy(((struct rt_mdio_bus *)bus)->hw_obj, addr, reg, (uint16_t *)data);
return size;
}
@@ -202,22 +209,24 @@ static rt_size_t phy_write(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *d
return size;
}
-static rt_phy_status phy_get_link_status(rt_phy_t *phy, rt_bool_t *status)
+static rt_phy_status phy_query_status(rt_phy_t *phy, enet_phy_status_t *phy_status)
{
- enet_phy_status_t phy_status = {0};
+ hpm_stat_t stat = status_fail;
+
+ *phy_status = (enet_phy_status_t){0};
if (phy->bus->hw_obj == HPM_ENET0)
{
#if defined(__USE_DP83867) && __USE_DP83867
- dp83867_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = dp83867_get_phy_status(phy->bus->hw_obj, DP83867_ADDR, phy_status);
#endif
#if defined(__USE_RTL8211) && __USE_RTL8211
- rtl8211_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = rtl8211_get_phy_status(phy->bus->hw_obj, RTL8211_ADDR, phy_status);
#endif
#if defined(__USE_RTL8201) && __USE_RTL8201 && !defined(BSP_USING_ETH1)
- rtl8201_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = rtl8201_get_phy_status(phy->bus->hw_obj, RTL8201_ADDR, phy_status);
#endif
}
@@ -225,59 +234,63 @@ static rt_phy_status phy_get_link_status(rt_phy_t *phy, rt_bool_t *status)
if (phy->bus->hw_obj == HPM_ENET1)
{
#if defined(__USE_DP83848) && __USE_DP83848
- dp83848_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = dp83848_get_phy_status(phy->bus->hw_obj, DP83848_ADDR, phy_status);
#endif
#if defined(__USE_RTL8201) && __USE_RTL8201
- rtl8201_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = rtl8201_get_phy_status(phy->bus->hw_obj, RTL8201_ADDR, phy_status);
#endif
#if defined(__USE_LAN8720) && __USE_LAN8720
- lan8720_get_phy_status(phy->bus->hw_obj, &phy_status);
+ stat = lan8720_get_phy_status(phy->bus->hw_obj, LAN8720_ADDR, phy_status);
#endif
}
#endif
- *status = phy_status.enet_phy_link;
+ if (stat != status_success) {
+ return PHY_STATUS_FAIL;
+ }
return PHY_STATUS_OK;
}
-static rt_phy_status phy_get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
+static void phy_apply_mac(ENET_Type *instance, const phy_info_t *phy_info)
{
- enet_phy_status_t phy_status;
+ enet_line_speed_t line_speed[] = {enet_line_speed_10mbps, enet_line_speed_100mbps, enet_line_speed_1000mbps};
- if (phy->bus->hw_obj == HPM_ENET0)
- {
- #if defined(__USE_DP83867) && __USE_DP83867
- dp83867_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+ if (phy_info->phy_speed >= ARRAY_SIZE(line_speed)) {
+ return;
+ }
- #if defined(__USE_RTL8211) && __USE_RTL8211
- rtl8211_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+ enet_set_line_speed(instance, line_speed[phy_info->phy_speed]);
+ enet_set_duplex_mode(instance, phy_info->phy_duplex);
+}
- #if defined(__USE_RTL8201) && __USE_RTL8201 && !defined(BSP_USING_ETH1)
- rtl8201_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+static rt_phy_status phy_get_link_status(rt_phy_t *phy, rt_bool_t *status)
+{
+ enet_phy_status_t phy_status;
+
+ if (phy_query_status(phy, &phy_status) != PHY_STATUS_OK) {
+ *status = RT_FALSE;
+ return PHY_STATUS_FAIL;
}
-#if defined(HPM_ENET1_BASE)
- if (phy->bus->hw_obj == HPM_ENET1)
- {
- #if defined(__USE_DP83848) && __USE_DP83848
- dp83848_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+ *status = (phy_status.enet_phy_link == enet_phy_link_up) ? RT_TRUE : RT_FALSE;
- #if defined(__USE_RTL8201) && __USE_RTL8201
- rtl8201_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+ return PHY_STATUS_OK;
+}
- #if defined(__USE_LAN8720) && __USE_LAN8720
- lan8720_get_phy_status(phy->bus->hw_obj, &phy_status);
- #endif
+static rt_phy_status phy_get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
+{
+ enet_phy_status_t phy_status;
+
+ if (phy_query_status(phy, &phy_status) != PHY_STATUS_OK) {
+ return PHY_STATUS_FAIL;
+ }
+
+ if (!enet_phy_link_up_with_valid_speed(&phy_status)) {
+ return PHY_STATUS_FAIL;
}
-#endif
*speed = phy_status.enet_phy_speed;
*duplex = phy_status.enet_phy_duplex;
@@ -289,15 +302,10 @@ static void phy_poll_status(void *parameter)
{
int ret;
phy_info_t phy_info;
- rt_bool_t status;
- rt_device_t dev;
- rt_phy_msg_t msg;
- rt_uint32_t speed, duplex;
+ enet_phy_status_t phy_status;
phy_device_t *phy_dev;
- struct eth_device* eth_dev;
+ struct eth_device *eth_dev;
char const *ps[] = {"10Mbps", "100Mbps", "1000Mbps"};
- enet_line_speed_t line_speed[] = {enet_line_speed_10mbps, enet_line_speed_100mbps, enet_line_speed_1000mbps};
-
eth_phy_monitor_handle_t *phy_monitor_handle = (eth_phy_monitor_handle_t *)parameter;
for (uint32_t i = 0; i < phy_monitor_handle->phy_handle_cnt; i++)
@@ -305,33 +313,52 @@ static void phy_poll_status(void *parameter)
eth_dev = phy_monitor_handle->phy_handle[i]->eth_dev;
phy_dev = phy_monitor_handle->phy_handle[i]->phy_dev;
- phy_dev->phy.ops->get_link_status(&phy_dev->phy, &status);
+ if (phy_dev->phy.ops == NULL) {
+ LOG_E("phy.ops is NULL! Please check your initialization of phy.ops in phy_device_register()!\n");
+ return;
+ }
- if (status)
- {
- phy_dev->phy.ops->get_link_speed_duplex(&phy_dev->phy, &phy_info.phy_speed, &phy_info.phy_duplex);
+ if (phy_query_status(&phy_dev->phy, &phy_status) != PHY_STATUS_OK) {
+ continue;
+ }
- ret = memcmp(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
- if (ret != 0)
- {
- memcpy(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (phy_status.enet_phy_link == enet_phy_link_down) {
+ if (phy_dev->phy_link != PHY_LINK_DOWN) {
+ phy_dev->phy_link = PHY_LINK_DOWN;
+ eth_device_linkchange(eth_dev, RT_FALSE);
+ LOG_I("%s", phy_dev->phy.bus->hw_obj == HPM_ENET0 ? "ENET0" : "ENET1");
+ LOG_I("PHY Status: %s", "Link down\n");
}
+ continue;
}
- if (phy_dev->phy_link != status)
- {
- phy_dev->phy_link = status ? PHY_LINK_UP : PHY_LINK_DOWN;
- eth_device_linkchange(eth_dev, status);
- LOG_I("%s", phy_dev->phy.bus->hw_obj == HPM_ENET0 ? "ENET0" : "ENET1");
- LOG_I("PHY Status: %s", status ? "Link up" : "Link down\n");
- if (status == PHY_LINK_UP)
- {
+ if (!enet_phy_link_up_with_valid_speed(&phy_status)) {
+ continue;
+ }
+
+ phy_info.phy_speed = phy_status.enet_phy_speed;
+ phy_info.phy_duplex = phy_status.enet_phy_duplex;
+
+ ret = memcmp(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (ret != 0) {
+ memcpy(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (phy_dev->phy_link == PHY_LINK_UP) {
+ phy_apply_mac(phy_monitor_handle->phy_handle[i]->instance, &phy_dev->phy_info);
+ LOG_I("%s", phy_dev->phy.bus->hw_obj == HPM_ENET0 ? "ENET0" : "ENET1");
LOG_I("PHY Speed: %s", ps[phy_dev->phy_info.phy_speed]);
LOG_I("PHY Duplex: %s\n", phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX ? "full duplex" : "half duplex");
- enet_set_line_speed(phy_monitor_handle->phy_handle[i]->instance, line_speed[phy_dev->phy_info.phy_speed]);
- enet_set_duplex_mode(phy_monitor_handle->phy_handle[i]->instance, phy_dev->phy_info.phy_duplex);
}
}
+
+ if (phy_dev->phy_link != PHY_LINK_UP) {
+ phy_dev->phy_link = PHY_LINK_UP;
+ eth_device_linkchange(eth_dev, RT_TRUE);
+ LOG_I("%s", phy_dev->phy.bus->hw_obj == HPM_ENET0 ? "ENET0" : "ENET1");
+ LOG_I("PHY Status: %s", "Link up");
+ LOG_I("PHY Speed: %s", ps[phy_dev->phy_info.phy_speed]);
+ LOG_I("PHY Duplex: %s\n", phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX ? "full duplex" : "half duplex");
+ phy_apply_mac(phy_monitor_handle->phy_handle[i]->instance, &phy_dev->phy_info);
+ }
}
}
@@ -343,9 +370,6 @@ static void phy_detection(void *parameter)
{
LOG_E("No any PHY device is detected! Please check your hardware!\n");
}
-
- return;
-
}
static void phy_monitor_thread_entry(void *args)
@@ -372,6 +396,7 @@ int phy_device_register(void)
{
rt_err_t err = -RT_ERROR;
rt_thread_t thread_phy_monitor;
+ char phy_dev_name[8]={0};
/* Set ops for PHY */
phy_ops.init = phy_init;
@@ -383,7 +408,7 @@ int phy_device_register(void)
/* Set PHY address */
s_gphys[i]->phy_dev->phy.addr = 0xffff;
- /* Set MIDO bus */
+ /* Set MDIO bus */
s_gphys[i]->mdio_bus->hw_obj = s_gphys[i]->instance;
s_gphys[i]->mdio_bus->name = s_gphys[i]->mdio_name;
s_gphys[i]->mdio_bus->ops->read = phy_read;
@@ -391,7 +416,8 @@ int phy_device_register(void)
s_gphys[i]->phy_dev->phy.bus = s_gphys[i]->mdio_bus;
s_gphys[i]->phy_dev->phy.ops = &phy_ops;
- rt_hw_phy_register(&s_gphys[i]->phy_dev->phy, NULL);
+ sprintf(phy_dev_name, "PHYDev%d", i);
+ rt_hw_phy_register(&s_gphys[i]->phy_dev->phy, phy_dev_name);
}
/* Start PHY monitor */
@@ -400,6 +426,7 @@ int phy_device_register(void)
if (thread_phy_monitor != RT_NULL)
{
rt_thread_startup(thread_phy_monitor);
+ err = RT_EOK;
}
else
{
diff --git a/bsp/hpmicro/libraries/drivers/drv_ewdt.c b/bsp/hpmicro/libraries/drivers/drv_ewdt.c
index 02496c2c36c4..6cd06aa69150 100644
--- a/bsp/hpmicro/libraries/drivers/drv_ewdt.c
+++ b/bsp/hpmicro/libraries/drivers/drv_ewdt.c
@@ -14,7 +14,6 @@
#include "hpm_sysctl_drv.h"
-
#ifdef BSP_USING_EWDG
#define EWDG_CNT_CLK_FREQ 32768UL
@@ -35,83 +34,87 @@ static rt_err_t hpm_wdog_close(rt_watchdog_t *wdt);
static rt_err_t hpm_wdog_refresh(rt_watchdog_t *wdt);
static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args);
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_wdog_isr(rt_watchdog_t *wdt);
+/* Macro to declare watchdog device and ISR handler */
+#define HPM_EWDG_DECLARE_DEVICE_ISR(idx) \
+ rt_watchdog_t wdog##idx; \
+ SDK_DECLARE_EXT_ISR_M(IRQn_EWDG##idx, wdog##idx##_isr) \
+ void wdog##idx##_isr(void) \
+ { \
+ hpm_wdog_isr(&wdog##idx); \
+ }
+
#if defined(BSP_USING_EWDG0)
-rt_watchdog_t wdog0;
-SDK_DECLARE_EXT_ISR_M(IRQn_EWDG0, wdog0_isr)
-void wdog0_isr(void)
-{
- hpm_wdog_isr(&wdog0);
-}
+HPM_EWDG_DECLARE_DEVICE_ISR(0)
#endif
#if defined(BSP_USING_EWDG1)
-rt_watchdog_t wdog1;
-SDK_DECLARE_EXT_ISR_M(IRQn_EWDG1, wdog1_isr)
-void wdog1_isr(void)
-{
- hpm_wdog_isr(&wdog1);
-}
+HPM_EWDG_DECLARE_DEVICE_ISR(1)
#endif
#if defined(BSP_USING_EWDG2)
-rt_watchdog_t wdog2;
-SDK_DECLARE_EXT_ISR_M(IRQn_EWDG2, wdog2_isr)
-void wdog2_isr(void)
-{
- hpm_wdog_isr(&wdog2);
-}
+HPM_EWDG_DECLARE_DEVICE_ISR(2)
#endif
#if defined(BSP_USING_EWDG3)
+HPM_EWDG_DECLARE_DEVICE_ISR(3)
+#endif
+#else
+#ifdef BSP_USING_EWDG0
+rt_watchdog_t wdog0;
+#endif
+#ifdef BSP_USING_EWDG1
+rt_watchdog_t wdog1;
+#endif
+#ifdef BSP_USING_EWDG2
+rt_watchdog_t wdog2;
+#endif
+#ifdef BSP_USING_EWDG3
+rt_watchdog_t wdog3;
+#endif
+static void hpm_wdog_isr(int vector, rt_watchdog_t *wdt);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+/* Macro to configure watchdog instance */
+#define HPM_EWDG_CONFIG(idx) \
+ { \
+ .wdog_base = HPM_EWDG##idx, \
+ .device_name = "wdt"#idx, \
+ .clock_name = clock_watchdog##idx, \
+ .irq_num = IRQn_EWDG##idx, \
+ .wdog = &wdog##idx, \
+ }
+
+#ifdef BSP_USING_EWDG0
+rt_watchdog_t wdog0;
+#endif
+#ifdef BSP_USING_EWDG1
+rt_watchdog_t wdog1;
+#endif
+#ifdef BSP_USING_EWDG2
+rt_watchdog_t wdog2;
+#endif
+#ifdef BSP_USING_EWDG3
rt_watchdog_t wdog3;
-SDK_DECLARE_EXT_ISR_M(IRQn_EWDG3, wdog3_isr)
-void wdog3_isr(void)
-{
- hpm_wdog_isr(&wdog3);
-}
#endif
static hpm_wdog_t wdogs[] = {
#ifdef BSP_USING_EWDG0
- {
- .wdog_base = HPM_EWDG0,
- .device_name = "wdt0",
- .clock_name = clock_watchdog0,
- .irq_num = IRQn_EWDG0,
- .wdog = &wdog0,
- },
+ HPM_EWDG_CONFIG(0),
#endif
#ifdef BSP_USING_EWDG1
- {
- .wdog_base = HPM_EWDG1,
- .device_name = "wdt1",
- .clock_name = clock_watchdog1,
- .irq_num = IRQn_EWDG1,
- .wdog = &wdog1,
- },
+ HPM_EWDG_CONFIG(1),
#endif
#ifdef BSP_USING_EWDG2
- {
- .wdog_base = HPM_EWDG2,
- .device_name = "wdt2",
- .clock_name = clock_watchdog2,
- .irq_num = IRQn_EWDG2,
- .wdog = &wdog2,
- },
+ HPM_EWDG_CONFIG(2),
#endif
#ifdef BSP_USING_EWDG3
- {
- .wdog_base = HPM_EWDG3,
- .device_name = "wdt3",
- .clock_name = clock_watchdog3,
- .irq_num = IRQn_EWDG3,
- .wdog = &wdog3,
- },
+ HPM_EWDG_CONFIG(3),
#endif
};
@@ -154,6 +157,7 @@ static rt_err_t hpm_wdog_open(rt_watchdog_t *wdt, rt_uint16_t oflag)
rt_enter_critical();
ewdg_enable(base);
rt_exit_critical();
+ return RT_EOK;
}
static rt_err_t hpm_wdog_close(rt_watchdog_t *wdt)
@@ -230,10 +234,14 @@ static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args)
break;
}
- return RT_EOK;
+ return ret;
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void hpm_wdog_isr(rt_watchdog_t *wdt)
+#else
+void hpm_wdog_isr(int vector, rt_watchdog_t *wdt)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
EWDG_Type *base = hpm_wdog->wdog_base;
@@ -260,6 +268,10 @@ int rt_hw_wdt_init(void)
{
LOG_E("rt device %s failed, status=%d\n", wdogs[i].device_name, err);
}
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register EWDT device to irq table */
+ rt_hw_interrupt_install(wdogs[i].irq_num, (rt_isr_handler_t)hpm_wdog_isr, &wdogs[i], wdogs[i].device_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
#endif
return err;
diff --git a/bsp/hpmicro/libraries/drivers/drv_gpio.c b/bsp/hpmicro/libraries/drivers/drv_gpio.c
index 663e7918cf69..043822b651c7 100644
--- a/bsp/hpmicro/libraries/drivers/drv_gpio.c
+++ b/bsp/hpmicro/libraries/drivers/drv_gpio.c
@@ -1,8 +1,23 @@
/*
- * Copyright (c) 2021-2024 HPMicro
+ * Copyright (c) 2021-2025 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
+ * @file drv_gpio.c
+ * @brief GPIO driver implementation for RT-Thread
+ *
+ * This file implements the GPIO (General Purpose Input/Output) driver for HPMicro
+ * microcontrollers, providing a complete interface between RT-Thread's pin framework
+ * and the HPM GPIO hardware.
+ *
+ * Features:
+ * - Support for multiple GPIO ports (A, B, C, D, E, F, V, W, X, Y, Z)
+ * - Configurable pin modes (input, output, pull-up, pull-down, open-drain)
+ * - Interrupt-driven GPIO operations with configurable triggers
+ * - Pin naming convention: P (e.g., PA00, PZ03)
+ * - Configurable interrupt priorities
+ * - Real-time pin state monitoring
+ *
* Change Logs:
* Date Author Notes
* 2022-01-11 HPMicro First version
@@ -11,202 +26,235 @@
* 2023-08-15 HPMicro Enable pad loopback feature
* 2024-01-08 HPMicro Implemented pin_get
* 2024-04-17 HPMicro Refined pin irq implementation
- * 2024-05-31 HPMicro Adapt later PIN driver framework
* 2024-07-03 HPMicro Determined the existence of GPIO via GPIO_DO_GPIOx macro
+ * 2025-09-01 HPMicro Revised the code, reduced repetitive codes, added comments
+ * 2025-12-04 HPMicro Changed the return type of hpm_pin_read from int to rt_ssize_t
*/
-#include
+#include "rtconfig.h"
#ifdef BSP_USING_GPIO
+
+/* RT-Thread includes */
#include
#include
+
+/* HPM SDK includes */
#include "drv_gpio.h"
#include "hpm_gpio_drv.h"
#include "hpm_gpiom_drv.h"
#include "hpm_clock_drv.h"
#include "hpm_soc_feature.h"
+#include
+#include "hpm_soc.h"
+
+/* ============================================================================
+ * Configuration Macros
+ * ============================================================================ */
+
+/*
+ * GPIO Pin Interrupt Header Declaration Macro
+ * Creates a static array of pin interrupt headers for a specific GPIO port.
+ * Each GPIO port can have up to 32 pins, each with its own interrupt handler.
+ *
+ * @param port GPIO port letter (A, B, C, D, E, F, V, W, X, Y, Z)
+ */
+#define GPIO_PIN_HDR_DECLARE(port) \
+ static struct rt_pin_irq_hdr hpm_gpio0_##port##_pin_hdr[32]
+
+/*
+ * GPIO Interrupt Priority Configuration Macro
+ * Handles the configuration of interrupt priority for GPIO controllers.
+ * If a specific priority is defined in the board configuration, it will be used;
+ * otherwise, a default priority of 1 is applied.
+ */
+#ifdef BSP_GPIO_IRQ_PRIORITY
+#define GPIO_IRQ_PRIORITY_VAL BSP_GPIO_IRQ_PRIORITY
+#else
+#define GPIO_IRQ_PRIORITY_VAL 1
+#endif
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+/*
+ * GPIO Interrupt Mapping Entry Macro
+ * Creates an entry in the GPIO interrupt mapping table that associates
+ * GPIO port indices with their corresponding interrupt numbers, priorities,
+ * and pin interrupt header tables.
+ *
+ * @param port GPIO port letter (A, B, C, D, E, F, V, W, X, Y, Z)
+ */
+#define GPIO_IRQ_MAP_ENTRY(port) \
+ { \
+ GPIO_IE_GPIO##port, \
+ IRQn_GPIO0_##port, \
+ GPIO_IRQ_PRIORITY_VAL, \
+ hpm_gpio0_##port##_pin_hdr \
+ }
+/*
+ * GPIO ISR Definition Macro
+ * Creates the interrupt service routine function and its declaration
+ * for a specific GPIO port. The ISR handles pin-level interrupts
+ * and calls the common GPIO interrupt handler.
+ *
+ * @param port GPIO port letter (A, B, C, D, E, F, V, W, X, Y, Z)
+ */
+#define GPIO_ISR_DEFINE(port) \
+ SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_##port, gpio##port##_isr) \
+ void gpio##port##_isr(void) \
+ { \
+ hpm_gpio_isr(GPIO_IF_GPIO##port, HPM_GPIO0); \
+ }
+#else
+/**
+ * @brief GPIO interrupt parameter structure
+ *
+ * This structure used for passing parameters to the GPIO interrupt service routine.
+ */
typedef struct
{
- uint32_t gpio_idx;
- uint32_t irq_num;
- uint8_t irq_priority;
- struct rt_pin_irq_hdr *pin_irq_tbl;
+ uint32_t gpio_idx; /**< GPIO port index (0-11 for A-Z) */
+ GPIO_Type *base;
+} gpio_irq_param_t;
+
+/*
+ * GPIO Interrupt Mapping Entry Macro
+ * Creates an entry in the GPIO interrupt mapping table that associates
+ * GPIO port indices with their corresponding interrupt numbers, priorities,
+ * and pin interrupt header tables.
+ *
+ * @param port GPIO port letter (A, B, C, D, E, F, V, W, X, Y, Z)
+ */
+#define GPIO_IRQ_MAP_ENTRY(port) \
+ { \
+ GPIO_IE_GPIO##port, \
+ IRQn_GPIO0_##port, \
+ GPIO_IRQ_PRIORITY_VAL, \
+ hpm_gpio0_##port##_pin_hdr, \
+ &(gpio_irq_param_t){ \
+ .gpio_idx = GPIO_IE_GPIO##port, \
+ .base = HPM_GPIO0 \
+ } \
+ }
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+/* ============================================================================
+ * Data Structures
+ * ============================================================================ */
+
+/**
+ * @brief GPIO interrupt mapping structure
+ *
+ * This structure maps GPIO port indices to their corresponding interrupt
+ * configuration and pin interrupt handler tables.
+ */
+typedef struct
+{
+ uint32_t gpio_idx; /**< GPIO port index (0-11 for A-Z) */
+ uint32_t irq_num; /**< Interrupt number for this GPIO port */
+ uint8_t irq_priority; /**< Interrupt priority for this GPIO port */
+ struct rt_pin_irq_hdr *pin_irq_tbl; /**< Pointer to pin interrupt handler table */
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ gpio_irq_param_t *irq_param; /**< Pointer to GPIO interrupt parameter structure */
+#endif
} gpio_irq_map_t;
+/* ============================================================================
+ * GPIO Device Instances
+ * ============================================================================ */
+
+/* GPIO Pin Interrupt Header Declarations - created for each enabled GPIO port */
#ifdef GPIO_DO_GPIOA
-static struct rt_pin_irq_hdr hpm_gpio0_a_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(A);
#endif
#ifdef GPIO_DO_GPIOB
-static struct rt_pin_irq_hdr hpm_gpio0_b_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(B);
#endif
#ifdef GPIO_DO_GPIOC
-static struct rt_pin_irq_hdr hpm_gpio0_c_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(C);
#endif
#ifdef GPIO_DO_GPIOD
-static struct rt_pin_irq_hdr hpm_gpio0_d_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(D);
#endif
#ifdef GPIO_DO_GPIOE
-static struct rt_pin_irq_hdr hpm_gpio0_e_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(E);
#endif
#ifdef GPIO_DO_GPIOF
-static struct rt_pin_irq_hdr hpm_gpio0_f_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(F);
#endif
#ifdef GPIO_DO_GPIOV
-static struct rt_pin_irq_hdr hpm_gpio0_v_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(V);
#endif
#ifdef GPIO_DO_GPIOW
-static struct rt_pin_irq_hdr hpm_gpio0_w_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(W);
#endif
#ifdef GPIO_DO_GPIOX
-static struct rt_pin_irq_hdr hpm_gpio0_x_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(X);
#endif
#ifdef GPIO_DO_GPIOY
-static struct rt_pin_irq_hdr hpm_gpio0_y_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(Y);
#endif
#ifdef GPIO_DO_GPIOZ
-static struct rt_pin_irq_hdr hpm_gpio0_z_pin_hdr[32];
+GPIO_PIN_HDR_DECLARE(Z);
#endif
+/* GPIO Interrupt Mapping Table - maps GPIO ports to their interrupt configuration */
static const gpio_irq_map_t hpm_gpio_irq_map[] = {
#ifdef GPIO_DO_GPIOA
- {
- GPIO_IE_GPIOA,
- IRQn_GPIO0_A,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_a_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(A),
#endif
#ifdef GPIO_DO_GPIOB
- {
- GPIO_IE_GPIOB,
- IRQn_GPIO0_B,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_b_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(B),
#endif
#ifdef GPIO_DO_GPIOC
- {
- GPIO_IE_GPIOC,
- IRQn_GPIO0_C,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_c_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(C),
#endif
#ifdef GPIO_DO_GPIOD
- {
- GPIO_IE_GPIOD,
- IRQn_GPIO0_D,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_d_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(D),
#endif
#ifdef GPIO_DO_GPIOE
- {
- GPIO_IE_GPIOE,
- IRQn_GPIO0_E,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_e_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(E),
#endif
#ifdef GPIO_DO_GPIOF
- {
- GPIO_IE_GPIOF,
- IRQn_GPIO0_F,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_f_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(F),
#endif
#ifdef GPIO_DO_GPIOV
- {
- GPIO_IE_GPIOV,
- IRQn_GPIO0_V,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_v_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(V),
#endif
#ifdef GPIO_DO_GPIOW
- {
- GPIO_IE_GPIOW,
- IRQn_GPIO0_W,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_w_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(W),
#endif
#ifdef GPIO_DO_GPIOX
- {
- GPIO_IE_GPIOX,
- IRQn_GPIO0_X,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_x_pin_hdr },
+ GPIO_IRQ_MAP_ENTRY(X),
#endif
#ifdef GPIO_DO_GPIOY
- {
- GPIO_IE_GPIOY,
- IRQn_GPIO0_Y,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_y_pin_hdr
- },
+ GPIO_IRQ_MAP_ENTRY(Y),
#endif
#ifdef GPIO_DO_GPIOZ
- {
- GPIO_IE_GPIOZ,
- IRQn_GPIO0_Z,
-#if defined(BSP_GPIO_IRQ_PRIORITY)
- BSP_GPIO_IRQ_PRIORITY,
-#else
- 1,
-#endif
- hpm_gpio0_z_pin_hdr },
+ GPIO_IRQ_MAP_ENTRY(Z),
#endif
};
+/* ============================================================================
+ * Function Implementations
+ * ============================================================================ */
+
+/**
+ * @brief Lookup pin interrupt header table for a given pin
+ *
+ * This function finds the appropriate pin interrupt header table for a given
+ * pin number by extracting the GPIO port index and searching the interrupt
+ * mapping table.
+ *
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @return Pointer to pin interrupt header table, or RT_NULL if not found
+ */
static struct rt_pin_irq_hdr *lookup_pin_irq_hdr_tbl(rt_base_t pin)
{
struct rt_pin_irq_hdr *pin_irq_hdr_tbl = RT_NULL;
- uint32_t gpio_idx = pin >> 5;
+ uint32_t gpio_idx = pin >> 5; /* Extract GPIO port index (upper bits) */
+ /* Search through the GPIO interrupt mapping table */
for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
{
if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
@@ -218,10 +266,20 @@ static struct rt_pin_irq_hdr *lookup_pin_irq_hdr_tbl(rt_base_t pin)
return pin_irq_hdr_tbl;
}
+/**
+ * @brief Get interrupt number for a GPIO port
+ *
+ * This function retrieves the interrupt number associated with a specific
+ * GPIO port index by searching the interrupt mapping table.
+ *
+ * @param [in] gpio_idx GPIO port index (0-11 for A-Z)
+ * @return Interrupt number, or -1 if not found
+ */
static int hpm_get_gpio_irq_num(uint32_t gpio_idx)
{
int irq_num = -1;
+ /* Search through the GPIO interrupt mapping table */
for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
{
if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
@@ -233,10 +291,20 @@ static int hpm_get_gpio_irq_num(uint32_t gpio_idx)
return irq_num;
}
+/**
+ * @brief Get interrupt priority for a GPIO port
+ *
+ * This function retrieves the interrupt priority associated with a specific
+ * GPIO port index by searching the interrupt mapping table.
+ *
+ * @param [in] gpio_idx GPIO port index (0-11 for A-Z)
+ * @return Interrupt priority, or -1 if not found
+ */
static int hpm_get_gpio_irq_priority(uint32_t gpio_idx)
{
int irq_priority = -1;
+ /* Search through the GPIO interrupt mapping table */
for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
{
if (hpm_gpio_irq_map[i].gpio_idx == gpio_idx)
@@ -248,9 +316,28 @@ static int hpm_get_gpio_irq_priority(uint32_t gpio_idx)
return irq_priority;
}
+/**
+ * @brief GPIO interrupt service routine
+ *
+ * This function is called when a GPIO interrupt occurs. It handles pin-level
+ * interrupts by checking which pins have triggered interrupts, clearing the
+ * interrupt flags, and calling the appropriate user-defined interrupt handlers.
+ *
+ * @param [in] gpio_idx GPIO port index that triggered the interrupt
+ * @param [in] base GPIO hardware base address
+ */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_gpio_isr(uint32_t gpio_idx, GPIO_Type *base)
+#else
+static void hpm_gpio_isr(int vector, gpio_irq_param_t *param)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
- /* Lookup the Pin IRQ Header Table */
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ uint32_t gpio_idx = param->gpio_idx;
+ GPIO_Type *base = param->base;
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+ /* Lookup the Pin IRQ Header Table for this GPIO port */
+
struct rt_pin_irq_hdr *pin_irq_hdr = RT_NULL;
for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
{
@@ -261,12 +348,15 @@ static void hpm_gpio_isr(uint32_t gpio_idx, GPIO_Type *base)
}
}
+ /* Check each pin in the GPIO port for interrupt flags */
for(uint32_t pin_idx = 0; pin_idx < 32; pin_idx++)
{
if (gpio_check_pin_interrupt_flag(base, gpio_idx, pin_idx))
{
+ /* Clear the interrupt flag for this pin */
gpio_clear_pin_interrupt_flag(base, gpio_idx, pin_idx);
+ /* Call user-defined interrupt handler if registered */
if (pin_irq_hdr[pin_idx].hdr != RT_NULL)
{
pin_irq_hdr[pin_idx].hdr(pin_irq_hdr[pin_idx].args);
@@ -275,136 +365,143 @@ static void hpm_gpio_isr(uint32_t gpio_idx, GPIO_Type *base)
}
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+/* ============================================================================
+ * GPIO Interrupt Service Routines
+ * ============================================================================ */
+
+/* GPIOA ISR - created if GPIO_DO_GPIOA is enabled */
#ifdef GPIO_DO_GPIOA
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_A, gpioa_isr)
-void gpioa_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOA, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(A);
#endif
+/* GPIOB ISR - created if GPIO_DO_GPIOB is enabled */
#ifdef GPIO_DO_GPIOB
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_B, gpiob_isr)
-void gpiob_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOB, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(B);
#endif
+/* GPIOC ISR - created if GPIO_DO_GPIOC is enabled */
#ifdef GPIO_DO_GPIOC
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_C, gpioc_isr)
-void gpioc_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOC, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(C);
#endif
+/* GPIOD ISR - created if GPIO_DO_GPIOD is enabled */
#ifdef GPIO_DO_GPIOD
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_D, gpiod_isr)
-void gpiod_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOD, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(D);
#endif
+/* GPIOE ISR - created if GPIO_DO_GPIOE is enabled */
#ifdef GPIO_DO_GPIOE
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_E, gpioe_isr)
-void gpioe_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOE, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(E);
#endif
+/* GPIOF ISR - created if GPIO_DO_GPIOF is enabled */
#ifdef GPIO_DO_GPIOF
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_F, gpiof_isr)
-void gpiof_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOF, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(F);
#endif
+/* GPIOV ISR - created if GPIO_DO_GPIOV is enabled */
#ifdef GPIO_DO_GPIOV
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_V, gpiox_isr)
-void gpiov_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOV, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(V);
#endif
+/* GPIOW ISR - created if GPIO_DO_GPIOW is enabled */
#ifdef GPIO_DO_GPIOW
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_W, gpiox_isr)
-void gpiow_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOW, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(W);
#endif
+/* GPIOX ISR - created if GPIO_DO_GPIOX is enabled */
#ifdef GPIO_DO_GPIOX
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_X, gpiox_isr)
-void gpiox_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOX, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(X);
#endif
+/* GPIOY ISR - created if GPIO_DO_GPIOY is enabled */
#ifdef GPIO_DO_GPIOY
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_Y, gpioy_isr)
-void gpioy_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOY, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(Y);
#endif
+/* GPIOZ ISR - created if GPIO_DO_GPIOZ is enabled */
#ifdef GPIO_DO_GPIOZ
-SDK_DECLARE_EXT_ISR_M(IRQn_GPIO0_Z, gpioz_isr)
-void gpioz_isr(void)
-{
- hpm_gpio_isr(GPIO_IF_GPIOZ, HPM_GPIO0);
-}
+GPIO_ISR_DEFINE(Z);
#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
/**
- * @brief Get Pin index from name
- *
- * Name rule is :
- * for example: PA00, PZ03
+ * @brief Get Pin index from name string
+ *
+ * This function converts a pin name string to a pin index number.
+ * The pin naming convention follows the pattern: P
+ *
+ * Supported formats:
+ * - PA00 to PF99: GPIO ports A-F with pin indices 00-99
+ * - PV00 to PZ99: GPIO ports V-Z with pin indices 00-99
+ *
+ * Examples:
+ * - "PA00" -> pin index 0 (GPIO A, pin 0)
+ * - "PZ03" -> pin index 355 (GPIO Z, pin 3)
+ * - "PB15" -> pin index 47 (GPIO B, pin 15)
*
- **/
+ * @param [in] name Pin name string (must be exactly 4 characters)
+ * @return Pin index number, or -RT_EINVAL if name is invalid
+ */
static rt_base_t hpm_pin_get(const char *name)
{
- if (!( (rt_strlen(name) == 4) &&
- (name[0] == 'P') &&
- ((('A' <= name[1]) && (name[1] <= 'F')) || (('V' <= name[1]) && (name[1] <= 'Z'))) &&
- (('0' <= name[2]) && (name[2] <= '9')) &&
- (('0' <= name[3]) && (name[3] <= '9'))
+ /* Validate pin name format: P (4 characters total) */
+ if (!( (rt_strlen(name) == 4) && /* Exactly 4 characters */
+ (name[0] == 'P') && /* First character is 'P' */
+ ((('A' <= name[1]) && (name[1] <= 'F')) || /* Port A-F or V-Z */
+ (('V' <= name[1]) && (name[1] <= 'Z'))) &&
+ (('0' <= name[2]) && (name[2] <= '9')) && /* Third character is digit */
+ (('0' <= name[3]) && (name[3] <= '9')) /* Fourth character is digit */
))
{
return -RT_EINVAL;
}
+ /* Calculate GPIO port index */
uint32_t gpio_idx = (name[1] <= 'F') ? (name[1] - 'A') : (11 + name[1] - 'V');
+
+ /* Calculate pin index within the port */
uint32_t pin_idx = (uint32_t)(name[2] - '0') * 10 + (name[3] - '0');
+
+ /* Return combined pin index (gpio_idx * 32 + pin_idx) */
return (gpio_idx * 32 + pin_idx);
}
+/**
+ * @brief Configure GPIO pin mode
+ *
+ * This function configures a GPIO pin for the specified mode, including
+ * direction (input/output), pull-up/pull-down resistors, and open-drain settings.
+ * It also configures the pin controller and pad settings.
+ *
+ * @param [in] dev Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @param [in] mode Pin mode (PIN_MODE_*)
+ */
static void hpm_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
{
/* TODO: Check the validity of the pin value */
- uint32_t gpio_idx = pin >> 5;
- uint32_t pin_idx = pin & 0x1FU;
+ uint32_t gpio_idx = pin >> 5; /* Extract GPIO port index */
+ uint32_t pin_idx = pin & 0x1FU; /* Extract pin index within port */
+ /* Configure pin controller to use GPIO0 */
gpiom_set_pin_controller(HPM_GPIOM, gpio_idx, pin_idx, gpiom_soc_gpio0);
+ /* Clear function control register */
HPM_IOC->PAD[pin].FUNC_CTL = 0;
+ /* Handle special cases for specific GPIO ports */
switch (gpio_idx)
{
case GPIO_DI_GPIOY :
+ /* GPIOY requires special PIOC configuration */
HPM_PIOC->PAD[pin].FUNC_CTL = 3;
break;
#ifdef GPIO_DI_GPIOZ
case GPIO_DI_GPIOZ :
#ifdef HPM_BIOC
+ /* GPIOZ requires special BIOC configuration if available */
HPM_BIOC->PAD[pin].FUNC_CTL = 3;
#endif
break;
@@ -413,109 +510,194 @@ static void hpm_pin_mode(rt_device_t dev, rt_base_t pin, rt_uint8_t mode)
break;
}
+ /* Configure pin mode and pad settings */
switch (mode)
{
case PIN_MODE_OUTPUT:
+ /* Configure as output with push-pull driver */
gpio_set_pin_output(HPM_GPIO0, gpio_idx, pin_idx);
HPM_IOC->PAD[pin].PAD_CTL &= ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK | IOC_PAD_PAD_CTL_OD_MASK);
break;
+
case PIN_MODE_INPUT:
+ /* Configure as input with no pull resistors */
gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
HPM_IOC->PAD[pin].PAD_CTL &= ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK);
break;
+
case PIN_MODE_INPUT_PULLDOWN:
+ /* Configure as input with pull-down resistor */
gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
HPM_IOC->PAD[pin].PAD_CTL = (HPM_IOC->PAD[pin].PAD_CTL & ~IOC_PAD_PAD_CTL_PS_MASK) | IOC_PAD_PAD_CTL_PE_SET(1);
break;
+
case PIN_MODE_INPUT_PULLUP:
+ /* Configure as input with pull-up resistor */
gpio_set_pin_input(HPM_GPIO0, gpio_idx, pin_idx);
HPM_IOC->PAD[pin].PAD_CTL = IOC_PAD_PAD_CTL_PE_SET(1) | IOC_PAD_PAD_CTL_PS_SET(1);
break;
+
case PIN_MODE_OUTPUT_OD:
+ /* Configure as output with open-drain driver */
gpio_set_pin_output(HPM_GPIO0, gpio_idx, pin_idx);
HPM_IOC->PAD[pin].PAD_CTL = (HPM_IOC->PAD[pin].PAD_CTL & ~(IOC_PAD_PAD_CTL_PS_MASK | IOC_PAD_PAD_CTL_PE_MASK)) | IOC_PAD_PAD_CTL_OD_SET(1);
break;
+
default:
- /* Invalid mode */
+ /* Invalid mode - no action taken */
break;
}
+
+ /* Enable pad loopback feature */
HPM_IOC->PAD[pin].FUNC_CTL = IOC_PAD_FUNC_CTL_LOOP_BACK_MASK;
}
+/**
+ * @brief Read GPIO pin state
+ *
+ * This function reads the current state (high/low) of a GPIO pin.
+ *
+ * @param [in] dev Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @return Pin state: 1 for high, 0 for low
+ */
static rt_ssize_t hpm_pin_read(rt_device_t dev, rt_base_t pin)
{
/* TODO: Check the validity of the pin value */
- uint32_t gpio_idx = pin >> 5;
- uint32_t pin_idx = pin & 0x1FU;
+ uint32_t gpio_idx = pin >> 5; /* Extract GPIO port index */
+ uint32_t pin_idx = pin & 0x1FU; /* Extract pin index within port */
return (rt_ssize_t) gpio_read_pin(HPM_GPIO0, gpio_idx, pin_idx);
}
+/**
+ * @brief Write GPIO pin state
+ *
+ * This function sets the output state of a GPIO pin to high or low.
+ *
+ * @param [in] dev Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @param [in] value Pin state: 1 for high, 0 for low
+ */
static void hpm_pin_write(rt_device_t dev, rt_base_t pin, rt_uint8_t value)
{
/* TODO: Check the validity of the pin value */
- uint32_t gpio_idx = pin >> 5;
- uint32_t pin_idx = pin & 0x1FU;
+ uint32_t gpio_idx = pin >> 5; /* Extract GPIO port index */
+ uint32_t pin_idx = pin & 0x1FU; /* Extract pin index within port */
gpio_write_pin(HPM_GPIO0, gpio_idx, pin_idx, value);
}
+/**
+ * @brief Attach interrupt handler to GPIO pin
+ *
+ * This function registers an interrupt handler for a specific GPIO pin.
+ * The handler will be called when the pin triggers an interrupt based on
+ * the specified mode (rising edge, falling edge, high level, low level).
+ *
+ * @param [in] device Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @param [in] mode Interrupt mode (PIN_IRQ_MODE_*)
+ * @param [in] hdr Interrupt handler function pointer
+ * @param [in] args Arguments to pass to the interrupt handler
+ * @retval RT_EOK Interrupt handler attached successfully
+ * @retval -RT_EINVAL Invalid pin number
+ */
static rt_err_t hpm_pin_attach_irq(struct rt_device *device,
rt_base_t pin,
rt_uint8_t mode,
void (*hdr)(void *args),
void *args)
{
+ /* Lookup the pin interrupt header table for this pin */
struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
if (pin_irq_hdr_tbl == RT_NULL)
{
return -RT_EINVAL;
}
+ /* Disable interrupts during registration to ensure atomic operation */
rt_base_t level = rt_hw_interrupt_disable();
- uint32_t pin_idx = pin & 0x1FUL;
+ uint32_t pin_idx = pin & 0x1FUL; /* Extract pin index within port */
+
+ /* Register the interrupt handler */
pin_irq_hdr_tbl[pin_idx].pin = pin;
pin_irq_hdr_tbl[pin_idx].hdr = hdr;
pin_irq_hdr_tbl[pin_idx].mode = mode;
pin_irq_hdr_tbl[pin_idx].args = args;
+
+ /* Re-enable interrupts */
rt_hw_interrupt_enable(level);
return RT_EOK;
}
+/**
+ * @brief Detach interrupt handler from GPIO pin
+ *
+ * This function removes the interrupt handler registration for a specific GPIO pin.
+ * After calling this function, the pin will no longer trigger interrupts.
+ *
+ * @param [in] device Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @retval RT_EOK Interrupt handler detached successfully
+ * @retval -RT_EINVAL Invalid pin number
+ */
static rt_err_t hpm_pin_detach_irq(struct rt_device *device, rt_base_t pin)
{
+ /* Lookup the pin interrupt header table for this pin */
struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
if (pin_irq_hdr_tbl == RT_NULL)
{
return -RT_EINVAL;
}
+
+ /* Disable interrupts during deregistration to ensure atomic operation */
rt_base_t level = rt_hw_interrupt_disable();
- uint32_t pin_idx = pin & 0x1FUL;
+ uint32_t pin_idx = pin & 0x1FUL; /* Extract pin index within port */
+
+ /* Clear the interrupt handler registration */
pin_irq_hdr_tbl[pin_idx].pin = -1;
pin_irq_hdr_tbl[pin_idx].hdr = RT_NULL;
pin_irq_hdr_tbl[pin_idx].mode = 0;
pin_irq_hdr_tbl[pin_idx].args = RT_NULL;
+
+ /* Re-enable interrupts */
rt_hw_interrupt_enable(level);
return RT_EOK;
}
+/**
+ * @brief Enable or disable GPIO pin interrupt
+ *
+ * This function enables or disables interrupt generation for a specific GPIO pin.
+ * When enabling, it configures the interrupt trigger mode and enables the hardware
+ * interrupt. When disabling, it disables the hardware interrupt.
+ *
+ * @param [in] device Device pointer (unused)
+ * @param [in] pin Pin number (encoded as gpio_idx * 32 + pin_idx)
+ * @param [in] enabled Enable/disable flag (PIN_IRQ_ENABLE or PIN_IRQ_DISABLE)
+ * @retval RT_EOK Operation completed successfully
+ * @retval -RT_EINVAL Invalid pin number or enable flag
+ */
static rt_err_t hpm_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_uint8_t enabled)
{
/* TODO: Check the validity of the pin value */
- uint32_t gpio_idx = pin >> 5;
- uint32_t pin_idx = pin & 0x1FU;
+ uint32_t gpio_idx = pin >> 5; /* Extract GPIO port index */
+ uint32_t pin_idx = pin & 0x1FU; /* Extract pin index within port */
+ /* Lookup the pin interrupt header table for this pin */
struct rt_pin_irq_hdr *pin_irq_hdr_tbl = lookup_pin_irq_hdr_tbl(pin);
if (pin_irq_hdr_tbl == RT_NULL)
{
return -RT_EINVAL;
}
- gpio_interrupt_trigger_t trigger;
if (enabled == PIN_IRQ_ENABLE)
{
+ /* Configure interrupt trigger mode based on registered mode */
+ gpio_interrupt_trigger_t trigger;
switch(pin_irq_hdr_tbl[pin_idx].mode)
{
case PIN_IRQ_MODE_RISING:
@@ -534,14 +716,21 @@ static rt_err_t hpm_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_u
trigger = gpio_interrupt_trigger_edge_rising;
break;
}
+
+ /* Configure and enable the pin interrupt */
gpio_config_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx, trigger);
+
+ /* Get interrupt number and priority for this GPIO port */
rt_uint32_t irq_num = hpm_get_gpio_irq_num(gpio_idx);
rt_uint32_t irq_priority = hpm_get_gpio_irq_priority(gpio_idx);
+
+ /* Enable pin interrupt and system interrupt */
gpio_enable_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx);
intc_m_enable_irq_with_priority(irq_num, irq_priority);
}
else if (enabled == PIN_IRQ_DISABLE)
{
+ /* Disable the pin interrupt */
gpio_disable_pin_interrupt(HPM_GPIO0, gpio_idx, pin_idx);
}
else
@@ -552,25 +741,54 @@ static rt_err_t hpm_pin_irq_enable(struct rt_device *device, rt_base_t pin, rt_u
return RT_EOK;
}
+/* ============================================================================
+ * RT-Thread Interface Structures
+ * ============================================================================ */
+
+/* RT-Thread pin operations structure - defines the interface between RT-Thread and this driver */
const static struct rt_pin_ops hpm_pin_ops = {
- .pin_mode = hpm_pin_mode,
- .pin_write = hpm_pin_write,
- .pin_read = hpm_pin_read,
- .pin_attach_irq = hpm_pin_attach_irq,
- .pin_detach_irq = hpm_pin_detach_irq,
- .pin_irq_enable = hpm_pin_irq_enable,
- .pin_get = hpm_pin_get,
+ .pin_mode = hpm_pin_mode, /* Configure pin mode */
+ .pin_write = hpm_pin_write, /* Write pin state */
+ .pin_read = hpm_pin_read, /* Read pin state */
+ .pin_attach_irq = hpm_pin_attach_irq, /* Attach interrupt handler */
+ .pin_detach_irq = hpm_pin_detach_irq, /* Detach interrupt handler */
+ .pin_irq_enable = hpm_pin_irq_enable, /* Enable/disable interrupt */
+ .pin_get = hpm_pin_get, /* Get pin index from name */
};
+/* ============================================================================
+ * Driver Initialization
+ * ============================================================================ */
+
+/**
+ * @brief Initialize GPIO driver
+ *
+ * This function initializes the GPIO driver and registers it with the
+ * RT-Thread device framework. It sets up the pin operations structure
+ * and makes the GPIO functionality available to the system.
+ *
+ * @retval RT_EOK Initialization successful
+ * @retval -RT_ERROR Initialization failed
+ */
int rt_hw_pin_init(void)
{
int ret = RT_EOK;
+ /* Register the pin device with RT-Thread */
ret = rt_device_pin_register("pin", &hpm_pin_ops, RT_NULL);
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ for (uint32_t i = 0; i < ARRAY_SIZE(hpm_gpio_irq_map); i++)
+ {
+ /* Register GPIO device to irq table */
+ rt_hw_interrupt_install(hpm_gpio_irq_map[i].irq_num, (rt_isr_handler_t)hpm_gpio_isr, hpm_gpio_irq_map[i].irq_param, "GPIO");
+ }
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
return ret;
}
+/* Register initialization function to be called during system startup */
INIT_BOARD_EXPORT(rt_hw_pin_init);
#endif /* BSP_USING_GPIO */
diff --git a/bsp/hpmicro/libraries/drivers/drv_i2c.c b/bsp/hpmicro/libraries/drivers/drv_i2c.c
index 15481ca8c0e7..d55e2f732cdf 100644
--- a/bsp/hpmicro/libraries/drivers/drv_i2c.c
+++ b/bsp/hpmicro/libraries/drivers/drv_i2c.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2024 HPMicro
+ * Copyright (c) 2022-2023 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -12,10 +12,9 @@
#include "drv_i2c.h"
#include "hpm_i2c_drv.h"
#include "hpm_dma_mgr.h"
-#include "hpm_dmamux_drv.h"
#include "hpm_l1c_drv.h"
#include "board.h"
-
+#include "hpm_dmamux_drv.h"
#ifdef RT_USING_I2C
@@ -31,7 +30,8 @@ struct hpm_i2c
I2C_Type *base;
clock_name_t clk_name;
char *bus_name;
- rt_sem_t xfer_sem;
+ rt_sem_t i2c_xfer_sem;
+ rt_sem_t dma_xfer_sem;
rt_bool_t enable_dma;
rt_uint8_t dmamux;
dma_resource_t dma;
@@ -40,158 +40,174 @@ struct hpm_i2c
rt_uint8_t irq_priority;
};
-static struct hpm_i2c hpm_i2cs[] =
-{
-#if defined(BSP_USING_I2C0)
- {
- .base = HPM_I2C0,
- .bus_name = "i2c0",
- .clk_name = clock_i2c0,
+/* Macros to reduce repetitive I2C configuration code */
+#define HPM_I2C_CONFIG(idx) \
+ { \
+ .base = HPM_I2C##idx, \
+ .bus_name = "i2c"#idx, \
+ .clk_name = clock_i2c##idx, \
+ HPM_I2C_DMA_CONFIG_##idx \
+ .dmamux = HPM_DMA_SRC_I2C##idx, \
+ .i2c_irq = IRQn_I2C##idx, \
+ HPM_I2C_IRQ_PRIORITY_##idx \
+ }
+
+/* DMA configuration per instance */
#if defined(BSP_I2C0_USING_DMA)
- .enable_dma = RT_TRUE,
-#endif
- .dmamux = HPM_DMA_SRC_I2C0,
- .i2c_irq = IRQn_I2C0,
-#if defined(BSP_I2C0_IRQ_PRIORITY)
- .irq_priority = BSP_I2C0_IRQ_PRIORITY,
+#define HPM_I2C_DMA_CONFIG_0 .enable_dma = RT_TRUE,
#else
- .irq_priority = 1,
-#endif
- },
+#define HPM_I2C_DMA_CONFIG_0 .enable_dma = RT_FALSE,
#endif
-#if defined(BSP_USING_I2C1)
- {
- .base = HPM_I2C1,
- .bus_name = "i2c1",
- .clk_name = clock_i2c1,
+
#if defined(BSP_I2C1_USING_DMA)
- .enable_dma = RT_TRUE,
+#define HPM_I2C_DMA_CONFIG_1 .enable_dma = RT_TRUE,
+#else
+#define HPM_I2C_DMA_CONFIG_1
#endif
- .dmamux = HPM_DMA_SRC_I2C1,
- .i2c_irq = IRQn_I2C1,
-#if defined(BSP_I2C1_IRQ_PRIORITY)
- .irq_priority = BSP_I2C1_IRQ_PRIORITY,
+
+#if defined(BSP_I2C2_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_2 .enable_dma = RT_TRUE,
#else
- .irq_priority = 1,
+#define HPM_I2C_DMA_CONFIG_2 .enable_dma = RT_FALSE,
#endif
- },
+
+#if defined(BSP_I2C3_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_3 .enable_dma = RT_TRUE,
+#else
+#define HPM_I2C_DMA_CONFIG_3 .enable_dma = RT_FALSE,
#endif
-#if defined(BSP_USING_I2C2)
- {
- .base = HPM_I2C2,
- .bus_name = "i2c2",
- .clk_name = clock_i2c2,
-#if defined(BSP_I2C2_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_I2C4_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_4 .enable_dma = RT_TRUE,
+#else
+#define HPM_I2C_DMA_CONFIG_4
#endif
- .dmamux = HPM_DMA_SRC_I2C2,
- .i2c_irq = IRQn_I2C2,
-#if defined(BSP_I2C2_IRQ_PRIORITY)
- .irq_priority = BSP_I2C2_IRQ_PRIORITY,
+
+#if defined(BSP_I2C5_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_5 .enable_dma = RT_TRUE,
#else
- .irq_priority = 1,
+#define HPM_I2C_DMA_CONFIG_5 .enable_dma = RT_FALSE,
#endif
- },
+
+#if defined(BSP_I2C6_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_6 .enable_dma = RT_TRUE,
+#else
+#define HPM_I2C_DMA_CONFIG_6 .enable_dma = RT_FALSE,
#endif
-#if defined(BSP_USING_I2C3)
- {
- .base = HPM_I2C3,
- .bus_name = "i2c3",
- .clk_name = clock_i2c3,
-#if defined(BSP_I2C3_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_I2C7_USING_DMA)
+#define HPM_I2C_DMA_CONFIG_7 .enable_dma = RT_TRUE,
+#else
+#define HPM_I2C_DMA_CONFIG_7
#endif
- .dmamux = HPM_DMA_SRC_I2C3,
- .i2c_irq = IRQn_I2C3,
-#if defined(BSP_I2C3_IRQ_PRIORITY)
- .irq_priority = BSP_I2C3_IRQ_PRIORITY,
+
+/* IRQ priority configuration per instance */
+#if defined(BSP_I2C0_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_0 .irq_priority = BSP_I2C0_IRQ_PRIORITY,
#else
- .irq_priority = 1,
+#define HPM_I2C_IRQ_PRIORITY_0 .irq_priority = 1,
#endif
- },
+
+#if defined(BSP_I2C1_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_1 .irq_priority = BSP_I2C1_IRQ_PRIORITY,
+#else
+#define HPM_I2C_IRQ_PRIORITY_1 .irq_priority = 1,
#endif
-#if defined(BSP_USING_I2C4)
- {
- .base = HPM_I2C4,
- .bus_name = "i2c4",
- .clk_name = clock_i2c4,
-#if defined(BSP_I2C4_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_I2C2_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_2 .irq_priority = BSP_I2C2_IRQ_PRIORITY,
+#else
+#define HPM_I2C_IRQ_PRIORITY_2 .irq_priority = 1,
+#endif
+
+#if defined(BSP_I2C3_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_3 .irq_priority = BSP_I2C3_IRQ_PRIORITY,
+#else
+#define HPM_I2C_IRQ_PRIORITY_3 .irq_priority = 1,
#endif
- .dmamux = HPM_DMA_SRC_I2C4,
- .i2c_irq = IRQn_I2C4,
+
#if defined(BSP_I2C4_IRQ_PRIORITY)
- .irq_priority = BSP_I2C4_IRQ_PRIORITY,
+#define HPM_I2C_IRQ_PRIORITY_4 .irq_priority = BSP_I2C4_IRQ_PRIORITY,
#else
- .irq_priority = 1,
+#define HPM_I2C_IRQ_PRIORITY_4 .irq_priority = 1,
#endif
- },
+
+#if defined(BSP_I2C5_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_5 .irq_priority = BSP_I2C5_IRQ_PRIORITY,
+#else
+#define HPM_I2C_IRQ_PRIORITY_5 .irq_priority = 1,
#endif
-#if defined(BSP_USING_I2C5)
- {
- .base = HPM_I2C5,
- .bus_name = "i2c5",
- .clk_name = clock_i2c5,
-#if defined(BSP_I2C5_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_I2C6_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_6 .irq_priority = BSP_I2C6_IRQ_PRIORITY,
+#else
+#define HPM_I2C_IRQ_PRIORITY_6 .irq_priority = 1,
#endif
- .dmamux = HPM_DMA_SRC_I2C5,
- .i2c_irq = IRQn_I2C5,
-#if defined(BSP_I2C5_IRQ_PRIORITY)
- .irq_priority = BSP_I2C5_IRQ_PRIORITY,
+
+#if defined(BSP_I2C7_IRQ_PRIORITY)
+#define HPM_I2C_IRQ_PRIORITY_7 .irq_priority = BSP_I2C7_IRQ_PRIORITY,
#else
- .irq_priority = 1,
+#define HPM_I2C_IRQ_PRIORITY_7 .irq_priority = 1,
+#endif
+
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+/* Macro for ISR handler declaration and implementation */
+#define HPM_I2C_ISR_HANDLER(idx) \
+ SDK_DECLARE_EXT_ISR_M(IRQn_I2C##idx, i2c##idx##_isr); \
+ void i2c##idx##_isr(void) \
+ { \
+ handle_i2c_isr(HPM_I2C##idx); \
+ }
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+static struct hpm_i2c hpm_i2cs[] =
+{
+#if defined(BSP_USING_I2C0)
+ HPM_I2C_CONFIG(0),
#endif
- },
+#if defined(BSP_USING_I2C1)
+ HPM_I2C_CONFIG(1),
#endif
-#if defined(BSP_USING_I2C6)
- {
- .base = HPM_I2C6,
- .bus_name = "i2c6",
- .clk_name = clock_i2c6,
-#if defined(BSP_I2C6_USING_DMA)
- .enable_dma = RT_TRUE,
+#if defined(BSP_USING_I2C2)
+ HPM_I2C_CONFIG(2),
#endif
- .dmamux = HPM_DMA_SRC_I2C6,
- .i2c_irq = IRQn_I2C6,
-#if defined(BSP_I2C6_IRQ_PRIORITY)
- .irq_priority = BSP_I2C6_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
+#if defined(BSP_USING_I2C3)
+ HPM_I2C_CONFIG(3),
#endif
- },
+#if defined(BSP_USING_I2C4)
+ HPM_I2C_CONFIG(4),
#endif
-#if defined(BSP_USING_I2C7)
- {
- .base = HPM_I2C7,
- .bus_name = "i2c7",
- .clk_name = clock_i2c7,
-#if defined(BSP_I2C7_USING_DMA)
- .enable_dma = RT_TRUE,
+#if defined(BSP_USING_I2C5)
+ HPM_I2C_CONFIG(5),
#endif
- .dmamux = HPM_DMA_SRC_I2C7,
- .i2c_irq = IRQn_I2C7,
-#if defined(BSP_I2C7_IRQ_PRIORITY)
- .irq_priority = BSP_I2C7_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
+#if defined(BSP_USING_I2C6)
+ HPM_I2C_CONFIG(6),
#endif
- },
+#if defined(BSP_USING_I2C7)
+ HPM_I2C_CONFIG(7),
#endif
};
static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct rt_i2c_msg msgs[], rt_uint32_t num);
-static hpm_stat_t i2c_tx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, I2C_Type *i2c_ptr, uint32_t src, uint32_t size);
-static hpm_stat_t i2c_rx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, I2C_Type *i2c_ptr, uint32_t dst, uint32_t size);
+static rt_err_t hpm_i2c_bus_control(struct rt_i2c_bus_device *bus, int cmd, void *args);
+static hpm_stat_t i2c_tx_trigger_dma(const dma_resource_t *resource, I2C_Type *i2c_ptr, uint32_t src, uint32_t size);
+static hpm_stat_t i2c_rx_trigger_dma(const dma_resource_t *resource, I2C_Type *i2c_ptr, uint32_t dst, uint32_t size);
+static hpm_stat_t hpm_i2c_master_start_dma_transfer(I2C_Type *i2c_ptr, const uint16_t device_address, uint32_t size, uint16_t flags);
+static void hpm_i2c_clear_xfer_sems(struct hpm_i2c *i2c);
+static void hpm_i2c_prepare_dma_xfer(struct hpm_i2c *i2c);
struct rt_i2c_bus_device_ops hpm_i2c_ops =
{
hpm_i2c_master_transfer,
RT_NULL,
- RT_NULL
+ hpm_i2c_bus_control
};
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static inline void handle_i2c_isr(I2C_Type *ptr)
+#else
+static inline void handle_i2c_isr(int vector, I2C_Type *ptr)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
volatile uint32_t irq_status;
RT_ASSERT(ptr != RT_NULL);
@@ -204,7 +220,7 @@ static inline void handle_i2c_isr(I2C_Type *ptr)
{
if (hpm_i2cs[i].base == ptr)
{
- rt_sem_release(hpm_i2cs[i].xfer_sem);
+ rt_sem_release(hpm_i2cs[i].i2c_xfer_sem);
}
}
i2c_disable_irq(ptr, I2C_EVENT_TRANSACTION_COMPLETE);
@@ -213,101 +229,207 @@ static inline void handle_i2c_isr(I2C_Type *ptr)
rt_hw_interrupt_enable(level);
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
#if defined(BSP_USING_I2C0)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C0, i2c0_isr);
-void i2c0_isr(void)
-{
- handle_i2c_isr(HPM_I2C0);
-}
+HPM_I2C_ISR_HANDLER(0)
#endif
#if defined(BSP_USING_I2C1)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C1, i2c1_isr);
-void i2c1_isr(void)
-{
- handle_i2c_isr(HPM_I2C1);
-}
+HPM_I2C_ISR_HANDLER(1)
#endif
#if defined(BSP_USING_I2C2)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C2, i2c2_isr);
-void i2c2_isr(void)
-{
- handle_i2c_isr(HPM_I2C2);
-}
+HPM_I2C_ISR_HANDLER(2)
#endif
#if defined(BSP_USING_I2C3)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C3, i2c3_isr);
-void i2c3_isr(void)
-{
- handle_i2c_isr(HPM_I2C3);
-}
+HPM_I2C_ISR_HANDLER(3)
#endif
#if defined(BSP_USING_I2C4)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C4, i2c4_isr);
-void i2c4_isr(void)
-{
- handle_i2c_isr(HPM_I2C4);
-}
+HPM_I2C_ISR_HANDLER(4)
#endif
#if defined(BSP_USING_I2C5)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C5, i2c5_isr);
-void i2c5_isr(void)
-{
- handle_i2c_isr(HPM_I2C5);
-}
+HPM_I2C_ISR_HANDLER(5)
#endif
#if defined(BSP_USING_I2C6)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C6, i2c6_isr);
-void i2c6_isr(void)
-{
- handle_i2c_isr(HPM_I2C6);
-}
+HPM_I2C_ISR_HANDLER(6)
#endif
#if defined(BSP_USING_I2C7)
-SDK_DECLARE_EXT_ISR_M(IRQn_I2C7, i2c7_isr);
-void i2c7_isr(void)
+HPM_I2C_ISR_HANDLER(7)
+#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+static hpm_stat_t i2c_tx_trigger_dma(const dma_resource_t *resource, I2C_Type *i2c_ptr, uint32_t src, uint32_t size)
+{
+ hpm_stat_t stat = status_success;
+
+ HPM_CHECK_RET(dma_mgr_set_chn_src_work_mode(resource, DMA_MGR_HANDSHAKE_MODE_NORMAL));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_work_mode(resource, DMA_MGR_HANDSHAKE_MODE_HANDSHAKE));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_addr_ctrl(resource, DMA_MGR_ADDRESS_CONTROL_INCREMENT));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_addr_ctrl(resource, DMA_MGR_ADDRESS_CONTROL_FIXED));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_width(resource, DMA_MGR_TRANSFER_WIDTH_BYTE));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_width(resource, DMA_MGR_TRANSFER_WIDTH_BYTE));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_addr(resource, src));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_addr(resource, (uint32_t)&i2c_ptr->DATA));
+ HPM_CHECK_RET(dma_mgr_set_chn_transize(resource, size));
+ HPM_CHECK_RET(dma_mgr_enable_channel(resource));
+
+ return stat;
+}
+
+static hpm_stat_t i2c_rx_trigger_dma(const dma_resource_t *resource, I2C_Type *i2c_ptr, uint32_t dst, uint32_t size)
+{
+ hpm_stat_t stat = status_success;
+
+ HPM_CHECK_RET(dma_mgr_set_chn_src_work_mode(resource, DMA_MGR_HANDSHAKE_MODE_HANDSHAKE));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_work_mode(resource, DMA_MGR_HANDSHAKE_MODE_NORMAL));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_addr_ctrl(resource, DMA_MGR_ADDRESS_CONTROL_FIXED));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_addr_ctrl(resource, DMA_MGR_ADDRESS_CONTROL_INCREMENT));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_width(resource, DMA_MGR_TRANSFER_WIDTH_BYTE));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_width(resource, DMA_MGR_TRANSFER_WIDTH_BYTE));
+ HPM_CHECK_RET(dma_mgr_set_chn_src_addr(resource, (uint32_t)&i2c_ptr->DATA));
+ HPM_CHECK_RET(dma_mgr_set_chn_dst_addr(resource, dst));
+ HPM_CHECK_RET(dma_mgr_set_chn_transize(resource, size));
+ HPM_CHECK_RET(dma_mgr_enable_channel(resource));
+
+ return stat;
+}
+
+static void hpm_i2c_clear_sem(rt_sem_t sem)
+{
+ while (rt_sem_take(sem, 0) == RT_EOK)
+ {
+ }
+}
+
+static void hpm_i2c_clear_xfer_sems(struct hpm_i2c *i2c)
+{
+ hpm_i2c_clear_sem(i2c->i2c_xfer_sem);
+ hpm_i2c_clear_sem(i2c->dma_xfer_sem);
+}
+
+static void hpm_i2c_prepare_dma_xfer(struct hpm_i2c *i2c)
{
- handle_i2c_isr(HPM_I2C7);
+ dma_mgr_disable_chn_irq(&i2c->dma, DMA_MGR_INTERRUPT_MASK_TC);
+ i2c_disable_irq(i2c->base, I2C_EVENT_TRANSACTION_COMPLETE);
+ hpm_i2c_clear_xfer_sems(i2c);
+ dma_clear_transfer_status(i2c->dma.base, i2c->dma.channel);
+ i2c_clear_status(i2c->base, I2C_STATUS_CMPL_MASK | I2C_STATUS_ADDRHIT_MASK);
}
+
+static hpm_stat_t hpm_i2c_master_start_dma_transfer(I2C_Type *i2c_ptr,
+ const uint16_t device_address,
+ uint32_t size,
+ uint16_t flags)
+{
+ uint32_t retry = 0;
+ uint32_t ctrl = 0;
+
+ if (((size == 0) || (size > I2C_SOC_TRANSFER_COUNT_MAX))) {
+ return status_invalid_argument;
+ }
+
+ if (flags & I2C_ADDR_10BIT) {
+ i2c_enable_10bit_address_mode(i2c_ptr, true);
+ } else {
+ i2c_enable_10bit_address_mode(i2c_ptr, false);
+ }
+
+ i2c_clear_status(i2c_ptr, I2C_STATUS_CMPL_MASK | I2C_STATUS_ADDRHIT_MASK);
+ i2c_clear_fifo(i2c_ptr);
+ i2c_ptr->ADDR = I2C_ADDR_ADDR_SET(device_address);
+
+ if (flags & I2C_RD) {
+ ctrl |= I2C_CTRL_DIR_SET(I2C_DIR_MASTER_READ);
+ } else {
+ ctrl |= I2C_CTRL_DIR_SET(I2C_DIR_MASTER_WRITE);
+ }
+
+ if (flags & I2C_NO_START) {
+ ctrl |= I2C_CTRL_PHASE_START_SET(false);
+ } else {
+ ctrl |= I2C_CTRL_PHASE_START_SET(true);
+ }
+
+ if (flags & I2C_NO_STOP) {
+ ctrl |= I2C_CTRL_PHASE_STOP_SET(false);
+ } else {
+ ctrl |= I2C_CTRL_PHASE_STOP_SET(true);
+ }
+
+ i2c_ptr->CTRL = ctrl | I2C_CTRL_PHASE_ADDR_SET(true)
+ | I2C_CTRL_PHASE_DATA_SET(true)
+#ifdef I2C_CTRL_DATACNT_HIGH_MASK
+ | I2C_CTRL_DATACNT_HIGH_SET(I2C_DATACNT_MAP(size) >> 8U)
#endif
+ | I2C_CTRL_DATACNT_SET(I2C_DATACNT_MAP(size));
+ i2c_ptr->SETUP |= I2C_SETUP_DMAEN_MASK;
+ i2c_ptr->CMD = I2C_CMD_ISSUE_DATA_TRANSMISSION;
-static hpm_stat_t i2c_tx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, I2C_Type *i2c_ptr, uint32_t src, uint32_t size)
+ while (i2c_is_addrhit(i2c_ptr) == false) {
+ if (retry > HPM_I2C_DRV_DEFAULT_RETRY_COUNT) {
+ return status_i2c_no_addr_hit;
+ }
+ retry++;
+ }
+ i2c_clear_status(i2c_ptr, I2C_STATUS_ADDRHIT_MASK);
+
+ return status_success;
+}
+
+static i2c_mode_t hpm_i2c_mode_from_hz(rt_uint32_t hz)
{
- dma_handshake_config_t config;
-
- dma_default_handshake_config(dma_ptr, &config);
- config.ch_index = ch_num;
- config.dst = (uint32_t)&i2c_ptr->DATA;
- config.dst_fixed = true;
- config.src = src;
- config.src_fixed = false;
- config.data_width = DMA_TRANSFER_WIDTH_BYTE;
- config.size_in_byte = size;
-
- return dma_setup_handshake(dma_ptr, &config, true);
+ if (hz <= 100000U)
+ {
+ return i2c_mode_normal;
+ }
+ if (hz <= 400000U)
+ {
+ return i2c_mode_fast;
+ }
+
+ return i2c_mode_fast_plus;
}
-static hpm_stat_t i2c_rx_trigger_dma(DMA_Type *dma_ptr, uint8_t ch_num, I2C_Type *i2c_ptr, uint32_t dst, uint32_t size)
+static rt_err_t hpm_i2c_bus_control(struct rt_i2c_bus_device *bus, int cmd, void *args)
{
- dma_handshake_config_t config;
-
- dma_default_handshake_config(dma_ptr, &config);
- config.ch_index = ch_num;
- config.dst = dst;
- config.dst_fixed = false;
- config.src = (uint32_t)&i2c_ptr->DATA;
- config.src_fixed = true;
- config.data_width = DMA_TRANSFER_WIDTH_BYTE;
- config.size_in_byte = size;
-
- return dma_setup_handshake(dma_ptr, &config, true);
+ struct hpm_i2c *i2c_info = (struct hpm_i2c *)bus;
+ i2c_config_t config;
+ hpm_stat_t stat;
+ rt_uint32_t freq;
+ rt_uint32_t hz;
+
+ RT_ASSERT(bus != RT_NULL);
+
+ switch (cmd)
+ {
+ case RT_I2C_DEV_CTRL_CLK:
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
+ hz = *(rt_uint32_t *)args;
+ if (hz == 0U)
+ {
+ return -RT_EINVAL;
+ }
+ config.i2c_mode = hpm_i2c_mode_from_hz(hz);
+ config.is_10bit_addressing = false;
+ freq = clock_get_frequency(i2c_info->clk_name);
+ stat = i2c_init_master(i2c_info->base, freq, &config);
+ if (i2c_info->enable_dma)
+ {
+ i2c_disable_irq(i2c_info->base, I2C_EVENT_TRANSACTION_COMPLETE);
+ }
+ return stat == status_success ? RT_EOK : -RT_ERROR;
+ default:
+ return -RT_EINVAL;
+ }
}
void i2c_dma_channel_tc_callback(DMA_Type *ptr, uint32_t channel, void *user_data)
@@ -320,10 +442,7 @@ void i2c_dma_channel_tc_callback(DMA_Type *ptr, uint32_t channel, void *user_dat
if ((i2c->dma.base == ptr) && i2c->dma.channel == channel)
{
dma_mgr_disable_chn_irq(&i2c->dma, DMA_MGR_INTERRUPT_MASK_TC);
- if (i2c->is_read == true)
- {
- rt_sem_release(i2c->xfer_sem);
- }
+ rt_sem_release(i2c->dma_xfer_sem);
}
rt_hw_interrupt_enable(level);
}
@@ -345,9 +464,11 @@ static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct
rt_uint32_t aligned_len = 0;
rt_uint32_t remaining_size = 0;
rt_uint32_t transfer_len;
+
for (i = 0; i < num; i++)
{
msg = &msgs[i];
+ aligned_buf = (uint8_t*) msg->buf;
remaining_size = msg->len;
if ((msg->len > 0) && (i2c_info->enable_dma))
{
@@ -359,6 +480,7 @@ static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct
/* The allocated pointer is always RT_ALIGN_SIZE aligned */
raw_alloc_buf = (uint8_t*)rt_malloc(aligned_len + HPM_L1C_CACHELINE_SIZE - RT_ALIGN_SIZE);
RT_ASSERT(raw_alloc_buf != RT_NULL);
+ aligned_buf = (uint8_t*)HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)raw_alloc_buf);
}
else
{
@@ -399,31 +521,35 @@ static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct
transfer_len = MIN(I2C_SOC_TRANSFER_COUNT_MAX, remaining_size);
if ((i2c_info->enable_dma))
{
- /* sequential transfer now is not support dma */
- if ((msg->flags & RT_I2C_NO_START) || (msg->flags & RT_I2C_NO_STOP) ||
- (msg->flags & RT_I2C_NO_READ_ACK) || (msg->flags & RT_I2C_NO_READ_ACK) ) {
+ if (msg->flags & RT_I2C_NO_READ_ACK) {
i2c_stat = status_invalid_argument;
break;
}
i2c_info->is_read = true;
- i2c_enable_irq(i2c_info->base, I2C_EVENT_TRANSACTION_COMPLETE);
- dmamux_config(HPM_DMAMUX, i2c_info->dma.channel, i2c_info->dmamux, true);
- i2c_stat = i2c_rx_trigger_dma(i2c_info->dma.base, i2c_info->dma.channel, i2c_info->base,
+ hpm_i2c_prepare_dma_xfer(i2c_info);
+ i2c_stat = i2c_rx_trigger_dma(&i2c_info->dma, i2c_info->base,
core_local_mem_to_sys_address(0, (uint32_t) dummy_buf), transfer_len);
if (i2c_stat != status_success)
{
break;
}
- i2c_stat = i2c_master_start_dma_read(i2c_info->base, msg->addr, msg->len);
+ dma_mgr_enable_chn_irq(&i2c_info->dma, DMA_MGR_INTERRUPT_MASK_TC);
+ i2c_enable_irq(i2c_info->base, I2C_EVENT_TRANSACTION_COMPLETE);
+ i2c_stat = hpm_i2c_master_start_dma_transfer(i2c_info->base, msg->addr, transfer_len, msg->flags);
if (i2c_stat != status_success)
{
break;
}
- rt_sem_take(i2c_info->xfer_sem, RT_WAITING_FOREVER);
+ rt_sem_take(i2c_info->dma_xfer_sem, RT_WAITING_FOREVER);
+ rt_sem_take(i2c_info->i2c_xfer_sem, RT_WAITING_FOREVER);
}
else
{
- i2c_master_transfer(i2c_info->base, msg->addr, dummy_buf, transfer_len, msg->flags);
+ i2c_stat = i2c_master_transfer(i2c_info->base, msg->addr, dummy_buf, transfer_len, msg->flags);
+ if (i2c_stat != status_success)
+ {
+ break;
+ }
}
dummy_buf += transfer_len;
remaining_size -= transfer_len;
@@ -452,31 +578,35 @@ static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct
transfer_len = MIN(I2C_SOC_TRANSFER_COUNT_MAX, remaining_size);
if (i2c_info->enable_dma)
{
- /* sequential transfer now is not support dma */
- if ((msg->flags & RT_I2C_NO_START) || (msg->flags & RT_I2C_NO_STOP) ||
- (msg->flags & RT_I2C_NO_READ_ACK) || (msg->flags & RT_I2C_NO_READ_ACK) ) {
+ if (msg->flags & RT_I2C_NO_READ_ACK) {
i2c_stat = status_invalid_argument;
break;
}
i2c_info->is_read = false;
- i2c_enable_irq(i2c_info->base, I2C_EVENT_TRANSACTION_COMPLETE);
- dmamux_config(HPM_DMAMUX, i2c_info->dma.channel, i2c_info->dmamux, true);
- i2c_stat = i2c_tx_trigger_dma(i2c_info->dma.base, i2c_info->dma.channel, i2c_info->base,
+ hpm_i2c_prepare_dma_xfer(i2c_info);
+ i2c_stat = i2c_tx_trigger_dma(&i2c_info->dma, i2c_info->base,
core_local_mem_to_sys_address(0, (uint32_t) dummy_buf), transfer_len);
if (i2c_stat != status_success)
{
break;
}
- i2c_stat = i2c_master_start_dma_write(i2c_info->base, msg->addr, msg->len);
+ dma_mgr_enable_chn_irq(&i2c_info->dma, DMA_MGR_INTERRUPT_MASK_TC);
+ i2c_enable_irq(i2c_info->base, I2C_EVENT_TRANSACTION_COMPLETE);
+ i2c_stat = hpm_i2c_master_start_dma_transfer(i2c_info->base, msg->addr, transfer_len, msg->flags);
if (i2c_stat != status_success)
{
break;
}
- rt_sem_take(i2c_info->xfer_sem, RT_WAITING_FOREVER);
+ rt_sem_take(i2c_info->dma_xfer_sem, RT_WAITING_FOREVER);
+ rt_sem_take(i2c_info->i2c_xfer_sem, RT_WAITING_FOREVER);
}
else
{
- i2c_master_transfer(i2c_info->base, msg->addr, dummy_buf, transfer_len, msg->flags);
+ i2c_stat = i2c_master_transfer(i2c_info->base, msg->addr, dummy_buf, transfer_len, msg->flags);
+ if (i2c_stat != status_success)
+ {
+ break;
+ }
}
dummy_buf += transfer_len;
remaining_size -= transfer_len;
@@ -493,14 +623,9 @@ static rt_ssize_t hpm_i2c_master_transfer(struct rt_i2c_bus_device *bus, struct
{
break;
}
+ ret++;
}
- if (i2c_stat != status_success)
- {
- return ret;
- }
-
- ret = i;
return ret;
}
@@ -510,11 +635,16 @@ int rt_hw_i2c_init(void)
rt_err_t ret = RT_EOK;
hpm_stat_t stat;
i2c_config_t config;
+ dma_mgr_chn_conf_t dma_config;
rt_uint32_t freq;
char sem_name[RT_NAME_MAX];
for (uint32_t i = 0; i < sizeof(hpm_i2cs) / sizeof(hpm_i2cs[0]); i++) {
- init_i2c_pins(hpm_i2cs[i].base);
+ if (init_i2c_pins(hpm_i2cs[i].base) != status_success) {
+ LOG_E("Failed to initialize I2C%u pins. Please check board configuration", i);
+ ret = -RT_ERROR;
+ continue;
+ }
clock_add_to_group(hpm_i2cs[i].clk_name, BOARD_RUNNING_CORE & 0x1);
clock_set_source_divider(hpm_i2cs[i].clk_name, clk_src_osc24m, 1U);
@@ -524,6 +654,7 @@ int rt_hw_i2c_init(void)
stat = i2c_init_master(hpm_i2cs[i].base, freq, &config);
if (stat != status_success) {
LOG_E("rt i2c device %s init failed", hpm_i2cs[i].bus_name);
+ ret = -RT_ERROR;
}
hpm_i2cs[i].bus.ops = &hpm_i2c_ops;
@@ -534,15 +665,34 @@ int rt_hw_i2c_init(void)
{
return -RT_ERROR;
}
+ dma_mgr_get_default_chn_config(&dma_config);
+ dma_config.en_dmamux = true;
+ dma_config.dmamux_src = hpm_i2cs[i].dmamux;
+ dma_config.src_width = DMA_MGR_TRANSFER_WIDTH_BYTE;
+ dma_config.dst_width = DMA_MGR_TRANSFER_WIDTH_BYTE;
+ stat = dma_mgr_setup_channel(&hpm_i2cs[i].dma, &dma_config);
+ if (stat != status_success)
+ {
+ return -RT_ERROR;
+ }
dma_mgr_install_chn_tc_callback(&hpm_i2cs[i].dma, i2c_dma_channel_tc_callback, (void *)&hpm_i2cs[i]);
dma_mgr_enable_dma_irq_with_priority(&hpm_i2cs[i].dma, 1);
intc_m_enable_irq_with_priority(hpm_i2cs[i].i2c_irq, hpm_i2cs[i].irq_priority);
i2c_disable_irq(hpm_i2cs[i].base, I2C_EVENT_TRANSACTION_COMPLETE);
- rt_sprintf(sem_name, "%s_s", hpm_i2cs[i].bus_name);
- hpm_i2cs[i].xfer_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
- if (hpm_i2cs[i].xfer_sem == RT_NULL)
+ rt_sprintf(sem_name, "%s_i", hpm_i2cs[i].bus_name);
+ hpm_i2cs[i].i2c_xfer_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
+ if (hpm_i2cs[i].i2c_xfer_sem == RT_NULL)
+ {
+ ret = -RT_ENOMEM;
+ break;
+ }
+ rt_sprintf(sem_name, "%s_d", hpm_i2cs[i].bus_name);
+ hpm_i2cs[i].dma_xfer_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
+ if (hpm_i2cs[i].dma_xfer_sem == RT_NULL)
{
- ret = RT_ENOMEM;
+ rt_sem_delete(hpm_i2cs[i].i2c_xfer_sem);
+ hpm_i2cs[i].i2c_xfer_sem = RT_NULL;
+ ret = -RT_ENOMEM;
break;
}
}
@@ -550,6 +700,10 @@ int rt_hw_i2c_init(void)
if (ret != RT_EOK) {
LOG_E("rt i2c device %s register failed, status=%d\n", hpm_i2cs[i].bus_name, ret);
}
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register I2C device to irq table */
+ rt_hw_interrupt_install(hpm_i2cs[i].i2c_irq, (rt_isr_handler_t)handle_i2c_isr, hpm_i2cs[i].base, hpm_i2cs[i].bus_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return ret;
@@ -559,4 +713,3 @@ INIT_DEVICE_EXPORT(rt_hw_i2c_init);
#endif /* RT_USING_I2C */
#endif /*BSP_USING_I2C*/
-
diff --git a/bsp/hpmicro/libraries/drivers/drv_i2s.c b/bsp/hpmicro/libraries/drivers/drv_i2s.c
index 3c9661862261..26d623c0867b 100644
--- a/bsp/hpmicro/libraries/drivers/drv_i2s.c
+++ b/bsp/hpmicro/libraries/drivers/drv_i2s.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2025 HPMicro
+ * Copyright (c) 2022-2023 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -157,7 +157,10 @@ static rt_err_t hpm_i2s_init(struct rt_audio_device* audio)
i2s_get_default_config(hpm_audio->base, &i2s_config);
i2s_config.enable_mclk_out = true;
- i2s_init(hpm_audio->base, &i2s_config);
+ if (status_success != i2s_init(hpm_audio->base, &i2s_config)) {
+ LOG_E("%s init failed.\n", hpm_audio->dev_name);
+ return -RT_ERROR;
+ }
mclk_hz = clock_get_frequency(hpm_audio->clk_name);
i2s_get_default_transfer_config(&transfer);
@@ -414,16 +417,19 @@ static rt_err_t hpm_i2s_configure(struct rt_audio_device* audio, struct rt_audio
/* Stop I2S transfer if the I2S needs to be re-configured */
bool is_enabled = i2s_is_enabled(hpm_audio->base);
i2s_disable(hpm_audio->base);
- i2s_reset_tx_rx(hpm_audio->base);
+ if (status_success != i2s_reset_tx_rx(hpm_audio->base)) {
+ LOG_E("%s reset tx_rx failed.\n", hpm_audio->dev_name);
+ return -RT_ERROR;
+ }
if (is_enabled)
{
if (hpm_audio->i2s_state == hpm_i2s_state_read)
{
- dma_abort_channel(hpm_audio->rx_dma_resource.base, 1u << hpm_audio->rx_dma_resource.channel);
+ dma_mgr_abort_chn_transfer(&(hpm_audio->rx_dma_resource));
}
if (hpm_audio->i2s_state == hpm_i2s_state_write)
{
- dma_abort_channel(hpm_audio->tx_dma_resource.base, 1u << hpm_audio->tx_dma_resource.channel);
+ dma_mgr_abort_chn_transfer(&(hpm_audio->tx_dma_resource));
}
}
if (status_success != i2s_config_transfer(hpm_audio->base, clock_get_frequency(hpm_audio->clk_name), &hpm_audio->transfer))
@@ -469,9 +475,13 @@ static rt_err_t hpm_i2s_start(struct rt_audio_device* audio, int stream)
LOG_E("no dma resource available for I2S TX transfer.\n");
return -RT_ERROR;
}
- i2s_reset_tx(hpm_audio->base); /* disable and reset tx */
+ if (status_success != i2s_reset_tx(hpm_audio->base)) { /* disable and reset tx */
+ LOG_E("%s reset tx failed.\n", hpm_audio->dev_name);
+ return -RT_ERROR;
+ }
+ i2s_enable_tx_line(hpm_audio->base, hpm_audio->transfer.data_line);
/* fill 2 dummy data, it is suitable for 1/2 channel of audio */
- if (i2s_fill_tx_dummy_data(hpm_audio->base, hpm_audio->transfer.data_line , 2) != status_success) {
+ if (i2s_fill_tx_dummy_data(hpm_audio->base, hpm_audio->transfer.data_line, 2) != status_success) {
return -RT_ERROR;
}
rt_audio_tx_complete(audio);
@@ -491,7 +501,11 @@ static rt_err_t hpm_i2s_start(struct rt_audio_device* audio, int stream)
LOG_E("no dma resource available for I2S RX transfer.\n");
return -RT_ERROR;
}
- i2s_reset_rx(hpm_audio->base); /* disable and reset rx */
+ if (status_success != i2s_reset_rx(hpm_audio->base)) { /* disable and reset rx */
+ LOG_E("%s reset rx failed.\n", hpm_audio->dev_name);
+ return -RT_ERROR;
+ }
+ i2s_enable_rx_line(hpm_audio->base, hpm_audio->transfer.data_line);
if (I2S_FIFO_SIZE != hpm_i2s_transmit(&hpm_audio->audio, NULL, hpm_audio->rx_buff, I2S_FIFO_SIZE)) {
return -RT_ERROR;
}
@@ -513,12 +527,12 @@ static rt_err_t hpm_i2s_stop(struct rt_audio_device* audio, int stream)
if (stream == AUDIO_STREAM_REPLAY) {
dma_resource_t *dma_resource = &hpm_audio->tx_dma_resource;
- dma_abort_channel(dma_resource->base, 1u << dma_resource->channel);
+ dma_mgr_abort_chn_transfer(dma_resource);
dma_mgr_release_resource(dma_resource);
} else if (stream == AUDIO_STREAM_RECORD)
{
dma_resource_t *dma_resource = &hpm_audio->rx_dma_resource;
- dma_abort_channel(dma_resource->base, 1u << dma_resource->channel);
+ dma_mgr_abort_chn_transfer(dma_resource);
dma_mgr_release_resource(dma_resource);
} else {
return -RT_ERROR;
@@ -559,6 +573,7 @@ static rt_ssize_t hpm_i2s_transmit(struct rt_audio_device* audio, const void* wr
ch_config.size_in_byte = size;
ch_config.dst_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
ch_config.src_burst_size = DMA_NUM_TRANSFER_PER_BURST_1T;
+ ch_config.interrupt_mask = DMA_INTERRUPT_MASK_ABORT;
if (l1c_dc_is_enabled()) {
/* cache writeback for sent buff */
@@ -583,6 +598,7 @@ static rt_ssize_t hpm_i2s_transmit(struct rt_audio_device* audio, const void* wr
ch_config.size_in_byte = size;
ch_config.src_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
ch_config.src_burst_size = DMA_NUM_TRANSFER_PER_BURST_1T;
+ ch_config.interrupt_mask = DMA_INTERRUPT_MASK_ABORT;
hpm_audio->i2s_state = hpm_i2s_state_read;
if (status_success != dma_setup_channel(dma_resource->base, dma_resource->channel, &ch_config, true)) {
diff --git a/bsp/hpmicro/libraries/drivers/drv_lcd.c b/bsp/hpmicro/libraries/drivers/drv_lcd.c
index 1fa4951f9d65..f2541d3b9208 100644
--- a/bsp/hpmicro/libraries/drivers/drv_lcd.c
+++ b/bsp/hpmicro/libraries/drivers/drv_lcd.c
@@ -17,11 +17,10 @@
#include "hpm_pdma_drv.h"
#include "hpm_panel.h"
-
#define LCD_BITS_PER_PIXEL 16
#define LCD_PIXEL_FORMAT RTGRAPHIC_PIXEL_FORMAT_RGB565
#define LCD_LAYER_INDEX (0)
-#define LCD_LAYER_DONE_MASK (1U << LCD_LAYER_INDEX)
+#define LCD_LAYER_DONE_MASK (1U<lcd_base, LCDC_INT_EN_VSYNC_MASK);
+ rt_sem_release(&hpm_lcds_pram->lcd_lock);
+ lcdc_clear_status(hpm_lcds_pram->lcd_base, LCDC_ST_VSYNC_MASK);
+}
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
static rt_err_t hpm_lcd_init(struct rt_device *device)
{
@@ -100,6 +108,7 @@ static rt_err_t hpm_lcd_control(struct rt_device *device, int cmd, void *args)
hpm_panel_t *panel = hpm_panel_find_device_default();
struct rt_device_graphic_info *info = RT_NULL;
uint32_t buffer;
+ rt_err_t err = RT_EOK;
switch (cmd)
{
@@ -108,7 +117,7 @@ static rt_err_t hpm_lcd_control(struct rt_device *device, int cmd, void *args)
rt_sem_trytake(&lcd->lcd_lock);
lcdc_disable_interrupt(lcd->lcd_base, LCDC_INT_EN_VSYNC_MASK);
rt_thread_delay(10);
- hpm_lcdc_init(lcd, info);
+ err = hpm_lcdc_init(lcd, info);
break;
case RTGRAPHIC_CTRL_RECT_UPDATE:
@@ -161,6 +170,7 @@ static rt_err_t hpm_lcd_control(struct rt_device *device, int cmd, void *args)
default:
break;
}
+ return err;
}
static int hpm_lcdc_init(struct hpm_lcd *lcd, struct rt_device_graphic_info *info)
@@ -240,6 +250,10 @@ int drv_lcd_hw_init(void)
result = -RT_ERROR;
goto __exit;
}
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register LCD device to irq table */
+ rt_hw_interrupt_install(hpm_lcds[i].lcd_irq, (rt_isr_handler_t)isr_lcd_d, hpm_lcds[i], hpm_lcds[i].bus_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
__exit:
if (result != RT_EOK)
{
diff --git a/bsp/hpmicro/libraries/drivers/drv_mcan.c b/bsp/hpmicro/libraries/drivers/drv_mcan.c
index 55dcfcb8ade7..191613af49d3 100644
--- a/bsp/hpmicro/libraries/drivers/drv_mcan.c
+++ b/bsp/hpmicro/libraries/drivers/drv_mcan.c
@@ -1,499 +1,630 @@
+
+
/*
* Copyright (c) 2023-2025 HPMicro
- *
* SPDX-License-Identifier: BSD-3-Clause
+ * @file drv_mcan.c
+ * @brief MCAN (CAN-FD) driver implementation for RT-Thread
+ *
+ * This file implements the MCAN (CAN with Flexible Data-rate) driver for HPMicro
+ * microcontrollers, supporting up to 8 MCAN instances (MCAN0-MCAN7). The driver
+ * provides both classic CAN and CAN-FD functionality with configurable bit rates,
+ * message filtering, and interrupt handling.
+ *
+ * Features:
+ * - Support for up to 8 MCAN controllers (MCAN0-MCAN7)
+ * - CAN 2.0A/B and CAN FD support
+ * - Hardware filtering with up to 128 standard and 64 extended filters
+ * - Interrupt-driven operation
+ * - Error handling and status reporting
+ * - Configurable baud rates and timing parameters
+ * - AHB RAM message buffer support for improved performance
*
* Change Logs:
* Date Author Notes
* 2023-04-07 HPMicro the first version
* 2024-05-31 HPMicro add MCAN4-7 support
+ * 2025-09-01 HPMicro remove repetitive codes and optimize the implementation
*/
-#include
-#include
-#include
-#include "board.h"
-#include "hpm_mcan_drv.h"
+#include "rtconfig.h"
-#include "hpm_clock_drv.h"
+#ifdef RT_USING_CAN
-#define CAN_SEND_WAIT_MS_MAX (1000U) /* CAN maximum wait time for transmission */
-#define CAN_SENDBOX_NUM (1U) /* CAN Hardware Transmission buffer number */
-#define CAN_STD_FILTER_NUM_MAX (128U) /* std Filter number */
-#define CAN_EXT_FILTER_NUM_MAX (64U) /* ext Filter number */
+/* ============================================================================
+ * Include Files
+ * ============================================================================ */
-#ifdef RT_USING_CAN
+/* HPMicro SDK includes */
+#include "board.h" /* Board support package definitions */
+#include "hpm_clock_drv.h" /* Clock management functions */
+#include "hpm_mcan_drv.h" /* MCAN hardware abstraction layer */
-typedef struct _hpm_can_struct
-{
- MCAN_Type *can_base; /**< CAN Base address */
- const char *name; /**< CAN device name */
- int32_t irq_num; /**< CAN IRQ index */
- uint8_t irq_priority; /**< CAN IRQ priority */
- clock_name_t clk_name; /**< CAN clock name */
- uint32_t fifo_index; /**< FIFO index, it is a fake value to satisfy the driver framework */
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- uint32_t ram_base;
- uint32_t ram_size;
-#endif
- mcan_config_t can_config; /**< CAN configuration for IP */
- struct rt_can_device can_dev; /**< CAN device configuration in rt-thread */
- uint32_t irq_txrx_err_enable_mask; /**< CAN TX and RX IRQ Enable Mask */
- uint32_t std_filter_num; /**< std Filter number */
- mcan_filter_elem_t std_can_filters[CAN_STD_FILTER_NUM_MAX];
- uint32_t ext_filter_num; /**< ext Filter number */
- mcan_filter_elem_t ext_can_filters[CAN_EXT_FILTER_NUM_MAX];
+/* RT-Thread includes */
+#include /* RT-Thread device framework */
+#include /* RT-Thread hardware abstraction */
+#include /* RT-Thread core services */
+
+/* ============================================================================
+ * Configuration Constants
+ * ============================================================================ */
+
+#define CAN_SEND_WAIT_MS_MAX (1000U) /* CAN maximum wait time for transmission */
+#define CAN_SENDBOX_NUM (1U) /* CAN Hardware Transmission buffer number */
+#define CAN_STD_FILTER_NUM_MAX (128U) /* std Filter number */
+#define CAN_EXT_FILTER_NUM_MAX (64U) /* ext Filter number */
+
+#define CAN_STD_ID_MASK (0x7FFU)
+#define CAN_EXT_ID_MASK (0x1FFFFFFFUL)
+
+/* ============================================================================
+ * IRQ Priority Configuration Macros
+ * ============================================================================ */
+
+/**
+ * @brief MCAN IRQ Priority Configuration Macros
+ *
+ * These macros provide a flexible way to configure IRQ priorities for each MCAN
+ * instance. Each macro checks if a BSP-specific priority is defined, otherwise
+ * defaults to priority 1.
+ *
+ * Usage:
+ * - MCAN_IRQ_PRI_VAL_0 through MCAN_IRQ_PRI_VAL_7: Get priority for specific instance
+ * - MCAN_IRQ_PRI_VAL(n): Generic macro to get priority for instance n
+ */
+
+/* MCAN IRQ Priority Configuration Macros */
+#ifdef BSP_MCAN0_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_0 BSP_MCAN0_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_0 1
+#endif
+
+#ifdef BSP_MCAN1_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_1 BSP_MCAN1_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_1 1
+#endif
+
+#ifdef BSP_MCAN2_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_2 BSP_MCAN2_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_2 1
+#endif
+
+#ifdef BSP_MCAN3_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_3 BSP_MCAN3_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_3 1
+#endif
+
+#ifdef BSP_MCAN4_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_4 BSP_MCAN4_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_4 1
+#endif
+
+#ifdef BSP_MCAN5_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_5 BSP_MCAN5_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_5 1
+#endif
+
+#ifdef BSP_MCAN6_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_6 BSP_MCAN6_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_6 1
+#endif
+
+#ifdef BSP_MCAN7_IRQ_PRIORITY
+#define MCAN_IRQ_PRI_VAL_7 BSP_MCAN7_IRQ_PRIORITY
+#else
+#define MCAN_IRQ_PRI_VAL_7 1
+#endif
+
+/** @brief Generic macro to get IRQ priority for MCAN instance n */
+#define MCAN_IRQ_PRI_VAL(n) MCAN_IRQ_PRI_VAL_##n
+
+#define CAN_UNITED (0UL)
+#define CAN_INITED (1UL)
+#define CAN_RUNNING (2UL)
+#define CAN_STOPPED (3UL)
+
+
+/* ============================================================================
+ * Data Structures
+ * ============================================================================ */
+
+/**
+ * @brief HPM MCAN device structure
+ *
+ * This structure contains all the necessary information for managing a single
+ * MCAN instance, including hardware configuration, RT-Thread device integration,
+ * and message filtering capabilities.
+ */
+typedef struct _hpm_can_struct {
+ MCAN_Type *can_base; /**< MCAN hardware base address */
+ const char *name; /**< Device name (e.g., "can0", "can1") */
+ rt_int32_t irq_num; /**< Interrupt number for this MCAN instance */
+ rt_uint8_t irq_priority; /**< Interrupt priority for this MCAN instance */
+ clock_name_t clk_name; /**< Clock source name for this MCAN instance */
+ rt_uint32_t fifo_index; /**< FIFO index (used for RT-Thread framework compatibility) */
+ rt_uint32_t ram_base; /**< Message buffer RAM base address (NULL for HPM6200) */
+ rt_uint32_t ram_size; /**< Message buffer RAM size (0 for HPM6200) */
+ mcan_config_t can_config; /**< MCAN hardware configuration structure */
+ struct rt_can_device can_dev; /**< RT-Thread CAN device structure */
+ rt_uint32_t irq_txrx_err_enable_mask; /**< Bitmask for enabled TX/RX/Error interrupts */
+ rt_uint32_t std_filter_num; /**< Number of configured standard ID filters */
+ mcan_filter_elem_t std_can_filters[CAN_STD_FILTER_NUM_MAX]; /**< Standard ID filter array */
+ rt_uint32_t ext_filter_num; /**< Number of configured extended ID filters */
+ mcan_filter_elem_t ext_can_filters[CAN_EXT_FILTER_NUM_MAX]; /**< Extended ID filter array */
+ rt_uint32_t can_tx_fifo_index; /**< CAN TX FIFO index */
+ rt_uint8_t can_stat; /**< CAN status */
} hpm_can_t;
+/* ============================================================================
+ * Default Filter Configurations
+ * ============================================================================ */
+
+/**
+ * @brief Default standard ID filter configuration
+ *
+ * This filter accepts all standard ID messages and stores them in RXFIFO0.
+ * Used when no specific filters are configured by the application.
+ */
static const mcan_filter_elem_t k_default_std_id_filter = {
- /* Use classic filter */
- .filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER,
- /* Store message into RXFIFO0 if matching */
- .filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH,
- /* For Standard ID only */
- .can_id_type = MCAN_CAN_ID_TYPE_STANDARD,
- /* Sync Message, only evaluated when "CCCR.UTSU" is set */
- .sync_message = 0U,
- /* Don't care if mask is set to all 1s */
- .filter_id = 0U,
- /* Accept all messages */
- .filter_mask = 0x7FFU,
+ .filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER, /**< Use classic filter type */
+ .filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH, /**< Store in RXFIFO0 on match */
+ .can_id_type = MCAN_CAN_ID_TYPE_STANDARD, /**< Standard 11-bit ID */
+ .sync_message = 0U, /**< Not a sync message */
+ .filter_id = 0U, /**< Filter ID (don't care) */
+ .filter_mask = 0U, /**< Accept all messages */
};
+/**
+ * @brief Default extended ID filter configuration
+ *
+ * This filter accepts all extended ID messages and stores them in RXFIFO0.
+ * Used when no specific filters are configured by the application.
+ */
static const mcan_filter_elem_t k_default_ext_id_filter = {
- /* Use classic filter */
- .filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER,
- /* Store message into RXFIFO0 if matching */
- .filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH,
- /* For Extended ID only */
- .can_id_type = MCAN_CAN_ID_TYPE_EXTENDED,
- /* Sync Message, only evaluated when "CCCR.UTSU" is set */
- .sync_message = 0,
- /* Don't care if mask is set to all 1s */
- .filter_id = 0,
- /* Accept all messages */
- .filter_mask = 0x1FFFFFFFUL,
+ .filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER, /**< Use classic filter type */
+ .filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH, /**< Store in RXFIFO0 on match */
+ .can_id_type = MCAN_CAN_ID_TYPE_EXTENDED, /**< Extended 29-bit ID */
+ .sync_message = 0, /**< Not a sync message */
+ .filter_id = 0, /**< Filter ID (don't care) */
+ .filter_mask = 0U, /**< Accept all messages */
};
+/* ============================================================================
+ * Function Declarations
+ * ============================================================================ */
/**
- * @brief Configure CAN controller
- * @param [in/out] can CAN device pointer
- * @param [in] cfg CAN configuration pointer
- * @retval RT_EOK for valid configuration
- * @retval -RT_ERROR for invalid configuration
+ * @brief Configure MCAN controller
+ *
+ * Initializes the MCAN hardware with the specified configuration including
+ * baud rate, mode, and timing parameters.
+ *
+ * @param[in,out] can Pointer to RT-Thread CAN device structure
+ * @param[in] cfg Pointer to CAN configuration structure
+ * @return RT_EOK on success, -RT_ERROR on failure
*/
static rt_err_t hpm_mcan_configure(struct rt_can_device *can, struct can_configure *cfg);
/**
- * @brief Control/Get CAN state
- * including:interrupt, mode, priority, baudrate, filter, status
- * @param [in/out] can CAN device pointer
- * @param [in] cmd Control command
- * @param [in/out] arg Argument pointer
- * @retval RT_EOK for valid control command and arg
- * @retval -RT_ERROR for invalid control command or arg
+ * @brief Control MCAN device operations
+ *
+ * Handles various control commands including interrupt management, mode changes,
+ * baud rate configuration, filter setup, and status retrieval.
+ *
+ * @param[in,out] can Pointer to RT-Thread CAN device structure
+ * @param[in] cmd Control command (RT_DEVICE_CTRL_*, RT_CAN_CMD_*)
+ * @param[in,out] arg Command-specific argument pointer
+ * @return RT_EOK on success, -RT_ERROR on failure
*/
static rt_err_t hpm_mcan_control(struct rt_can_device *can, int cmd, void *arg);
/**
- * @brief Send out CAN message
- * @param [in] can CAN device pointer
- * @param [in] buf CAN message buffer
- * @param [in] boxno Mailbox number, it is not used in this porting
- * @retval RT_EOK No error
- * @retval -RT_ETIMEOUT timeout happened
- * @retval -RT_EFULL Transmission buffer is full
+ * @brief Send CAN message
+ *
+ * Transmits a CAN message through the specified MCAN instance.
+ * Supports both classic CAN and CAN-FD frames.
+ *
+ * @param[in] can Pointer to RT-Thread CAN device structure
+ * @param[in] buf Pointer to CAN message buffer
+ * @param[in] boxno Mailbox number (not used in this implementation)
+ * @return RT_EOK on success, -RT_ETIMEOUT on timeout, -RT_EFULL if buffer full
*/
-static int hpm_mcan_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);
+static rt_ssize_t hpm_mcan_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno);
/**
- * @brief Receive message from CAN
- * @param [in] can CAN device pointer
- * @param [out] buf CAN receive buffer
- * @param [in] boxno Mailbox Number, it is not used in this porting
- * @retval RT_EOK no error
- * @retval -RT_ERROR Error happened during reading receive FIFO
- * @retval -RT_EMPTY no data in receive FIFO
+ * @brief Receive CAN message
+ *
+ * Receives a CAN message from the MCAN RX FIFO.
+ * Supports both classic CAN and CAN-FD frames.
+ *
+ * @param[in] can Pointer to RT-Thread CAN device structure
+ * @param[out] buf Pointer to receive buffer for CAN message
+ * @param[in] boxno Mailbox number (not used in this implementation)
+ * @return RT_EOK on success, -RT_ERROR on error, -RT_EMPTY if no data
*/
-static int hpm_mcan_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
+static rt_ssize_t hpm_mcan_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno);
/**
- * @brief Common Interrupt Service routine
- * @param [in] hpm_can HPM CAN pointer
+ * @brief MCAN interrupt service routine
+ *
+ * Handles all MCAN interrupts including transmission completion, reception,
+ * FIFO overflow, and error conditions. Updates RT-Thread CAN device status.
+ *
+ * @param[in] hpm_can Pointer to HPM MCAN device structure
*/
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_mcan_isr(hpm_can_t *hpm_can);
+#else
+static void hpm_mcan_isr(int vector, hpm_can_t *hpm_can);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
/**
- * @brief Decode data bytes from DLC
- * @param [in] dlc Data Length Code
- * @return decoded data bytes
+ * @brief Convert DLC to data byte count
+ *
+ * Converts Data Length Code (DLC) to actual number of data bytes.
+ * Handles both classic CAN (0-8 bytes) and CAN-FD (0-64 bytes) formats.
+ *
+ * @param[in] dlc Data Length Code value
+ * @return Number of data bytes
*/
static uint8_t can_get_data_bytes_from_dlc(uint32_t dlc);
+/* ============================================================================
+ * Device Definition Macros
+ * ============================================================================ */
+
+/**
+ * @brief Define MCAN device instance macro
+ *
+ * This macro creates a complete MCAN device instance including:
+ * - Device structure initialization
+ * - Interrupt service routine declaration
+ * - ISR function implementation
+ *
+ * @param n MCAN instance number (0-7)
+ */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+#define MCAN_DEFINE_DEVICE(n) \
+ static hpm_can_t dev_can##n = { \
+ .can_base = HPM_MCAN##n, \
+ .name = "can" #n, \
+ .irq_num = IRQn_MCAN##n, \
+ .irq_priority = MCAN_IRQ_PRI_VAL(n), \
+ .fifo_index = n, \
+ .clk_name = clock_can##n, \
+ MCAN_RAM_PARAMS(n), \
+ }; \
+ SDK_DECLARE_EXT_ISR_M(IRQn_MCAN##n, can##n##_isr); \
+ void can##n##_isr(void) \
+ { \
+ hpm_mcan_isr(&dev_can##n); \
+ }
+#else
+#define MCAN_DEFINE_DEVICE(n) \
+ static hpm_can_t dev_can##n = { \
+ .can_base = HPM_MCAN##n, \
+ .name = "can" #n, \
+ .irq_num = IRQn_MCAN##n, \
+ .irq_priority = MCAN_IRQ_PRI_VAL(n), \
+ .fifo_index = n, \
+ .clk_name = clock_can##n, \
+ MCAN_RAM_PARAMS(n), \
+ };
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+/**
+ * @brief RAM parameters macro for MCAN device
+ *
+ * Conditionally sets RAM base and size parameters based on SoC capabilities.
+ * Some SoCs (like HPM6200) don't support AHB RAM message buffers.
+ *
+ * @param n MCAN instance number (0-7)
+ */
+#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
+#define MCAN_RAM_PARAMS(n) .ram_base = (uint32_t)mcan##n##_msg_buf, .ram_size = mcan##n##_msg_buf_size
+#else
+#define MCAN_RAM_PARAMS(n) .ram_base = (uint32_t)NULL, .ram_size = 0
+#endif
+
+/**
+ * @brief Initialize message buffer in AHB RAM macro
+ *
+ * Creates message buffer arrays in AHB RAM for SoCs that support it.
+ * This improves performance by placing message buffers in faster memory.
+ *
+ * @param n MCAN instance number (0-7)
+ */
#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
+#define MCAN_INIT_MSG_BUF_IN_AHB_RAM(n) \
+ ATTR_PLACE_AT(".ahb_sram") \
+ uint32_t mcan##n##_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS]; \
+ const uint32_t mcan##n##_msg_buf_size = sizeof(mcan##n##_msg_buf);
+
+/* ============================================================================
+ * Message Buffer Allocation (AHB RAM)
+ * ============================================================================ */
+
+/**
+ * @brief Allocate message buffers in AHB RAM for each enabled MCAN instance
+ *
+ * These buffers are placed in AHB RAM for improved performance on supported SoCs.
+ * Each MCAN instance gets its own dedicated message buffer space.
+ */
+
#if defined(HPM_MCAN0_BASE) && defined(BSP_USING_MCAN0)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan0_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(0)
#endif
+
#if defined(HPM_MCAN1_BASE) && defined(BSP_USING_MCAN1)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan1_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(1)
#endif
+
#if defined(HPM_MCAN2_BASE) && defined(BSP_USING_MCAN2)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan2_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(2)
#endif
+
#if defined(HPM_MCAN3_BASE) && defined(BSP_USING_MCAN3)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan3_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(3)
#endif
+
#if defined(HPM_MCAN4_BASE) && defined(BSP_USING_MCAN4)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan4_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(4)
#endif
+
#if defined(HPM_MCAN5_BASE) && defined(BSP_USING_MCAN5)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan5_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(5)
#endif
+
#if defined(HPM_MCAN6_BASE) && defined(BSP_USING_MCAN6)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan6_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(6)
#endif
+
#if defined(HPM_MCAN7_BASE) && defined(BSP_USING_MCAN7)
-ATTR_PLACE_AT(".ahb_sram") uint32_t mcan7_msg_buf[MCAN_MSG_BUF_SIZE_IN_WORDS];
-#endif
+MCAN_INIT_MSG_BUF_IN_AHB_RAM(7)
#endif
-#if defined(HPM_MCAN0_BASE) && defined(BSP_USING_MCAN0)
-static hpm_can_t dev_can0 =
-{
- .can_base = HPM_MCAN0,
- .name = "can0",
- .irq_num = IRQn_MCAN0,
-#if defined(BSP_MCAN0_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN0_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 0,
- .clk_name = clock_can0,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan0_msg_buf,
- .ram_size = sizeof(mcan0_msg_buf),
-#endif
-};
+#endif /* MCAN_SOC_MSG_BUF_IN_AHB_RAM */
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN0, can0_isr);
-void can0_isr(void)
-{
- hpm_mcan_isr(&dev_can0);
-}
+/* ============================================================================
+ * MCAN Device Instances
+ * ============================================================================ */
+/**
+ * @brief Create MCAN device instances for each enabled MCAN peripheral
+ *
+ * Each enabled MCAN instance gets its own device structure, interrupt handler,
+ * and ISR function. The MCAN_DEFINE_DEVICE macro handles all the boilerplate
+ * code for device initialization.
+ */
+
+#if defined(HPM_MCAN0_BASE) && defined(BSP_USING_MCAN0)
+MCAN_DEFINE_DEVICE(0)
#endif
#if defined(HPM_MCAN1_BASE) && defined(BSP_USING_MCAN1)
-static hpm_can_t dev_can1 =
-{
- .can_base = HPM_MCAN1,
- .name = "can1",
- .irq_num = IRQn_MCAN1,
-#if defined(BSP_MCAN1_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN1_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 1,
- .clk_name = clock_can1,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan1_msg_buf,
- .ram_size = sizeof(mcan1_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN1, can1_isr);
-void can1_isr(void)
-{
- hpm_mcan_isr(&dev_can1);
-}
+MCAN_DEFINE_DEVICE(1)
#endif
#if defined(HPM_MCAN2_BASE) && defined(BSP_USING_MCAN2)
-static hpm_can_t dev_can2 =
-{
- .can_base = HPM_MCAN2,
- .name = "can2",
- .irq_num = IRQn_MCAN2,
-#if defined(BSP_MCAN2_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN2_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 2,
- .clk_name = clock_can2,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan2_msg_buf,
- .ram_size = sizeof(mcan2_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN2, can2_isr);
-void can2_isr(void)
-{
- hpm_mcan_isr(&dev_can2);
-}
+MCAN_DEFINE_DEVICE(2)
#endif
#if defined(HPM_MCAN3_BASE) && defined(BSP_USING_MCAN3)
-static hpm_can_t dev_can3 =
-{
- .can_base = HPM_MCAN3,
- .name = "can3",
- .irq_num = IRQn_MCAN3,
-#if defined(BSP_MCAN3_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN3_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 3,
- .clk_name = clock_can3,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan3_msg_buf,
- .ram_size = sizeof(mcan3_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN3, can3_isr);
-void can3_isr(void)
-{
- hpm_mcan_isr(&dev_can3);
-}
+MCAN_DEFINE_DEVICE(3)
#endif
#if defined(HPM_MCAN4_BASE) && defined(BSP_USING_MCAN4)
-static hpm_can_t dev_can4 =
-{
- .can_base = HPM_MCAN4,
- .name = "can4",
- .irq_num = IRQn_MCAN4,
-#if defined(BSP_MCAN4_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN4_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 4,
- .clk_name = clock_can4,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan4_msg_buf,
- .ram_size = sizeof(mcan4_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN4, can4_isr);
-void can4_isr(void)
-{
- hpm_mcan_isr(&dev_can4);
-}
+MCAN_DEFINE_DEVICE(4)
#endif
#if defined(HPM_MCAN5_BASE) && defined(BSP_USING_MCAN5)
-static hpm_can_t dev_can5 =
-{
- .can_base = HPM_MCAN5,
- .name = "can5",
- .irq_num = IRQn_MCAN5,
-#if defined(BSP_MCAN5_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN5_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 5,
- .clk_name = clock_can5,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan5_msg_buf,
- .ram_size = sizeof(mcan5_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN5, can5_isr);
-void can5_isr(void)
-{
- hpm_mcan_isr(&dev_can5);
-}
+MCAN_DEFINE_DEVICE(5)
#endif
#if defined(HPM_MCAN6_BASE) && defined(BSP_USING_MCAN6)
-static hpm_can_t dev_can6 =
-{
- .can_base = HPM_MCAN6,
- .name = "can6",
- .irq_num = IRQn_MCAN6,
-#if defined(BSP_MCAN6_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN6_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 6,
- .clk_name = clock_can6,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan6_msg_buf,
- .ram_size = sizeof(mcan6_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN6, can6_isr);
-void can6_isr(void)
-{
- hpm_mcan_isr(&dev_can6);
-}
+MCAN_DEFINE_DEVICE(6)
#endif
#if defined(HPM_MCAN7_BASE) && defined(BSP_USING_MCAN7)
-static hpm_can_t dev_can7 =
-{
- .can_base = HPM_MCAN7,
- .name = "can7",
- .irq_num = IRQn_MCAN7,
-#if defined(BSP_MCAN7_IRQ_PRIORITY)
- .irq_priority = BSP_MCAN7_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- .fifo_index = 7,
- .clk_name = clock_can7,
-#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
- .ram_base = (uint32_t) &mcan7_msg_buf,
- .ram_size = sizeof(mcan7_msg_buf),
-#endif
-};
-SDK_DECLARE_EXT_ISR_M(IRQn_MCAN7, can7_isr);
-void can7_isr(void)
-{
- hpm_mcan_isr(&dev_can7);
-}
+MCAN_DEFINE_DEVICE(7)
#endif
+/* ============================================================================
+ * Device Management Arrays
+ * ============================================================================ */
+
+/**
+ * @brief Array of pointers to all enabled MCAN device instances
+ *
+ * This array is used by the initialization function to iterate through
+ * all enabled MCAN instances and register them with RT-Thread.
+ */
static hpm_can_t *hpm_cans[] = {
#if defined(HPM_MCAN0_BASE) && defined(BSP_USING_MCAN0)
- &dev_can0,
+ &dev_can0,
#endif
#if defined(HPM_MCAN1_BASE) && defined(BSP_USING_MCAN1)
- &dev_can1,
+ &dev_can1,
#endif
#if defined(HPM_MCAN2_BASE) && defined(BSP_USING_MCAN2)
- &dev_can2,
+ &dev_can2,
#endif
#if defined(HPM_MCAN3_BASE) && defined(BSP_USING_MCAN3)
- &dev_can3,
+ &dev_can3,
#endif
#if defined(HPM_MCAN4_BASE) && defined(BSP_USING_MCAN4)
- &dev_can4,
+ &dev_can4,
#endif
#if defined(HPM_MCAN5_BASE) && defined(BSP_USING_MCAN5)
- &dev_can5,
+ &dev_can5,
#endif
#if defined(HPM_MCAN6_BASE) && defined(BSP_USING_MCAN6)
- &dev_can6,
+ &dev_can6,
#endif
#if defined(HPM_MCAN7_BASE) && defined(BSP_USING_MCAN7)
- &dev_can7,
+ &dev_can7,
#endif
- };
-
+};
+/**
+ * @brief RT-Thread CAN device operations structure
+ *
+ * This structure defines the function pointers that RT-Thread uses to
+ * interact with the MCAN driver. It implements the standard CAN device
+ * interface for RT-Thread.
+ */
static const struct rt_can_ops hpm_can_ops = {
- .configure = hpm_mcan_configure,
- .control = hpm_mcan_control,
- .sendmsg = hpm_mcan_sendmsg,
- .recvmsg = hpm_mcan_recvmsg,
+ .configure = hpm_mcan_configure, /**< Configure MCAN controller */
+ .control = hpm_mcan_control, /**< Control MCAN device operations */
+ .sendmsg = hpm_mcan_sendmsg, /**< Send CAN message */
+ .recvmsg = hpm_mcan_recvmsg, /**< Receive CAN message */
};
+/* ============================================================================
+ * Interrupt Service Routine
+ * ============================================================================ */
-
+/**
+ * @brief MCAN interrupt service routine
+ *
+ * Handles all MCAN interrupts including transmission completion, reception,
+ * FIFO overflow, and error conditions. Updates RT-Thread CAN device status
+ * and notifies the framework of events.
+ *
+ * @param[in] hpm_can Pointer to HPM MCAN device structure
+ */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_mcan_isr(hpm_can_t *hpm_can)
+#else
+static void hpm_mcan_isr(int vector, hpm_can_t *hpm_can)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
uint8_t error_flags = mcan_get_last_error_code(hpm_can->can_base);
uint32_t flags = mcan_get_interrupt_flags(hpm_can->can_base);
mcan_error_count_t err_cnt;
- /* Transmit completed */
+
+ /* Handle transmission completion interrupt */
if ((flags & (MCAN_EVENT_TRANSMIT)) != 0U) {
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_TX_DONE | (0UL << 8));
}
- /* Data available in FIFO */
- if ((flags & MCAN_EVENT_RECEIVE) != 0)
- {
+ /* Handle reception interrupt - data available in FIFO */
+ if (((flags & MCAN_EVENT_RECEIVE) != 0) && ((hpm_can->can_stat != CAN_STOPPED) || (hpm_can->can_stat != CAN_UNITED))) {
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_RX_IND | (hpm_can->fifo_index << 8));
}
- /* RX FIFO overflow */
- if ((flags & MCAN_INT_RXFIFO0_FULL) != 0U)
- {
+ /* Handle RX FIFO overflow interrupts */
+ if (((flags & MCAN_INT_RXFIFO0_FULL) != 0U) && ((hpm_can->can_stat != CAN_STOPPED) || (hpm_can->can_stat != CAN_UNITED))) {
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_RXOF_IND | (hpm_can->fifo_index << 8));
}
- if ((flags & MCAN_INT_RXFIFO1_FULL) != 0U)
- {
+ if (((flags & MCAN_INT_RXFIFO1_FULL) != 0U) && ((hpm_can->can_stat != CAN_STOPPED) || (hpm_can->can_stat != CAN_UNITED))) {
rt_hw_can_isr(&hpm_can->can_dev, RT_CAN_EVENT_RXOF_IND | (hpm_can->fifo_index << 8));
}
- /* Error happened on CAN Bus */
- if (((flags & MCAN_EVENT_ERROR) != 0U) || (error_flags != 0U))
- {
+ /* Handle CAN bus error conditions */
+ if (((flags & MCAN_EVENT_ERROR) != 0U) || (error_flags != 0U)) {
mcan_get_error_counter(hpm_can->can_base, &err_cnt);
- switch(error_flags)
- {
- case 3:
+
+ /* Update specific error counters based on error type */
+ switch (error_flags) {
+ case 3: /* Acknowledgment error */
hpm_can->can_dev.status.ackerrcnt++;
break;
- case 4:
+ case 4: /* Bit error */
hpm_can->can_dev.status.biterrcnt++;
break;
- case 6:
+ case 6: /* CRC error */
hpm_can->can_dev.status.crcerrcnt++;
break;
- case 2:
+ case 2: /* Form error */
hpm_can->can_dev.status.formaterrcnt++;
break;
- case 1:
+ case 1: /* Bit padding error */
hpm_can->can_dev.status.bitpaderrcnt++;
break;
}
+ /* Update error status information */
hpm_can->can_dev.status.rcverrcnt = err_cnt.receive_error_count;
hpm_can->can_dev.status.snderrcnt = err_cnt.transmit_error_count;
hpm_can->can_dev.status.lasterrtype = mcan_get_last_error_code(hpm_can->can_base);
hpm_can->can_dev.status.errcode = 0;
- if ((error_flags & MCAN_INT_WARNING_STATUS) != 0U)
- {
+
+ /* Set error state flags */
+ if ((error_flags & MCAN_INT_WARNING_STATUS) != 0U) {
hpm_can->can_dev.status.errcode |= ERRWARNING;
}
- if ((error_flags & MCAN_INT_ERROR_PASSIVE) != 0U)
- {
+ if ((error_flags & MCAN_INT_ERROR_PASSIVE) != 0U) {
hpm_can->can_dev.status.errcode |= ERRPASSIVE;
}
- if (mcan_is_in_busoff_state(hpm_can->can_base))
- {
+ if (mcan_is_in_busoff_state(hpm_can->can_base)) {
hpm_can->can_dev.status.errcode |= BUSOFF;
}
}
+ /* Clear all processed interrupt flags */
mcan_clear_interrupt_flags(hpm_can->can_base, flags);
}
+/* ============================================================================
+ * Configuration Functions
+ * ============================================================================ */
+
+/**
+ * @brief Configure MCAN controller
+ *
+ * Initializes the MCAN hardware with the specified configuration including
+ * baud rate, mode, timing parameters, and message filters. This function
+ * is called during device initialization and when configuration changes
+ * are requested.
+ *
+ * @param[in,out] can Pointer to RT-Thread CAN device structure
+ * @param[in] cfg Pointer to CAN configuration structure
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static rt_err_t hpm_mcan_configure(struct rt_can_device *can, struct can_configure *cfg)
{
RT_ASSERT(can);
RT_ASSERT(cfg);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
+ hpm_can_t *drv_can = (hpm_can_t *)can->parent.user_data;
RT_ASSERT(drv_can);
#ifdef RT_CAN_USING_CANFD
+ /* Configure CAN-FD settings if supported */
drv_can->can_config.enable_canfd = (cfg->enable_canfd != 0) ? true : false;
- if (cfg->use_bit_timing != 0U)
- {
+ /* Keep the existing MCAN config, only rebuild the RAM layout for current frame format. */
+ mcan_get_default_ram_config(drv_can->can_base,
+ &drv_can->can_config.ram_config,
+ drv_can->can_config.enable_canfd);
+
+ /* Configure bit timing parameters if custom timing is used */
+ if (cfg->use_bit_timing != 0U) {
drv_can->can_config.use_lowlevel_timing_setting = true;
+
+ /* Configure classic CAN timing parameters */
drv_can->can_config.can_timing.prescaler = cfg->can_timing.prescaler;
drv_can->can_config.can_timing.num_seg1 = cfg->can_timing.num_seg1;
drv_can->can_config.can_timing.num_seg2 = cfg->can_timing.num_seg2;
drv_can->can_config.can_timing.num_sjw = cfg->can_timing.num_sjw;
+ /* Configure CAN-FD timing parameters */
drv_can->can_config.canfd_timing.prescaler = cfg->canfd_timing.prescaler;
drv_can->can_config.canfd_timing.num_seg1 = cfg->canfd_timing.num_seg1;
drv_can->can_config.canfd_timing.num_seg2 = cfg->canfd_timing.num_seg2;
drv_can->can_config.canfd_timing.num_sjw = cfg->canfd_timing.num_sjw;
- }
- else
+ } else
#endif
{
+ /* Use automatic baud rate calculation */
drv_can->can_config.use_lowlevel_timing_setting = false;
drv_can->can_config.baudrate = cfg->baud_rate;
#ifdef RT_CAN_USING_CANFD
@@ -501,9 +632,8 @@ static rt_err_t hpm_mcan_configure(struct rt_can_device *can, struct can_configu
#endif
}
-
- switch (cfg->mode)
- {
+ /* Configure CAN operation mode */
+ switch (cfg->mode) {
case RT_CAN_MODE_NORMAL:
drv_can->can_config.mode = mcan_mode_normal;
break;
@@ -518,31 +648,46 @@ static rt_err_t hpm_mcan_configure(struct rt_can_device *can, struct can_configu
break;
}
+ /* Initialize CAN pins and clock */
init_can_pins(drv_can->can_base);
clock_add_to_group(drv_can->clk_name, BOARD_RUNNING_CORE & 0x1);
uint32_t can_clk = clock_get_frequency(drv_can->clk_name);
- drv_can->can_config.all_filters_config.std_id_filter_list.filter_elem_list = &drv_can->std_can_filters[0];
- drv_can->can_config.all_filters_config.std_id_filter_list.mcan_filter_elem_count = drv_can->std_filter_num;
- drv_can->can_config.all_filters_config.ext_id_filter_list.filter_elem_list = &drv_can->ext_can_filters[0];
- drv_can->can_config.all_filters_config.ext_id_filter_list.mcan_filter_elem_count = drv_can->ext_filter_num;
- drv_can->can_config.all_filters_config.ext_id_mask = (1UL << 30) - 1UL;
- drv_can->can_config.txbuf_trans_interrupt_mask = ~0UL;
+ /* Configure message filters */
+ drv_can->can_config.all_filters_config.std_id_filter_list.filter_elem_list = &drv_can->std_can_filters[0];
+ drv_can->can_config.all_filters_config.std_id_filter_list.mcan_filter_elem_count = drv_can->std_filter_num;
+ drv_can->can_config.all_filters_config.ext_id_filter_list.filter_elem_list = &drv_can->ext_can_filters[0];
+ drv_can->can_config.all_filters_config.ext_id_filter_list.mcan_filter_elem_count = drv_can->ext_filter_num;
+ drv_can->can_config.all_filters_config.ext_id_mask = (1UL << 29) - 1UL;
+ drv_can->can_config.txbuf_trans_interrupt_mask = ~0UL;
+ /* Initialize MCAN hardware with configuration */
hpm_stat_t status = mcan_init(drv_can->can_base, &drv_can->can_config, can_clk);
- if (status != status_success)
- {
+ if (status != status_success) {
return -RT_ERROR;
}
+ drv_can->can_stat = CAN_INITED;
return RT_EOK;
}
+/**
+ * @brief Control MCAN device operations
+ *
+ * Handles various control commands including interrupt management, mode changes,
+ * baud rate configuration, filter setup, and status retrieval. This function
+ * implements the RT-Thread device control interface for CAN devices.
+ *
+ * @param[in,out] can Pointer to RT-Thread CAN device structure
+ * @param[in] cmd Control command (RT_DEVICE_CTRL_*, RT_CAN_CMD_*)
+ * @param[in,out] arg Command-specific argument pointer
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static rt_err_t hpm_mcan_control(struct rt_can_device *can, int cmd, void *arg)
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
+ hpm_can_t *drv_can = (hpm_can_t *)can->parent.user_data;
RT_ASSERT(drv_can);
uint32_t arg_val;
@@ -551,46 +696,48 @@ static rt_err_t hpm_mcan_control(struct rt_can_device *can, int cmd, void *arg)
uint32_t temp;
uint32_t irq_txrx_mask;
- switch (cmd)
- {
+ switch (cmd) {
case RT_DEVICE_CTRL_CLR_INT:
- arg_val = (uint32_t) arg;
+ /* Disable specific interrupt types */
+ arg_val = (uint32_t)arg;
intc_m_disable_irq(drv_can->irq_num);
- if (arg_val == RT_DEVICE_FLAG_INT_RX)
- {
+ if (arg_val & RT_DEVICE_FLAG_INT_RX) {
+ /* Disable receive interrupt */
irq_txrx_mask = MCAN_EVENT_RECEIVE;
drv_can->irq_txrx_err_enable_mask &= ~irq_txrx_mask;
drv_can->can_config.interrupt_mask &= ~irq_txrx_mask;
mcan_disable_interrupts(drv_can->can_base, drv_can->irq_txrx_err_enable_mask);
}
- else if (arg_val == RT_DEVICE_FLAG_INT_TX)
- {
+ if (arg_val & RT_DEVICE_FLAG_INT_TX) {
+ /* Disable transmit interrupt */
irq_txrx_mask = MCAN_EVENT_TRANSMIT;
drv_can->irq_txrx_err_enable_mask &= ~irq_txrx_mask;
drv_can->can_config.interrupt_mask &= ~irq_txrx_mask;
mcan_disable_interrupts(drv_can->can_base, drv_can->irq_txrx_err_enable_mask);
mcan_disable_txbuf_interrupt(drv_can->can_base, ~0UL);
- } else if (arg_val == RT_DEVICE_CAN_INT_ERR) {
+ }
+ if (arg_val & RT_DEVICE_CAN_INT_ERR) {
+ /* Disable error interrupt */
irq_txrx_mask = MCAN_EVENT_ERROR;
drv_can->irq_txrx_err_enable_mask &= ~irq_txrx_mask;
drv_can->can_config.interrupt_mask &= ~irq_txrx_mask;
mcan_disable_interrupts(drv_can->can_base, drv_can->irq_txrx_err_enable_mask);
- } else {
- err = -RT_ERROR;
}
break;
+
case RT_DEVICE_CTRL_SET_INT:
- arg_val = (uint32_t) arg;
- if (arg_val == RT_DEVICE_FLAG_INT_RX)
- {
+ /* Enable specific interrupt types */
+ arg_val = (uint32_t)arg;
+ if (arg_val & RT_DEVICE_FLAG_INT_RX) {
+ /* Enable receive interrupt */
irq_txrx_mask = MCAN_EVENT_RECEIVE;
drv_can->irq_txrx_err_enable_mask |= irq_txrx_mask;
drv_can->can_config.interrupt_mask |= irq_txrx_mask;
mcan_enable_interrupts(drv_can->can_base, drv_can->irq_txrx_err_enable_mask);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
}
- else if (arg_val == RT_DEVICE_FLAG_INT_TX)
- {
+ if (arg_val & RT_DEVICE_FLAG_INT_TX) {
+ /* Enable transmit interrupt */
irq_txrx_mask = MCAN_EVENT_TRANSMIT;
drv_can->irq_txrx_err_enable_mask |= irq_txrx_mask;
drv_can->can_config.interrupt_mask |= irq_txrx_mask;
@@ -598,175 +745,176 @@ static rt_err_t hpm_mcan_control(struct rt_can_device *can, int cmd, void *arg)
mcan_enable_txbuf_interrupt(drv_can->can_base, ~0UL);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
}
- else if (arg_val == RT_DEVICE_CAN_INT_ERR)
- {
+ if (arg_val & RT_DEVICE_CAN_INT_ERR) {
+ /* Enable error interrupt */
irq_txrx_mask = MCAN_EVENT_ERROR;
drv_can->irq_txrx_err_enable_mask |= irq_txrx_mask;
drv_can->can_config.interrupt_mask |= irq_txrx_mask;
mcan_enable_interrupts(drv_can->can_base, drv_can->irq_txrx_err_enable_mask);
intc_m_enable_irq_with_priority(drv_can->irq_num, drv_can->irq_priority);
}
- else
- {
- err = -RT_ERROR;
- }
break;
- case RT_CAN_CMD_SET_FILTER:
- {
- /* Convert the RT-Thread Filter format to the filter format supported by HPM CAN */
- struct rt_can_filter_config *filter = (struct rt_can_filter_config*)arg;
- drv_can->std_filter_num = 0;
- drv_can->ext_filter_num = 0;
- if (filter != NULL)
- {
- for (uint32_t i = 0; i < filter->count; i++)
- {
- if (filter->items[i].ide != 0)
- {
- drv_can->ext_can_filters[drv_can->ext_filter_num].filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER;
- drv_can->ext_can_filters[drv_can->ext_filter_num].filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH;
- drv_can->ext_can_filters[drv_can->ext_filter_num].can_id_type = MCAN_CAN_ID_TYPE_EXTENDED;
- drv_can->ext_can_filters[drv_can->ext_filter_num].filter_id = filter->items[i].id;
- drv_can->ext_can_filters[drv_can->ext_filter_num].filter_mask = filter->items[i].mask;
- drv_can->ext_filter_num++;
- RT_ASSERT(drv_can->ext_filter_num <= CAN_EXT_FILTER_NUM_MAX);
- }
- else
- {
- drv_can->std_can_filters[drv_can->std_filter_num].filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER;
- drv_can->std_can_filters[drv_can->std_filter_num].filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH;
- drv_can->std_can_filters[drv_can->std_filter_num].can_id_type = MCAN_CAN_ID_TYPE_STANDARD;
- drv_can->std_can_filters[drv_can->std_filter_num].filter_id = filter->items[i].id;
- drv_can->std_can_filters[drv_can->std_filter_num].filter_mask = filter->items[i].mask;
- drv_can->std_filter_num++;
- RT_ASSERT(drv_can->std_filter_num <= CAN_STD_FILTER_NUM_MAX);
+ case RT_CAN_CMD_SET_FILTER: {
+ /* Configure message filters for CAN reception */
+ struct rt_can_filter_config *filter = (struct rt_can_filter_config *)arg;
+ drv_can->std_filter_num = 0;
+ drv_can->ext_filter_num = 0;
+
+ if (filter != NULL) {
+ /* Process each filter item in the configuration */
+ for (uint32_t i = 0; i < filter->count; i++) {
+ if (filter->items[i].ide != 0) {
+ /* Configure extended ID filter */
+ if (drv_can->ext_filter_num >= CAN_EXT_FILTER_NUM_MAX) {
+ return -RT_EFULL;
}
- if (filter->items[i].rtr != 0)
- {
- if (drv_can->ext_filter_num)
- {
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = false;
- }
- else
- {
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = true;
- }
- if (drv_can->std_filter_num)
- {
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = false;
- }
- else
- {
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = true;
- }
+ filter->items[i].mask &= CAN_EXT_ID_MASK; /* Ensure mask is within valid range */
+ drv_can->ext_can_filters[drv_can->ext_filter_num].filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER;
+ drv_can->ext_can_filters[drv_can->ext_filter_num].filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH;
+ drv_can->ext_can_filters[drv_can->ext_filter_num].can_id_type = MCAN_CAN_ID_TYPE_EXTENDED;
+ drv_can->ext_can_filters[drv_can->ext_filter_num].filter_id = filter->items[i].id;
+ drv_can->ext_can_filters[drv_can->ext_filter_num].filter_mask = filter->items[i].mask;
+ drv_can->ext_filter_num++;
+ } else {
+ /* Configure standard ID filter */
+ if (drv_can->std_filter_num >= CAN_STD_FILTER_NUM_MAX) {
+ return -RT_EFULL;
}
+ filter->items[i].mask &= CAN_STD_ID_MASK; /* Ensure mask is within valid range */
+ drv_can->std_can_filters[drv_can->std_filter_num].filter_type = MCAN_FILTER_TYPE_CLASSIC_FILTER;
+ drv_can->std_can_filters[drv_can->std_filter_num].filter_config = MCAN_FILTER_ELEM_CFG_STORE_IN_RX_FIFO0_IF_MATCH;
+ drv_can->std_can_filters[drv_can->std_filter_num].can_id_type = MCAN_CAN_ID_TYPE_STANDARD;
+ drv_can->std_can_filters[drv_can->std_filter_num].filter_id = filter->items[i].id;
+ drv_can->std_can_filters[drv_can->std_filter_num].filter_mask = filter->items[i].mask;
+ drv_can->std_filter_num++;
}
-
- if (filter->actived != 0U)
- {
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_REJECT;
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_REJECT;
- }
- else
- {
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
+ /* Handle RTR (Remote Transmission Request) frame filtering */
+ if (filter->items[i].rtr != 0) {
+ if (drv_can->ext_filter_num) {
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = false;
+ } else {
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = true;
+ }
+ if (drv_can->std_filter_num) {
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = false;
+ } else {
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = true;
+ }
}
}
- else
- {
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = false;
- drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = false;
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
- drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
- drv_can->can_config.all_filters_config.ext_id_mask = 0x1FFFFFFFUL;
- drv_can->can_config.all_filters_config.std_id_filter_list.filter_elem_list = &k_default_std_id_filter;
- drv_can->can_config.all_filters_config.std_id_filter_list.mcan_filter_elem_count = 1;
- drv_can->can_config.all_filters_config.ext_id_filter_list.filter_elem_list = &k_default_ext_id_filter;
- drv_can->can_config.all_filters_config.ext_id_filter_list.mcan_filter_elem_count = 1;
+
+ /* Configure filter activation behavior */
+ if (filter->actived != 0U) {
+ /* Reject non-matching frames when filters are active */
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_REJECT;
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_REJECT;
+ } else {
+ /* Accept all frames when filters are not active */
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option =
+ MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option =
+ MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
}
- err = hpm_mcan_configure(can, &drv_can->can_dev.config);
+ } else {
+ /* Use default filters when no filter configuration provided */
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_ext_frame = false;
+ drv_can->can_config.all_filters_config.global_filter_config.reject_remote_std_frame = false;
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_std_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
+ drv_can->can_config.all_filters_config.global_filter_config.accept_non_matching_ext_frame_option = MCAN_ACCEPT_NON_MATCHING_FRAME_OPTION_IN_RXFIFO0;
+ drv_can->can_config.all_filters_config.ext_id_mask = 0x1FFFFFFFUL;
+ drv_can->can_config.all_filters_config.std_id_filter_list.filter_elem_list = &k_default_std_id_filter;
+ drv_can->can_config.all_filters_config.std_id_filter_list.mcan_filter_elem_count = 1;
+ drv_can->can_config.all_filters_config.ext_id_filter_list.filter_elem_list = &k_default_ext_id_filter;
+ drv_can->can_config.all_filters_config.ext_id_filter_list.mcan_filter_elem_count = 1;
+ }
+ /* Apply filter configuration to hardware */
+ err = hpm_mcan_configure(can, &drv_can->can_dev.config);
#ifdef RT_CAN_USING_HDR
- if (filter == RT_NULL) {
- /*if use RT_CAN_USING_HDR, but if want to receive everything without filtering, use default filter, need to return NO-RT-OK status*/
- err = -RT_ETRAP;
- }
-#endif
+ if (filter == RT_NULL) {
+ /* Special case for HDR: return error when using default filters */
+ err = -RT_ETRAP;
}
- break;
+#endif
+ } break;
+
case RT_CAN_CMD_SET_MODE:
- arg_val = (uint32_t) arg;
- if ((arg_val != RT_CAN_MODE_NORMAL) && (arg_val != RT_CAN_MODE_LISTEN) && (arg_val != RT_CAN_MODE_LOOPBACK))
- {
+ /* Set CAN operation mode */
+ arg_val = (uint32_t)arg;
+ if ((arg_val != RT_CAN_MODE_NORMAL) && (arg_val != RT_CAN_MODE_LISTEN) && (arg_val != RT_CAN_MODE_LOOPBACK)) {
err = -RT_ERROR;
break;
}
- if (arg_val != drv_can->can_dev.config.mode)
- {
+ if (arg_val != drv_can->can_dev.config.mode) {
drv_can->can_dev.config.mode = arg_val;
err = hpm_mcan_configure(can, &drv_can->can_dev.config);
}
-
break;
+
case RT_CAN_CMD_SET_BAUD:
- arg_val = (uint32_t) arg;
- if (arg_val != drv_can->can_dev.config.baud_rate)
- {
+ /* Set CAN baud rate */
+ arg_val = (uint32_t)arg;
+#ifdef RT_CAN_USING_CANFD
+ drv_can->can_dev.config.use_bit_timing = 0U;
+#endif
+ if (arg_val != drv_can->can_dev.config.baud_rate) {
drv_can->can_dev.config.baud_rate = arg_val;
}
err = hpm_mcan_configure(can, &drv_can->can_dev.config);
break;
#ifdef RT_CAN_USING_CANFD
case RT_CAN_CMD_SET_CANFD:
- arg_val = (uint32_t) arg;
- if (arg_val != drv_can->can_dev.config.enable_canfd)
- {
+ /* Enable/disable CAN-FD mode */
+ arg_val = (uint32_t)arg;
+ if (arg_val != drv_can->can_dev.config.enable_canfd) {
drv_can->can_dev.config.enable_canfd = arg_val;
err = hpm_mcan_configure(can, &drv_can->can_dev.config);
}
break;
+
case RT_CAN_CMD_SET_BAUD_FD:
- arg_val = (uint32_t) arg;
- if (arg_val != drv_can->can_dev.config.baud_rate_fd)
- {
+ /* Set CAN-FD data phase baud rate */
+ arg_val = (uint32_t)arg;
+ drv_can->can_dev.config.use_bit_timing = 0U;
+ if (arg_val != drv_can->can_dev.config.baud_rate_fd) {
drv_can->can_dev.config.baud_rate_fd = arg_val;
err = hpm_mcan_configure(can, &drv_can->can_dev.config);
}
break;
- case RT_CAN_CMD_SET_BITTIMING:
- {
- struct rt_can_bit_timing_config *timing_configs = (struct rt_can_bit_timing_config*)arg;
- if ((timing_configs == RT_NULL) || (timing_configs->count < 1) || (timing_configs->count > 2))
- {
- return -RT_ERROR;
- }
- if (timing_configs->count != 0U)
- {
- drv_can->can_dev.config.can_timing = timing_configs->items[0];
- }
- if (timing_configs->count == 2)
- {
- drv_can->can_dev.config.canfd_timing = timing_configs->items[1];
- }
- err = hpm_mcan_configure(can, &drv_can->can_dev.config);
+ case RT_CAN_CMD_SET_BITTIMING: {
+ /* Set custom bit timing parameters */
+ struct rt_can_bit_timing_config *timing_configs = (struct rt_can_bit_timing_config *)arg;
+ if ((timing_configs == RT_NULL) || (timing_configs->count < 1) || (timing_configs->count > 2)) {
+ return -RT_ERROR;
}
- break;
+
+ drv_can->can_dev.config.use_bit_timing = 1U;
+ /* Configure classic CAN timing (first item) */
+ if (timing_configs->count != 0U) {
+ drv_can->can_dev.config.can_timing = timing_configs->items[0];
+ }
+ /* Configure CAN-FD timing (second item) */
+ if (timing_configs->count == 2) {
+ drv_can->can_dev.config.canfd_timing = timing_configs->items[1];
+ }
+ err = hpm_mcan_configure(can, &drv_can->can_dev.config);
+ } break;
#endif
case RT_CAN_CMD_SET_PRIV:
+ /* Set privacy mode (privileged/non-privileged) */
arg_val = (uint32_t)arg;
- if ((arg_val != RT_CAN_MODE_PRIV) && (arg_val != RT_CAN_MODE_NOPRIV))
- {
+ if ((arg_val != RT_CAN_MODE_PRIV) && (arg_val != RT_CAN_MODE_NOPRIV)) {
return -RT_ERROR;
}
- if (arg_val != drv_can->can_dev.config.privmode)
- {
+ if (arg_val != drv_can->can_dev.config.privmode) {
drv_can->can_dev.config.privmode = arg_val;
err = hpm_mcan_configure(can, &drv_can->can_dev.config);
}
break;
+
case RT_CAN_CMD_GET_STATUS:
+ /* Get CAN controller status and error information */
mcan_error_count_t err_cnt;
mcan_get_error_counter(drv_can->can_base, &err_cnt);
drv_can->can_dev.status.rcverrcnt = err_cnt.receive_error_count;
@@ -774,148 +922,215 @@ static rt_err_t hpm_mcan_control(struct rt_can_device *can, int cmd, void *arg)
drv_can->can_dev.status.lasterrtype = mcan_get_last_error_code(drv_can->can_base);
temp = mcan_get_interrupt_flags(drv_can->can_base);
drv_can->can_dev.status.errcode = 0;
- if ((temp & MCAN_INT_WARNING_STATUS) != 0U)
- {
+
+ /* Set error state flags */
+ if ((temp & MCAN_INT_WARNING_STATUS) != 0U) {
drv_can->can_dev.status.errcode |= ERRWARNING;
}
- if ((temp & MCAN_INT_ERROR_PASSIVE) != 0U)
- {
+ if ((temp & MCAN_INT_ERROR_PASSIVE) != 0U) {
drv_can->can_dev.status.errcode |= ERRPASSIVE;
}
- if (mcan_is_in_busoff_state(drv_can->can_base))
- {
+ if (mcan_is_in_busoff_state(drv_can->can_base)) {
drv_can->can_dev.status.errcode |= BUSOFF;
}
rt_memcpy(arg, &drv_can->can_dev.status, sizeof(drv_can->can_dev.status));
break;
+
+ case RT_CAN_CMD_START:
+ arg_val = (rt_uint32_t)arg;
+ if (arg_val == 0) {
+ /* Stop CAN (enter Init Mode) */
+ mcan_enter_init_mode(drv_can->can_base);
+ drv_can->can_stat = CAN_STOPPED;
+ } else {
+ /* 1. Clear all TX buffers */
+ for (uint32_t i = 0; i < MCAN_TXBUF_SIZE_CAN_DEFAULT; i++) {
+ if (mcan_is_transmit_request_pending(drv_can->can_base, i)) {
+ mcan_cancel_tx_buf_send_request(drv_can->can_base, i);
+ }
+ }
+ rt_thread_mdelay(5);
+ /* 2. Clear all interrupt flags */
+ mcan_clear_interrupt_flags(drv_can->can_base, 0xFFFFFFFF);
+ /* 3. Enter Normal Mode */
+ mcan_enter_normal_mode(drv_can->can_base);
+ rt_thread_mdelay(5);
+ drv_can->can_stat = CAN_RUNNING;
+ }
+ break;
}
return err;
}
-static int hpm_mcan_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
+/* ============================================================================
+ * Message Transmission and Reception Functions
+ * ============================================================================ */
+
+/**
+ * @brief Send CAN message
+ *
+ * Transmits a CAN message through the specified MCAN instance.
+ * Supports both classic CAN and CAN-FD frames with proper frame formatting
+ * and transmission buffer management.
+ *
+ * @param[in] can Pointer to RT-Thread CAN device structure
+ * @param[in] buf Pointer to CAN message buffer
+ * @param[in] boxno Mailbox number (not used in this implementation)
+ * @return RT_EOK on success, -RT_ETIMEOUT on timeout, -RT_EFULL if buffer full
+ */
+static rt_ssize_t hpm_mcan_sendmsg(struct rt_can_device *can, const void *buf, rt_uint32_t boxno)
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
+ hpm_can_t *drv_can = (hpm_can_t *)can->parent.user_data;
RT_ASSERT(drv_can);
- struct rt_can_msg *can_msg = (struct rt_can_msg *) buf;
+ struct rt_can_msg *can_msg = (struct rt_can_msg *)buf;
+ if ((drv_can->can_stat == CAN_UNITED) || (drv_can->can_stat == CAN_STOPPED)) {
+ return -RT_ERROR;
+ }
- mcan_tx_frame_t tx_frame = {0};
+ /* Initialize transmission frame structure */
+ mcan_tx_frame_t tx_frame = { 0 };
memset(&tx_frame, 0, sizeof(tx_frame));
- if (can_msg->ide == RT_CAN_STDID)
- {
+
+ /* Configure CAN ID (standard or extended) */
+ if (can_msg->ide == RT_CAN_STDID) {
tx_frame.use_ext_id = 0;
tx_frame.std_id = can_msg->id;
- }
- else
- {
+ } else {
tx_frame.use_ext_id = 1;
tx_frame.ext_id = can_msg->id;
}
- if (can_msg->rtr == RT_CAN_DTR)
- {
+
+ /* Configure RTR (Remote Transmission Request) flag */
+ if (can_msg->rtr == RT_CAN_DTR) {
tx_frame.rtr = false;
- }
- else
- {
+ } else {
tx_frame.rtr = true;
}
- #ifdef RT_CAN_USING_CANFD
+#ifdef RT_CAN_USING_CANFD
+ /* Configure CAN-FD specific parameters */
tx_frame.bitrate_switch = can_msg->brs;
- if (can_msg->fd_frame != 0)
- {
- tx_frame.canfd_frame = 1;
- RT_ASSERT(can_msg->len <= 15);
- }
- else
- #endif
+ if (can_msg->fd_frame != 0) {
+ tx_frame.canfd_frame = 1;
+ RT_ASSERT(can_msg->len <= 15); /* CAN-FD supports up to 64 bytes (DLC 15) */
+ } else
+#endif
{
- RT_ASSERT(can_msg->len <= 8);
+ RT_ASSERT(can_msg->len <= 8); /* Classic CAN supports up to 8 bytes */
}
+ /* Copy message data to transmission frame */
uint32_t msg_len = mcan_get_message_size_from_dlc(can_msg->len);
- for (uint32_t i = 0; i < msg_len; i++)
- {
+ for (uint32_t i = 0; i < msg_len; i++) {
tx_frame.data_8[i] = can_msg->data[i];
}
tx_frame.dlc = can_msg->len;
+ /* Wait for transmission buffer to become available */
uint32_t delay_cnt = 0;
- while (mcan_is_txfifo_full(drv_can->can_base))
- {
+ while (mcan_is_txfifo_full(drv_can->can_base)) {
rt_thread_mdelay(1);
delay_cnt++;
- if (delay_cnt >= CAN_SEND_WAIT_MS_MAX)
- {
+ if (delay_cnt >= CAN_SEND_WAIT_MS_MAX) {
return -RT_ETIMEOUT;
}
}
- hpm_stat_t status = mcan_transmit_via_txbuf_nonblocking(drv_can->can_base, 0, &tx_frame);
- if (status != status_success)
- {
+
+ /* Transmit through TX FIFO to avoid overwriting a still-pending dedicated buffer. */
+ hpm_stat_t status = mcan_transmit_via_txfifo_nonblocking(drv_can->can_base, &tx_frame, &drv_can->can_tx_fifo_index);
+ if (status != status_success) {
return -RT_EFULL;
}
return RT_EOK;
}
-static int hpm_mcan_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
+/**
+ * @brief Receive CAN message
+ *
+ * Receives a CAN message from the MCAN RX FIFO.
+ * Supports both classic CAN and CAN-FD frames with proper frame parsing
+ * and data extraction.
+ *
+ * @param[in] can Pointer to RT-Thread CAN device structure
+ * @param[out] buf Pointer to receive buffer for CAN message
+ * @param[in] boxno Mailbox number (not used in this implementation)
+ * @return RT_EOK on success, -RT_ERROR on error, -RT_EMPTY if no data
+ */
+static rt_ssize_t hpm_mcan_recvmsg(struct rt_can_device *can, void *buf, rt_uint32_t boxno)
{
RT_ASSERT(can);
- hpm_can_t *drv_can = (hpm_can_t*) can->parent.user_data;
+ hpm_can_t *drv_can = (hpm_can_t *)can->parent.user_data;
RT_ASSERT(drv_can);
rt_can_msg_t can_msg = (rt_can_msg_t)buf;
- mcan_rx_message_t rx_buf;
+ mcan_rx_message_t rx_buf = { 0 };
+
+ /* Read message from RX FIFO */
hpm_stat_t status = mcan_read_rxfifo(drv_can->can_base, 0, &rx_buf);
- if (status == status_success)
- {
- if (rx_buf.use_ext_id)
- {
+ if (status == status_success) {
+ /* Extract CAN ID information */
+ if (rx_buf.use_ext_id) {
can_msg->ide = RT_CAN_EXTID;
can_msg->id = rx_buf.ext_id;
- }
- else
- {
+ } else {
can_msg->ide = RT_CAN_STDID;
can_msg->id = rx_buf.std_id;
}
-
+ /* Extract RTR flag */
if (rx_buf.rtr != 0) {
can_msg->rtr = RT_CAN_RTR;
- }
- else {
+ } else {
can_msg->rtr = RT_CAN_DTR;
}
+
#ifdef RT_CAN_USING_CANFD
+ /* Extract CAN-FD specific information */
can_msg->fd_frame = rx_buf.canfd_frame;
can_msg->brs = rx_buf.bitrate_switch;
#endif
+
+ /* Extract message length and data */
can_msg->len = rx_buf.dlc;
uint32_t msg_len = mcan_get_message_size_from_dlc(can_msg->len);
- for(uint32_t i = 0; i < msg_len; i++) {
+ memset(can_msg->data, 0, sizeof(can_msg->data));
+ for (uint32_t i = 0; i < msg_len; i++) {
can_msg->data[i] = rx_buf.data_8[i];
}
+
#ifdef RT_CAN_USING_HDR
- /* Hardware filter messages are valid */
+ /* Update hardware filter status for HDR support */
can_msg->hdr_index = boxno;
can->hdr[can_msg->hdr_index].connected = 1;
#endif
- }
- else
- {
+ } else {
return -RT_EEMPTY;
}
return RT_EOK;
}
+/* ============================================================================
+ * Initialization Function
+ * ============================================================================ */
+
+/**
+ * @brief Initialize MCAN hardware and register devices with RT-Thread
+ *
+ * This function initializes all enabled MCAN instances, configures their
+ * default settings, and registers them with the RT-Thread device framework.
+ * It is called during system startup through the INIT_BOARD_EXPORT macro.
+ *
+ * @return RT_EOK on success
+ */
int rt_hw_mcan_init(void)
{
+ /* Initialize default CAN configuration */
struct can_configure config = CANDEFAULTCONFIG;
config.privmode = RT_CAN_MODE_NOPRIV;
config.sndboxnumber = CAN_SENDBOX_NUM;
@@ -923,22 +1138,35 @@ int rt_hw_mcan_init(void)
#ifdef RT_CAN_USING_HDR
config.maxhdr = 32;
#endif
- for (uint32_t i = 0; i < ARRAY_SIZE(hpm_cans); i++)
- {
+
+ /* Initialize each enabled MCAN instance */
+ for (uint32_t i = 0; i < ARRAY_SIZE(hpm_cans); i++) {
+ /* Set default configuration */
hpm_cans[i]->can_dev.config = config;
hpm_cans[i]->ext_filter_num = 0;
hpm_cans[i]->std_filter_num = 0;
+ hpm_cans[i]->can_stat = CAN_UNITED;
+
#if defined(MCAN_SOC_MSG_BUF_IN_AHB_RAM) && (MCAN_SOC_MSG_BUF_IN_AHB_RAM == 1)
+ /* Configure message buffer attributes for AHB RAM */
mcan_msg_buf_attr_t attr = { hpm_cans[i]->ram_base, hpm_cans[i]->ram_size };
hpm_stat_t status = mcan_set_msg_buf_attr(hpm_cans[i]->can_base, &attr);
#endif
+
+ /* Get default MCAN configuration from hardware */
mcan_get_default_config(hpm_cans[i]->can_base, &hpm_cans[i]->can_config);
+
+ /* Register device with RT-Thread */
rt_hw_can_register(&hpm_cans[i]->can_dev, hpm_cans[i]->name, &hpm_can_ops, hpm_cans[i]);
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register MCAN device to irq table */
+ rt_hw_interrupt_install(hpm_cans[i]->irq_num, (rt_isr_handler_t)hpm_mcan_isr, hpm_cans[i], hpm_cans[i]->name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return RT_EOK;
}
+/* Register initialization function to be called during board startup */
INIT_BOARD_EXPORT(rt_hw_mcan_init);
-#endif
-
+#endif /* RT_USING_CAN */
diff --git a/bsp/hpmicro/libraries/drivers/drv_pdm.c b/bsp/hpmicro/libraries/drivers/drv_pdm.c
index 8fa3d20a131f..b1d0f7a97c91 100644
--- a/bsp/hpmicro/libraries/drivers/drv_pdm.c
+++ b/bsp/hpmicro/libraries/drivers/drv_pdm.c
@@ -121,7 +121,15 @@ static rt_err_t hpm_pdm_set_channels(uint32_t channel)
bool is_enabled = i2s_is_enabled(PDM_I2S);
if (is_enabled) {
- dma_abort_channel(dma_resource.base, dma_resource.channel);
+ dma_mgr_abort_chn_transfer(&dma_resource);
+ pdm_stop(HPM_PDM);
+ pdm_software_reset(HPM_PDM);
+ i2s_disable(PDM_I2S);
+ i2s_disable_rx_dma_request(PDM_I2S);
+ if (status_success != i2s_reset_rx(PDM_I2S)) {
+ LOG_E("pdm_i2s reset rx failed\n");
+ return -RT_ERROR;
+ }
}
if (status_success != i2s_config_rx(PDM_I2S, mclk_hz, &transfer))
{
@@ -130,7 +138,10 @@ static rt_err_t hpm_pdm_set_channels(uint32_t channel)
}
if (is_enabled)
{
- i2s_enable(PDM_I2S);
+ hpm_pdm_dma_transmit();
+ pdm_start(HPM_PDM);
+ i2s_enable_rx_dma_request(PDM_I2S);
+ i2s_start(PDM_I2S);
}
return RT_EOK;
@@ -161,6 +172,7 @@ static rt_err_t hpm_pdm_configure(struct rt_audio_device* audio, struct rt_audio
result = -RT_ERROR;
break;
}
+ break;
}
default:
@@ -184,7 +196,10 @@ static rt_err_t hpm_pdm_init(struct rt_audio_device* audio)
i2s_get_default_config(PDM_I2S, &i2s_config);
i2s_enable_rx_dma_request(PDM_I2S);
- i2s_init(PDM_I2S, &i2s_config);
+ if (status_success != i2s_init(PDM_I2S, &i2s_config)) {
+ LOG_E("pdm_i2s init failed\n");
+ return -RT_ERROR;
+ }
i2s_get_default_transfer_config_for_pdm(&transfer);
transfer.data_line = PDM_I2S_DATA_LINE;
@@ -232,11 +247,14 @@ static rt_err_t hpm_pdm_start(struct rt_audio_device* audio, int stream)
return -RT_ERROR;
}
- i2s_reset_rx(PDM_I2S);
+ if (status_success != i2s_reset_rx(PDM_I2S)) {
+ LOG_E("pdm_i2s reset rx failed\n");
+ return -RT_ERROR;
+ }
+ i2s_enable_rx_line(PDM_I2S, PDM_I2S_DATA_LINE);
if (RT_EOK != hpm_pdm_dma_transmit()) {
return -RT_ERROR;
}
-
pdm_start(HPM_PDM);
i2s_enable_rx_dma_request(PDM_I2S);
i2s_start(PDM_I2S);
@@ -253,14 +271,14 @@ static rt_err_t hpm_pdm_stop(struct rt_audio_device* audio, int stream)
pdm_stop(HPM_PDM);
i2s_stop(PDM_I2S);
- dma_abort_channel(dma_resource.base, dma_resource.channel);
+ dma_mgr_abort_chn_transfer(&dma_resource);
dma_mgr_release_resource(&dma_resource);
}
return RT_EOK;
}
-static rt_err_t hpm_pdm_dma_transmit()
+static rt_err_t hpm_pdm_dma_transmit(void)
{
dma_channel_config_t ch_config = {0};
dma_default_channel_config(dma_resource.base, &ch_config);
@@ -273,6 +291,7 @@ static rt_err_t hpm_pdm_dma_transmit()
ch_config.size_in_byte = PDM_FIFO_SIZE;
ch_config.src_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
ch_config.src_burst_size = DMA_NUM_TRANSFER_PER_BURST_1T;
+ ch_config.interrupt_mask = DMA_INTERRUPT_MASK_ABORT;
if (status_success != dma_setup_channel(dma_resource.base, dma_resource.channel, &ch_config, true)) {
LOG_E("dma setup channel failed\n");
diff --git a/bsp/hpmicro/libraries/drivers/drv_pwm.c b/bsp/hpmicro/libraries/drivers/drv_pwm.c
index 7d1d0a49967e..6e31ea6721cb 100644
--- a/bsp/hpmicro/libraries/drivers/drv_pwm.c
+++ b/bsp/hpmicro/libraries/drivers/drv_pwm.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2022-2024 HPMicro
+ * Copyright (c) 2022-2023 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -8,7 +8,9 @@
* 2022-05-09 HPMicro First version
* 2023-04-12 HPMicro Adapt hpm_sdk v1.0.0
* 2023-05-13 HPMicro Fix compiling error on HPM6360/HPM6200
- * 2023-06-10 HPMicro Add PWMv2 support
+ * 2026-09-10 HPMicro Check shared counter frequency conflicts
+ * 2026-09-10 HPMicro Support optional RT-Thread PWM controls
+ * 2026-09-11 HPMicro Fix runtime updates and shared counter handling
*/
#include
@@ -28,6 +30,16 @@
#endif
#include "hpm_clock_drv.h"
+#define PWM_CHANNEL_NUM PWM_SOC_PWM_MAX_COUNT
+
+typedef struct {
+ struct rt_pwm_configuration config;
+ uint32_t reload;
+ bool configured;
+ bool enabled;
+ bool irq_enabled;
+} hpm_pwm_channel_state_t;
+
#ifdef HPM_PWM3
#define PWM_INSTANCE_NUM 4
#elif defined(HPM_PWM2)
@@ -55,33 +67,20 @@ static PWM_Type * pwm_base_tbl[PWM_INSTANCE_NUM] = {
#endif
};
-#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+static hpm_pwm_channel_state_t pwm_channel_state[PWM_INSTANCE_NUM][PWM_CHANNEL_NUM];
-#ifdef PWMV2_CNT_3
-#define PWMV2_CNT_NUM 4
-#elif PWMV2_CNT_2
-#define PWMV2_CNT_NUM 3
-#elif PWMV2_CNT_1
-#define PWMV2_CNT_NUM 2
-#else
-#define PWMV2_CNT_NUM 1
-#endif
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+#define PWMV2_RELOAD_MAX 0xFFFFFFU
-static pwm_counter_t pwmv2_counter_tbl[PWMV2_CNT_NUM * 2] = {
+static const pwm_counter_t pwmv2_counter_tbl[PWM_CHANNEL_NUM] = {
pwm_counter_0,
pwm_counter_0,
-#ifdef PWMV2_CNT_1
pwm_counter_1,
pwm_counter_1,
-#endif
-#ifdef PWMV2_CNT_2
pwm_counter_2,
pwm_counter_2,
-#endif
-#ifdef PWMV2_CNT_3
pwm_counter_3,
pwm_counter_3,
-#endif
};
#endif
@@ -91,7 +90,228 @@ extern uint32_t rtt_board_init_pwm_clock(PWMV2_Type *ptr);
extern uint32_t rtt_board_init_pwm_clock(PWM_Type *ptr);
#endif
-rt_err_t hpm_generate_central_aligned_waveform(uint8_t pwm_index, uint8_t channel, uint32_t period, uint32_t pulse)
+static rt_err_t hpm_pwm_calculate_timing(uint8_t pwm_index, uint32_t period, uint32_t pulse,
+ uint32_t *reload, uint32_t *duty)
+{
+ uint32_t freq;
+ uint64_t reload_ticks;
+ uint64_t duty_ticks;
+
+ if ((pwm_index >= PWM_INSTANCE_NUM) || (period == 0U) || (pulse > period)) {
+ return -RT_EINVAL;
+ }
+
+ freq = rtt_board_init_pwm_clock(pwm_base_tbl[pwm_index]);
+ reload_ticks = (uint64_t)freq * period / 1000000000U;
+ duty_ticks = (uint64_t)freq * pulse / 1000000000U;
+
+ if ((reload_ticks == 0U) || (reload_ticks > UINT32_MAX)) {
+ return -RT_EINVAL;
+ }
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ if (reload_ticks > PWMV2_RELOAD_MAX) {
+ return -RT_EINVAL;
+ }
+#else
+ if (reload_ticks > PWM_RLD_RLD_GET(PWM_RLD_RLD_MASK)) {
+ return -RT_EINVAL;
+ }
+#endif
+
+ *reload = (uint32_t)reload_ticks;
+ *duty = (uint32_t)duty_ticks;
+
+ return RT_EOK;
+}
+
+static rt_err_t hpm_pwm_calculate_dead_time(uint8_t pwm_index, uint32_t dead_time,
+ uint32_t *dead_ticks)
+{
+ uint32_t freq;
+ uint64_t ticks;
+
+ if (pwm_index >= PWM_INSTANCE_NUM) {
+ return -RT_EINVAL;
+ }
+
+ if (dead_time == 0U) {
+ *dead_ticks = 0U;
+ return RT_EOK;
+ }
+
+ freq = rtt_board_init_pwm_clock(pwm_base_tbl[pwm_index]);
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ ticks = ((uint64_t)freq * dead_time + 999999999U) / 1000000000U;
+ /* Values below two clocks disable dead-area insertion. */
+ if (ticks < 2U) {
+ ticks = 2U;
+ }
+ if (ticks > UINT16_MAX) {
+ return -RT_EINVAL;
+ }
+#else
+ ticks = ((uint64_t)freq * dead_time * 2U + 999999999U) / 1000000000U;
+ /* The dead-area unit is half a clock and the hardware minimum is one clock. */
+ if (ticks < 2U) {
+ ticks = 2U;
+ }
+ if (ticks > PWM_PWMCFG_DEADAREA_GET(PWM_PWMCFG_DEADAREA_MASK)) {
+ return -RT_EINVAL;
+ }
+#endif
+
+ *dead_ticks = (uint32_t)ticks;
+ return RT_EOK;
+}
+
+static bool hpm_pwm_use_complementary(uint8_t channel, bool requested)
+{
+ /* RT-Thread cannot represent negative channel zero, so keep channel zero as normal output. */
+ return requested && (channel != 0U);
+}
+
+static bool hpm_pwm_channel_has_pair(uint8_t channel)
+{
+ return ((channel & 1U) == 0U) && ((channel + 1U) < PWM_CHANNEL_NUM);
+}
+
+static rt_err_t hpm_pwm_validate_configuration(uint8_t pwm_index,
+ const struct rt_pwm_configuration *config,
+ uint32_t *reload, uint32_t *duty,
+ uint32_t *dead_ticks)
+{
+ bool complementary;
+
+ if (config->phase > 360U) {
+ return -RT_EINVAL;
+ }
+
+ complementary = hpm_pwm_use_complementary(config->channel, config->complementary);
+ if (complementary && !hpm_pwm_channel_has_pair(config->channel)) {
+ return -RT_EINVAL;
+ }
+
+ if (hpm_pwm_calculate_timing(pwm_index, config->period, config->pulse,
+ reload, duty) != RT_EOK) {
+ return -RT_EINVAL;
+ }
+
+ return hpm_pwm_calculate_dead_time(pwm_index, config->dead_time, dead_ticks);
+}
+
+static void hpm_pwm_calculate_compare(uint32_t reload, uint32_t duty, uint32_t phase,
+ uint32_t *cmp_a, uint32_t *cmp_b, bool *invert)
+{
+ uint32_t phase_ticks;
+ uint64_t start;
+ uint64_t end;
+
+ phase_ticks = (uint32_t)((uint64_t)reload * (phase % 360U) / 360U);
+ start = (uint64_t)((reload - duty) >> 1) + phase_ticks;
+ end = ((uint64_t)reload + duty) / 2U + phase_ticks;
+ *invert = false;
+
+ if (start >= reload) {
+ start -= reload;
+ end -= reload;
+ } else if (end > reload) {
+ uint32_t wrapped_end = end - reload;
+
+ end = start;
+ start = wrapped_end;
+ *invert = true;
+ }
+ *cmp_a = (uint32_t)start;
+ *cmp_b = (uint32_t)end;
+}
+
+static bool hpm_pwm_channel_shares_counter(uint8_t channel_a, uint8_t channel_b)
+{
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ return (channel_a / 2U) == (channel_b / 2U);
+#else
+ (void)channel_a;
+ (void)channel_b;
+ return true;
+#endif
+}
+
+static bool hpm_pwm_counter_is_active(uint8_t pwm_index, uint8_t channel)
+{
+ uint8_t index;
+
+ for (index = 0; index < PWM_CHANNEL_NUM; index++) {
+ if (pwm_channel_state[pwm_index][index].enabled
+ && hpm_pwm_channel_shares_counter(channel, index)) {
+ return true;
+ }
+ }
+
+ return false;
+}
+
+static void hpm_pwm_stop_counter(uint8_t pwm_index, uint8_t channel)
+{
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ pwmv2_disable_counter(pwm_base_tbl[pwm_index], pwmv2_counter_tbl[channel]);
+#else
+ (void)channel;
+ pwm_stop_counter(pwm_base_tbl[pwm_index]);
+#endif
+}
+
+static rt_err_t hpm_pwm_check_frequency_conflict(uint8_t pwm_index, uint8_t channel, uint32_t reload)
+{
+ uint8_t index;
+
+ for (index = 0; index < PWM_CHANNEL_NUM; index++) {
+ if ((index != channel)
+ && pwm_channel_state[pwm_index][index].enabled
+ && hpm_pwm_channel_shares_counter(channel, index)
+ && (pwm_channel_state[pwm_index][index].reload != reload)) {
+ rt_kprintf("pwm%u channel %u conflicts with enabled channel %u: "
+ "shared counter requires the same frequency\n",
+ (unsigned int)pwm_index, (unsigned int)channel, (unsigned int)index);
+ return -RT_EINVAL;
+ }
+ }
+
+ return RT_EOK;
+}
+
+static rt_err_t hpm_pwm_check_pair_conflict(uint8_t pwm_index,
+ const struct rt_pwm_configuration *config)
+{
+ uint8_t channel = config->channel;
+ bool complementary = hpm_pwm_use_complementary(channel, config->complementary);
+
+ if (complementary && !hpm_pwm_channel_has_pair(channel)) {
+ return -RT_EINVAL;
+ }
+
+ if (complementary && pwm_channel_state[pwm_index][channel + 1U].enabled) {
+ rt_kprintf("pwm%u channel %u conflicts with enabled channel %u: "
+ "complementary output requires the channel pair\n",
+ (unsigned int)pwm_index, (unsigned int)channel,
+ (unsigned int)(channel + 1U));
+ return -RT_EBUSY;
+ }
+
+ if (((channel & 1U) != 0U)
+ && pwm_channel_state[pwm_index][channel - 1U].enabled
+ && hpm_pwm_use_complementary(channel - 1U,
+ pwm_channel_state[pwm_index][channel - 1U].config.complementary)) {
+ rt_kprintf("pwm%u channel %u is used by complementary channel %u\n",
+ (unsigned int)pwm_index, (unsigned int)channel,
+ (unsigned int)(channel - 1U));
+ return -RT_EBUSY;
+ }
+
+ return RT_EOK;
+}
+
+static rt_err_t hpm_generate_central_aligned_waveform(
+ uint8_t pwm_index, const struct rt_pwm_configuration *config)
{
#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
PWMV2_Type * pwm_base;
@@ -100,31 +320,41 @@ rt_err_t hpm_generate_central_aligned_waveform(uint8_t pwm_index, uint8_t channe
PWM_Type * pwm_base;
pwm_cmp_config_t cmp_config[2] = {0};
pwm_config_t pwm_config = {0};
+ pwm_pair_config_t pair_config = {0};
#endif
+ uint8_t channel = config->channel;
uint32_t duty;
- uint32_t reload = 0;
- uint32_t freq;
+ uint32_t reload;
+ uint32_t dead_ticks;
+ uint32_t cmp_a;
+ uint32_t cmp_b;
+ bool complementary;
+ bool counter_active;
+ bool invert;
+
pwm_base = pwm_base_tbl[pwm_index];
init_pwm_pins(pwm_base);
- freq = rtt_board_init_pwm_clock(pwm_base);
- if(period != 0) {
- reload = (uint64_t)freq * period / 1000000000;
- } else {
- reload = 0;
+ if (hpm_pwm_validate_configuration(pwm_index, config, &reload, &duty,
+ &dead_ticks) != RT_EOK) {
+ return -RT_EINVAL;
}
- duty = (uint64_t)freq * pulse / 1000000000;
+ complementary = hpm_pwm_use_complementary(channel, config->complementary);
+ counter_active = hpm_pwm_counter_is_active(pwm_index, channel);
+ hpm_pwm_calculate_compare(reload, duty, config->phase, &cmp_a, &cmp_b, &invert);
#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
pwm_counter = pwmv2_counter_tbl[channel];
- pwmv2_disable_counter(pwm_base, pwm_counter);
- pwmv2_reset_counter(pwm_base, pwm_counter);
+ if (!counter_active) {
+ pwmv2_disable_counter(pwm_base, pwm_counter);
+ pwmv2_reset_counter(pwm_base, pwm_counter);
+ }
pwmv2_shadow_register_unlock(pwm_base);
pwmv2_set_shadow_val(pwm_base, channel / 2, reload, 0, false); /**< cnt use 0-3 shadow */
- pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, reload + 1, 0, false);
+ pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, reload, 0, false);
pwmv2_set_shadow_val(pwm_base, channel * 2 + 5, reload, 0, false);
pwmv2_counter_select_data_offset_from_shadow_value(pwm_base, pwm_counter, channel / 2);
@@ -135,47 +365,84 @@ rt_err_t hpm_generate_central_aligned_waveform(uint8_t pwm_index, uint8_t channe
pwmv2_select_cmp_source(pwm_base, channel * 2 + 1, cmp_value_from_shadow_val, channel * 2 + 5);
pwmv2_shadow_register_lock(pwm_base);
+ pwmv2_cmp_update_trig_time(pwm_base, channel * 2,
+ pwm_shadow_register_update_on_reload);
+ pwmv2_cmp_update_trig_time(pwm_base, channel * 2 + 1,
+ pwm_shadow_register_update_on_reload);
pwmv2_disable_four_cmp(pwm_base, channel);
+ if (invert) {
+ pwmv2_enable_output_invert(pwm_base, channel);
+ } else {
+ pwmv2_disable_output_invert(pwm_base, channel);
+ }
+ pwmv2_disable_pair_mode(pwm_base, channel & ~1U);
+ pwmv2_disable_pair_mode(pwm_base, (channel & ~1U) + 1U);
+ if (complementary) {
+ pwmv2_set_dead_area(pwm_base, channel, dead_ticks);
+ pwmv2_set_dead_area(pwm_base, channel + 1U, dead_ticks);
+ pwmv2_enable_pair_mode(pwm_base, channel);
+ pwmv2_enable_pair_mode(pwm_base, channel + 1U);
+ pwmv2_channel_enable_output(pwm_base, channel + 1U);
+ }
pwmv2_channel_enable_output(pwm_base, channel);
pwmv2_enable_counter(pwm_base, pwm_counter);
pwmv2_start_pwm_output(pwm_base, pwm_counter);
pwmv2_shadow_register_unlock(pwm_base);
- pwmv2_set_shadow_val(pwm_base, channel * 2, (reload - duty) >> 1, 0, false);
- pwmv2_set_shadow_val(pwm_base, channel * 2, (reload + duty) >> 1, 0, false);
+ pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, cmp_a, 0, false);
+ pwmv2_set_shadow_val(pwm_base, channel * 2 + 5, cmp_b, 0, false);
pwmv2_shadow_register_lock(pwm_base);
#else
- pwm_stop_counter(pwm_base);
- pwm_get_default_pwm_config(pwm_base, &pwm_config);
+ if (!counter_active) {
+ pwm_stop_counter(pwm_base);
+ }
/*
* reload and start counter
*/
pwm_set_reload(pwm_base, 0, reload);
- pwm_set_start_count(pwm_base, 0, 0);
+ if (!counter_active) {
+ pwm_set_start_count(pwm_base, 0, 0);
+ }
/*
* config cmp1 and cmp2
*/
cmp_config[0].mode = pwm_cmp_mode_output_compare;
- cmp_config[0].cmp = (reload - duty) >> 1;
+ cmp_config[0].cmp = cmp_a;
cmp_config[0].update_trigger = pwm_shadow_register_update_on_shlk;
cmp_config[1].mode = pwm_cmp_mode_output_compare;
- cmp_config[1].cmp = (reload + duty) >> 1;
+ cmp_config[1].cmp = cmp_b;
cmp_config[1].update_trigger = pwm_shadow_register_update_on_shlk;
-
- pwm_config.enable_output = true;
- pwm_config.dead_zone_in_half_cycle = 0;
- pwm_config.invert_output = false;
/*
* config pwm
*/
- if (status_success != pwm_setup_waveform(pwm_base, channel, &pwm_config, channel * 2, cmp_config, 2)) {
- return -RT_ERROR;
+ if (complementary) {
+ pwm_get_default_pwm_pair_config(pwm_base, &pair_config);
+ pair_config.pwm[0].enable_output = true;
+ pair_config.pwm[0].dead_zone_in_half_cycle = dead_ticks;
+ pair_config.pwm[0].invert_output = invert;
+ pair_config.pwm[1].enable_output = true;
+ pair_config.pwm[1].dead_zone_in_half_cycle = dead_ticks;
+ pair_config.pwm[1].invert_output = invert;
+ if (status_success != pwm_setup_waveform_in_pair(pwm_base, channel, &pair_config,
+ channel * 2, cmp_config, 2)) {
+ return -RT_ERROR;
+ }
+ } else {
+ pwm_get_default_pwm_config(pwm_base, &pwm_config);
+ pwm_config.enable_output = true;
+ pwm_config.invert_output = invert;
+ if (status_success != pwm_setup_waveform(pwm_base, channel, &pwm_config,
+ channel * 2, cmp_config, 2)) {
+ return -RT_ERROR;
+ }
+ pwm_base->PWMCFG[channel & ~1U] &= ~PWM_PWMCFG_PAIR_MASK;
+ pwm_base->PWMCFG[(channel & ~1U) + 1U] &= ~PWM_PWMCFG_PAIR_MASK;
}
pwm_start_counter(pwm_base);
pwm_issue_shadow_register_lock_event(pwm_base);
@@ -185,165 +452,321 @@ rt_err_t hpm_generate_central_aligned_waveform(uint8_t pwm_index, uint8_t channe
}
-rt_err_t hpm_set_central_aligned_waveform(uint8_t pwm_index, uint8_t channel, uint32_t period, uint32_t pulse)
+static rt_err_t hpm_set_central_aligned_waveform(
+ uint8_t pwm_index, const struct rt_pwm_configuration *config)
{
#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
PWMV2_Type * pwm_base;
#else
PWM_Type * pwm_base;
- pwm_config_t pwm_config = {0};
#endif
-
+ uint8_t channel = config->channel;
uint32_t duty;
- uint32_t reload = 0;
- uint32_t freq;
+ uint32_t reload;
+ uint32_t dead_ticks;
+ uint32_t cmp_a;
+ uint32_t cmp_b;
+ bool complementary;
+ bool invert;
pwm_base = pwm_base_tbl[pwm_index];
- freq = rtt_board_init_pwm_clock(pwm_base);
- if(period != 0) {
- reload = (uint64_t)freq * period / 1000000000;
- } else {
- reload = 0;
+ if (hpm_pwm_validate_configuration(pwm_index, config, &reload, &duty,
+ &dead_ticks) != RT_EOK) {
+ return -RT_EINVAL;
}
- duty = (uint64_t)freq * pulse / 1000000000;
+ complementary = hpm_pwm_use_complementary(channel, config->complementary);
+ hpm_pwm_calculate_compare(reload, duty, config->phase, &cmp_a, &cmp_b, &invert);
#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
pwmv2_shadow_register_unlock(pwm_base);
pwmv2_set_shadow_val(pwm_base, channel / 2, reload, 0, false); /**< cnt use 0-3 shadow */
- pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, (reload - duty) >> 1, 0, false);
- pwmv2_set_shadow_val(pwm_base, channel * 2 + 5, (reload + duty) >> 1, 0, false);
+ pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, cmp_a, 0, false);
+ pwmv2_set_shadow_val(pwm_base, channel * 2 + 5, cmp_b, 0, false);
pwmv2_shadow_register_lock(pwm_base);
+ if (invert) {
+ pwmv2_enable_output_invert(pwm_base, channel);
+ } else {
+ pwmv2_disable_output_invert(pwm_base, channel);
+ }
+ if (complementary) {
+ pwmv2_set_dead_area(pwm_base, channel, dead_ticks);
+ pwmv2_set_dead_area(pwm_base, channel + 1U, dead_ticks);
+ }
#else
- pwm_get_default_pwm_config(pwm_base, &pwm_config);
+ if (complementary) {
+ pwm_disable_output(pwm_base, channel);
+ pwm_disable_output(pwm_base, channel + 1U);
+ }
pwm_set_reload(pwm_base, 0, reload);
- pwm_update_raw_cmp_central_aligned(pwm_base, channel * 2, channel * 2 + 1, (reload - duty) >> 1, (reload + duty) >> 1);
+ pwm_shadow_register_unlock(pwm_base);
+ pwm_cmp_update_cmp_value(pwm_base, channel * 2, cmp_a, 0);
+ pwm_cmp_update_cmp_value(pwm_base, channel * 2 + 1, cmp_b, 0);
+ pwm_base->CHCFG[channel] = (pwm_base->CHCFG[channel] & ~PWM_CHCFG_OUTPOL_MASK)
+ | PWM_CHCFG_OUTPOL_SET(invert);
+ if (complementary) {
+ pwm_base->CHCFG[channel + 1U] =
+ (pwm_base->CHCFG[channel + 1U] & ~PWM_CHCFG_OUTPOL_MASK)
+ | PWM_CHCFG_OUTPOL_SET(invert);
+ pwm_base->PWMCFG[channel] = (pwm_base->PWMCFG[channel] & ~PWM_PWMCFG_DEADAREA_MASK)
+ | PWM_PWMCFG_PAIR_MASK
+ | PWM_PWMCFG_DEADAREA_SET(dead_ticks);
+ pwm_base->PWMCFG[channel + 1U] =
+ (pwm_base->PWMCFG[channel + 1U] & ~PWM_PWMCFG_DEADAREA_MASK)
+ | PWM_PWMCFG_PAIR_MASK
+ | PWM_PWMCFG_DEADAREA_SET(dead_ticks);
+ pwm_enable_output(pwm_base, channel);
+ pwm_enable_output(pwm_base, channel + 1U);
+ }
pwm_issue_shadow_register_lock_event(pwm_base);
#endif
return RT_EOK;
}
-rt_err_t hpm_disable_pwm(uint8_t pwm_index, uint8_t channel)
+static rt_err_t hpm_disable_pwm(uint8_t pwm_index, uint8_t channel, bool complementary)
{
#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
- PWMV2_Type * pwm_base;
-
- pwm_base = pwm_base_tbl[pwm_index];
- pwmv2_shadow_register_unlock(pwm_base);
- pwmv2_set_shadow_val(pwm_base, channel * 2 + 4, 0, 0, false);
- pwmv2_set_shadow_val(pwm_base, channel * 2 + 5, 0, 0, false);
- pwmv2_shadow_register_lock(pwm_base);
+ pwmv2_channel_disable_output(pwm_base_tbl[pwm_index], channel);
+ if (complementary) {
+ pwmv2_channel_disable_output(pwm_base_tbl[pwm_index], channel + 1U);
+ }
#else
pwm_disable_output(pwm_base_tbl[pwm_index], channel);
+ if (complementary) {
+ pwm_disable_output(pwm_base_tbl[pwm_index], channel + 1U);
+ }
#endif
return RT_EOK;
}
-rt_err_t hpm_pwm_control(struct rt_device_pwm * device, int cmd, void *arg)
+static rt_err_t hpm_pwm_update_configuration(uint8_t pwm_index,
+ hpm_pwm_channel_state_t *state,
+ struct rt_pwm_configuration *config)
{
- uint8_t channel;
- uint32_t period;
- uint32_t pulse;
- rt_err_t sta = RT_EOK;
- unsigned char pwm_name;
- struct rt_pwm_configuration * configuration;
- configuration = (struct rt_pwm_configuration * )arg;
- channel = configuration->channel;
- period = configuration->period;
- pulse = configuration->pulse;
- if (strcmp("pwm0", device->parent.parent.name) == 0) {
- pwm_name = 0;
- } else if (strcmp("pwm1", device->parent.parent.name) == 0) {
- pwm_name = 1;
- } else if (strcmp("pwm2", device->parent.parent.name) == 0) {
- pwm_name = 2;
- } else if (strcmp("pwm3", device->parent.parent.name) == 0) {
- pwm_name = 3;
- } else {
- return -RT_ERROR;
+ uint32_t reload;
+ uint32_t duty;
+ uint32_t dead_ticks;
+ rt_err_t status;
+
+ config->complementary = hpm_pwm_use_complementary(config->channel,
+ config->complementary);
+ status = hpm_pwm_validate_configuration(pwm_index, config, &reload, &duty,
+ &dead_ticks);
+ if (status != RT_EOK) {
+ return status;
+ }
+ status = hpm_pwm_check_frequency_conflict(pwm_index, config->channel, reload);
+ if (status != RT_EOK) {
+ return status;
+ }
+ status = hpm_pwm_check_pair_conflict(pwm_index, config);
+ if (status != RT_EOK) {
+ return status;
}
- switch(cmd) {
- case PWM_CMD_ENABLE: {
- sta = hpm_generate_central_aligned_waveform(pwm_name, channel, period, pulse);
- break;
- }
- case PWM_CMD_DISABLE: {
- hpm_disable_pwm(pwm_name, channel);
- break;
+ if (state->enabled) {
+ status = hpm_set_central_aligned_waveform(pwm_index, config);
+ if (status != RT_EOK) {
+ return status;
}
- case PWM_CMD_SET: {
- sta = hpm_set_central_aligned_waveform(pwm_name, channel, period, pulse);
- break;
+ }
+
+ state->config = *config;
+ state->reload = reload;
+ state->configured = true;
+ return RT_EOK;
+}
+
+static rt_err_t hpm_pwm_set_reload_irq(uint8_t pwm_index, uint8_t channel, bool enable)
+{
+ uint8_t index;
+ bool shared_irq_enabled = false;
+
+ pwm_channel_state[pwm_index][channel].irq_enabled = enable;
+ if (!enable) {
+ for (index = 0; index < PWM_CHANNEL_NUM; index++) {
+ if ((index != channel)
+ && pwm_channel_state[pwm_index][index].irq_enabled
+ && hpm_pwm_channel_shares_counter(channel, index)) {
+ shared_irq_enabled = true;
+ break;
+ }
}
- case PWM_CMD_GET: {
- sta = RT_EOK;
- break;
+ }
+
+ if (enable || !shared_irq_enabled) {
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ if (enable) {
+ pwmv2_clear_reload_irq_status(pwm_base_tbl[pwm_index],
+ 1U << pwmv2_counter_tbl[channel]);
+ pwmv2_enable_reload_irq(pwm_base_tbl[pwm_index], pwmv2_counter_tbl[channel]);
+ } else {
+ pwmv2_disable_reload_irq(pwm_base_tbl[pwm_index], pwmv2_counter_tbl[channel]);
}
- default: {
- sta = -RT_ERROR;
- break;
+#else
+ if (enable) {
+ pwm_clear_status(pwm_base_tbl[pwm_index], PWM_IRQ_RELOAD);
+ pwm_enable_irq(pwm_base_tbl[pwm_index], PWM_IRQ_RELOAD);
+ } else {
+ pwm_disable_irq(pwm_base_tbl[pwm_index], PWM_IRQ_RELOAD);
}
+#endif
}
- return sta;
+
+ return RT_EOK;
}
-rt_err_t hpm_pwm_dev_control(rt_device_t device, int cmd, void *arg)
+static rt_err_t hpm_pwm_execute_control_impl(uint8_t pwm_index, int cmd,
+ struct rt_pwm_configuration *configuration)
{
- uint8_t channel;
- uint32_t period;
- uint32_t pulse;
- rt_err_t sta = RT_EOK;
- uint8_t pwm_name;
- struct rt_pwm_configuration * configuration;
- configuration = (struct rt_pwm_configuration * )arg;
- channel = configuration->channel;
- period = configuration->period;
- pulse = configuration->pulse;
- if (strcmp("pwm0", device->parent.name) == 0) {
- pwm_name = 0;
- } else if (strcmp("pwm1", device->parent.name) == 0) {
- pwm_name = 1;
- } else if (strcmp("pwm2", device->parent.name) == 0) {
- pwm_name = 2;
- } else if (strcmp("pwm3", device->parent.name) == 0) {
- pwm_name = 3;
- } else {
- return -RT_ERROR;
+ hpm_pwm_channel_state_t *state;
+ struct rt_pwm_configuration config;
+ bool release_complementary_output;
+ rt_err_t status;
+
+ if ((configuration == RT_NULL) || (pwm_index >= PWM_INSTANCE_NUM)
+ || (configuration->channel >= PWM_CHANNEL_NUM)) {
+ return -RT_EINVAL;
}
- switch(cmd) {
- case PWM_CMD_ENABLE: {
- sta = hpm_generate_central_aligned_waveform(pwm_name, channel, period, pulse);
- break;
+ state = &pwm_channel_state[pwm_index][configuration->channel];
+
+ switch (cmd) {
+ case PWM_CMD_ENABLE:
+ if (!state->configured) {
+ rt_kprintf("pwm%u channel %u has not been configured\n",
+ (unsigned int)pwm_index, (unsigned int)configuration->channel);
+ return -RT_EINVAL;
+ }
+ config = state->config;
+ config.complementary = hpm_pwm_use_complementary(config.channel,
+ configuration->complementary);
+ status = hpm_pwm_check_frequency_conflict(pwm_index, config.channel, state->reload);
+ if (status != RT_EOK) {
+ return status;
+ }
+ status = hpm_pwm_check_pair_conflict(pwm_index, &config);
+ if (status != RT_EOK) {
+ return status;
+ }
+ release_complementary_output = state->enabled
+ && state->config.complementary
+ && !config.complementary;
+ if (release_complementary_output) {
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ pwmv2_channel_disable_output(pwm_base_tbl[pwm_index], config.channel + 1U);
+#else
+ pwm_disable_output(pwm_base_tbl[pwm_index], config.channel + 1U);
+#endif
+ }
+ status = hpm_generate_central_aligned_waveform(pwm_index, &config);
+ if (status == RT_EOK) {
+ state->config = config;
+ state->enabled = true;
+ } else if (release_complementary_output) {
+#if defined(HPMSOC_HAS_HPMSDK_PWMV2)
+ pwmv2_channel_enable_output(pwm_base_tbl[pwm_index], config.channel + 1U);
+#else
+ pwm_enable_output(pwm_base_tbl[pwm_index], config.channel + 1U);
+#endif
+ }
+ return status;
+
+ case PWM_CMD_DISABLE:
+ status = hpm_disable_pwm(pwm_index, configuration->channel,
+ state->configured && state->config.complementary);
+ if (status == RT_EOK) {
+ state->enabled = false;
+ if (!hpm_pwm_counter_is_active(pwm_index, configuration->channel)) {
+ hpm_pwm_stop_counter(pwm_index, configuration->channel);
+ }
+ }
+ return status;
+
+ case PWM_CMD_SET:
+ config = *configuration;
+ if (state->configured) {
+ config.dead_time = state->config.dead_time;
+ config.phase = state->config.phase;
+ config.complementary = state->config.complementary;
+ }
+ return hpm_pwm_update_configuration(pwm_index, state, &config);
+
+ case PWM_CMD_GET:
+ if (!state->configured) {
+ return -RT_EINVAL;
}
- case PWM_CMD_DISABLE: {
- hpm_disable_pwm(pwm_name, channel);
- break;
+ *configuration = state->config;
+ return RT_EOK;
+
+ case PWM_CMD_SET_PERIOD:
+ if (!state->configured) {
+ return -RT_EINVAL;
}
- case PWM_CMD_SET: {
- sta = hpm_set_central_aligned_waveform(pwm_name, channel, period, pulse);
- break;
+ config = state->config;
+ config.period = configuration->period;
+ return hpm_pwm_update_configuration(pwm_index, state, &config);
+
+ case PWM_CMD_SET_PULSE:
+ if (!state->configured) {
+ return -RT_EINVAL;
}
- case PWM_CMD_GET: {
- sta = RT_EOK;
- break;
+ config = state->config;
+ config.pulse = configuration->pulse;
+ return hpm_pwm_update_configuration(pwm_index, state, &config);
+
+ case PWM_CMD_SET_DEAD_TIME:
+ if (!state->configured) {
+ return -RT_EINVAL;
}
- default: {
- sta = -RT_ERROR;
- break;
+ config = state->config;
+ config.dead_time = configuration->dead_time;
+ return hpm_pwm_update_configuration(pwm_index, state, &config);
+
+ case PWM_CMD_SET_PHASE:
+ if (!state->configured) {
+ return -RT_EINVAL;
}
+ config = state->config;
+ config.phase = configuration->phase;
+ return hpm_pwm_update_configuration(pwm_index, state, &config);
+
+ case PWM_CMD_ENABLE_IRQ:
+ return hpm_pwm_set_reload_irq(pwm_index, configuration->channel, true);
+
+ case PWM_CMD_DISABLE_IRQ:
+ return hpm_pwm_set_reload_irq(pwm_index, configuration->channel, false);
+
+ default:
+ return -RT_EINVAL;
}
- return sta;
}
-const static struct rt_pwm_ops hpm_pwm_ops = {
- .control = &hpm_pwm_control
-};
+static rt_err_t hpm_pwm_execute_control(uint8_t pwm_index, int cmd,
+ struct rt_pwm_configuration *configuration)
+{
+ rt_base_t critical_level;
+ rt_err_t status;
+
+ critical_level = rt_enter_critical();
+ status = hpm_pwm_execute_control_impl(pwm_index, cmd, configuration);
+ rt_exit_critical_safe(critical_level);
-static struct rt_device hpm_pwm_parent = {
- .control = hpm_pwm_dev_control
+ return status;
+}
+
+static rt_err_t hpm_pwm_control(struct rt_device_pwm *device, int cmd, void *arg)
+{
+ uint8_t pwm_index;
+
+ pwm_index = (uint8_t)(rt_ubase_t)device->parent.user_data;
+
+ return hpm_pwm_execute_control(pwm_index, cmd, (struct rt_pwm_configuration *)arg);
+}
+
+static const struct rt_pwm_ops hpm_pwm_ops = {
+ .control = &hpm_pwm_control
};
#ifdef HPM_PWM0
@@ -376,21 +799,33 @@ int rt_hw_pwm_init(void)
int ret = RT_EOK;
#ifdef HPM_PWM0
- hpm_dev_pwm0.parent = hpm_pwm_parent;
- ret = rt_device_pwm_register(&hpm_dev_pwm0, "pwm0", &hpm_pwm_ops, RT_NULL);
+ ret = rt_device_pwm_register(&hpm_dev_pwm0, "pwm0", &hpm_pwm_ops,
+ (void *)(rt_ubase_t)0U);
+ if (ret != RT_EOK) {
+ return ret;
+ }
#endif
#ifdef HPM_PWM1
- hpm_dev_pwm1.parent = hpm_pwm_parent;
- ret = rt_device_pwm_register(&hpm_dev_pwm1, "pwm1", &hpm_pwm_ops, RT_NULL);
+ ret = rt_device_pwm_register(&hpm_dev_pwm1, "pwm1", &hpm_pwm_ops,
+ (void *)(rt_ubase_t)1U);
+ if (ret != RT_EOK) {
+ return ret;
+ }
#endif
#ifdef HPM_PWM2
- hpm_dev_pwm2.parent = hpm_pwm_parent;
- ret = rt_device_pwm_register(&hpm_dev_pwm2, "pwm2", &hpm_pwm_ops, RT_NULL);
+ ret = rt_device_pwm_register(&hpm_dev_pwm2, "pwm2", &hpm_pwm_ops,
+ (void *)(rt_ubase_t)2U);
+ if (ret != RT_EOK) {
+ return ret;
+ }
#endif
#ifdef HPM_PWM3
- hpm_dev_pwm3.parent = hpm_pwm_parent;
- ret = rt_device_pwm_register(&hpm_dev_pwm3, "pwm3", &hpm_pwm_ops, RT_NULL);
+ ret = rt_device_pwm_register(&hpm_dev_pwm3, "pwm3", &hpm_pwm_ops,
+ (void *)(rt_ubase_t)3U);
+ if (ret != RT_EOK) {
+ return ret;
+ }
#endif
return ret;
diff --git a/bsp/hpmicro/libraries/drivers/drv_rtc.c b/bsp/hpmicro/libraries/drivers/drv_rtc.c
index c87e23cf0557..a73a3d992c1d 100644
--- a/bsp/hpmicro/libraries/drivers/drv_rtc.c
+++ b/bsp/hpmicro/libraries/drivers/drv_rtc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021-2023 HPMicro
+ * Copyright (c) 2021-2025 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -67,10 +67,18 @@ static struct rt_device hpm_rtc= {
#endif
};
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+static struct rtc_isr_t {
+ RTC_Type *rtc_base;
+ struct rt_device *rtc_dev;
+} hpm_rtc_isr;
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
/*****************************************************
* RTC interrupt handler
******************************************************/
#ifdef RT_USING_ALARM
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void rtc_isr(void)
{
uint32_t rtc_alarm_flag = rtc_get_alarm_flags(HPM_RTC);
@@ -80,7 +88,20 @@ void rtc_isr(void)
}
rtc_clear_alarm_flags(HPM_RTC, RTC_ALARM_FLAG_ALARM0_MASK | RTC_ALARM_FLAG_ALARM1_MASK);
}
-RTT_DECLARE_EXT_ISR_M(IRQn_RTC, rtc_isr);
+SDK_DECLARE_EXT_ISR_M(IRQn_RTC, rtc_isr);
+#else
+void rtc_isr(int vector, struct rtc_isr_t *hpm_rtc)
+{
+ RTC_Type *rtc_base = hpm_rtc->rtc_base;
+ struct rt_device *rtc_dev = hpm_rtc->rtc_dev;
+ uint32_t rtc_alarm_flag = rtc_get_alarm_flags(rtc_base);
+ if ((rtc_alarm_flag & RTC_ALARM_FLAG_ALARM0_MASK) != 0)
+ {
+ rt_alarm_update(rtc_dev, 1);
+ }
+ rtc_clear_alarm_flags(rtc_base, RTC_ALARM_FLAG_ALARM0_MASK | RTC_ALARM_FLAG_ALARM1_MASK);
+}
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
#endif
/*******************************************************************************************
*
@@ -117,6 +138,11 @@ static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args)
struct timeval tv;
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
+
switch(cmd) {
case RT_DEVICE_CTRL_RTC_GET_TIME:
if (sizeof(uint32_t) == sizeof(time_t)) {
@@ -143,7 +169,7 @@ static rt_err_t hpm_rtc_control(rt_device_t dev, int cmd, void *args)
err = hpm_rtc_get_alarm((struct rt_rtc_wkalarm *)args);
break;
default:
- err = RT_EINVAL;
+ err = -RT_EINVAL;
break;
}
@@ -248,6 +274,15 @@ int rt_hw_rtc_init(void)
rt_device_open(&hpm_rtc, RT_DEVICE_FLAG_RDWR);
+#ifdef RT_USING_ALARM
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ hpm_rtc_isr.rtc_base = HPM_RTC;
+ hpm_rtc_isr.rtc_dev = &hpm_rtc;
+ /* Register RTC device to irq table */
+ rt_hw_interrupt_install(IRQn_RTC, (rt_isr_handler_t)rtc_isr, &hpm_rtc_isr, "RTC");
+#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
return RT_EOK;
}
diff --git a/bsp/hpmicro/libraries/drivers/drv_sdio.c b/bsp/hpmicro/libraries/drivers/drv_sdio.c
index f820c7e0d3ea..cd601a566168 100644
--- a/bsp/hpmicro/libraries/drivers/drv_sdio.c
+++ b/bsp/hpmicro/libraries/drivers/drv_sdio.c
@@ -28,7 +28,6 @@
#include "hpm_sdxc_drv.h"
#include "hpm_l1c_drv.h"
-
#define CACHELINE_SIZE HPM_L1C_CACHELINE_SIZE
#define SDXC_ADMA_TABLE_WORDS SDXC_AMDA3_DESC_MIN_WORDS
#define SDXC_AMDA_ADDR_ALIGNMENT (4U)
@@ -97,7 +96,7 @@ static hpm_stat_t hpm_sdmmc_transfer_polling(struct hpm_mmcsd *mmcsd, sdxc_adma_
static hpm_stat_t hpm_sdmmc_transfer_interrupt_driven(struct hpm_mmcsd *mmcsd, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
static hpm_stat_t hpm_sdmmc_transfer(struct hpm_mmcsd *mmcsd, sdxc_adma_config_t *dma_config, sdxc_xfer_t *xfer);
static rt_int32_t hpm_sdmmc_execute_tuning(struct rt_mmcsd_host *host, rt_int32_t opcode);
-static rt_err_t hpm_sdmmc_signal_voltage_switch(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg);
+static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host);
static void hpm_sdmmc_power_on_via_pin(struct hpm_mmcsd *mmcsd);
static void hpm_sdmmc_power_off_via_pin(struct hpm_mmcsd *mmcsd);
@@ -152,7 +151,7 @@ static void hpm_sdmmc_switch_to_1v8_via_pin(struct hpm_mmcsd *mmcsd)
}
-static rt_err_t hpm_sdmmc_signal_voltage_switch(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg)
+static rt_int32_t hpm_sdmmc_switch_uhs_voltage(struct rt_mmcsd_host *host)
{
struct hpm_mmcsd *mmcsd = (struct hpm_mmcsd *) host->private_data;
SDXC_Type *base = mmcsd->sdxc_base;
@@ -174,17 +173,9 @@ static rt_err_t hpm_sdmmc_signal_voltage_switch(struct rt_mmcsd_host *host, stru
return -RT_ETIMEOUT;
}
- /* 3. Switch to 1.8V/3.3V */
- if (ios->signal_voltage == MMCSD_SIGNAL_VOLTAGE_330)
- {
- hpm_sdmmc_switch_to_3v3_via_pin(mmcsd);
- sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_3v3);
- }
- else
- {
- hpm_sdmmc_switch_to_1v8_via_pin(mmcsd);
- sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_1v8);
- }
+ /* 3. Switch to 1.8V */
+ hpm_sdmmc_switch_to_1v8_via_pin(mmcsd);
+ sdxc_select_voltage(mmcsd->sdxc_base, sdxc_bus_voltage_sd_1v8);
/* 4. spec:host delay 5ms, host: give more delay time here */
rt_thread_mdelay(10);
@@ -221,7 +212,7 @@ static const struct rt_mmcsd_host_ops hpm_mmcsd_host_ops =
.get_card_status = NULL,
.enable_sdio_irq = hpm_sdmmc_enable_sdio_irq,
.execute_tuning = hpm_sdmmc_execute_tuning,
- .signal_voltage_switch = hpm_sdmmc_signal_voltage_switch,
+ .switch_uhs_voltage = hpm_sdmmc_switch_uhs_voltage,
};
void hpm_sdmmc_isr(struct hpm_mmcsd *mmcsd)
@@ -249,7 +240,6 @@ void hpm_sdmmc_isr(struct hpm_mmcsd *mmcsd)
}
#if defined(BSP_USING_SDXC0)
-void sdxc0_isr(void);
/* Place the ADMA table to non-cacheable region */
ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(8) static uint32_t s_sdxc0_adma_table[SDXC_ADMA_TABLE_WORDS];
@@ -316,15 +306,16 @@ static struct hpm_mmcsd s_hpm_sdxc0 =
.data_buf_size = BSP_SDXC0_CACHEABLE_BUFFER_SIZE_IN_SECTOR * SDMMC_DEFAULT_SECTOR_SIZE,
#endif
};
-SDK_DECLARE_EXT_ISR_M(IRQn_SDXC0, sdxc0_isr);
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void sdxc0_isr(void)
{
hpm_sdmmc_isr(&s_hpm_sdxc0);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_SDXC0, sdxc0_isr);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
#endif
#if defined(BSP_USING_SDXC1)
-void sdxc1_isr(void);
/* Place the ADMA table to non-cacheable region */
ATTR_PLACE_AT_NONCACHEABLE_WITH_ALIGNMENT(8) static uint32_t s_sdxc1_adma_table[SDXC_ADMA_TABLE_WORDS];
#if defined(BSP_SDXC1_NONCACHEABLE_BUFFER_SIZE_IN_SECTOR)
@@ -388,13 +379,22 @@ static struct hpm_mmcsd s_hpm_sdxc1 =
.data_buf_size = BSP_SDXC1_CACHEABLE_BUFFER_SIZE_IN_SECTOR * SDMMC_DEFAULT_SECTOR_SIZE,
#endif
};
-SDK_DECLARE_EXT_ISR_M(IRQn_SDXC1, sdxc1_isr);
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void sdxc1_isr(void)
{
hpm_sdmmc_isr(&s_hpm_sdxc1);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_SDXC1, sdxc1_isr);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
#endif
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+void sdxc_isr(int vector, struct hpm_mmcsd *sdxc)
+{
+ hpm_sdmmc_isr(sdxc);
+}
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
static struct hpm_mmcsd *hpm_sdxcs[] =
{
#if defined(BSP_USING_SDXC0)
@@ -1170,6 +1170,11 @@ int rt_hw_sdio_init(void)
intc_m_enable_irq_with_priority(mmcsd->irq_num, mmcsd->irq_priority);
mmcsd_change(host);
+
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register SDXC device to irq table */
+ rt_hw_interrupt_install(mmcsd->irq_num, (rt_isr_handler_t)sdxc_isr, hpm_sdxcs[i], mmcsd->name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
if (err != RT_EOK)
diff --git a/bsp/hpmicro/libraries/drivers/drv_soft_i2c.c b/bsp/hpmicro/libraries/drivers/drv_soft_i2c.c
new file mode 100644
index 000000000000..5aa0139fe5dc
--- /dev/null
+++ b/bsp/hpmicro/libraries/drivers/drv_soft_i2c.c
@@ -0,0 +1,263 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "drv_soft_i2c.h"
+#include
+#include
+#include
+#include "rtt_board.h"
+
+#ifdef BSP_USING_SOFT_I2C
+
+#define DBG_TAG "drv.soft_i2c"
+#define DBG_LVL DBG_INFO
+#include
+
+/*
+ * I2C device structure initialization macro
+ * This macro initializes a soft I2C configuration structure with pin names and bus name
+ * Usage: I2C_INIT_STRUCT(n) where n is the I2C number (1-8)
+ */
+#define I2C_INIT_STRUCT(n) \
+ { \
+ .scl_pin_name = BSP_SOFT_I2C##n##_SCL_PIN, \
+ .sda_pin_name = BSP_SOFT_I2C##n##_SDA_PIN, \
+ .bus_name = "soft_i2c"#n, \
+ }
+
+/*
+ * Dynamically build configuration array using weak symbol.
+ * Users define I2C configuration macros in board.h or rtconfig.h:
+ #define I2C1_BUS_CONFIG \
+ { \
+ .scl = "PD20", \
+ .sda = "PD21", \
+ .bus_name = "i2c1", \
+ }
+ */
+
+ATTR_WEAK struct hpm_soft_i2c_config soft_i2c_configs[] = {
+#if defined(BSP_USING_SOFT_I2C0)
+ I2C_INIT_STRUCT(0),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C1)
+ I2C_INIT_STRUCT(1),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C2)
+ I2C_INIT_STRUCT(2),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C3)
+ I2C_INIT_STRUCT(3),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C4)
+ I2C_INIT_STRUCT(4),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C5)
+ I2C_INIT_STRUCT(5),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C6)
+ I2C_INIT_STRUCT(6),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C7)
+ I2C_INIT_STRUCT(7),
+#endif
+
+#if defined(BSP_USING_SOFT_I2C8)
+ I2C_INIT_STRUCT(8),
+#endif
+};
+
+/* Number of soft I2C devices configured */
+#define SOFT_I2C_PTRS_NUM (sizeof(soft_i2c_configs) / sizeof(soft_i2c_configs[0]))
+
+static struct hpm_i2c i2c_obj[SOFT_I2C_PTRS_NUM];
+
+/**
+ * This function initializes the i2c pin.
+ *
+ * @param hpm i2c driver class.
+ */
+static void hpm_i2c_gpio_init(struct hpm_i2c *i2c)
+{
+ struct hpm_soft_i2c_config* cfg = (struct hpm_soft_i2c_config*)i2c->ops.data;
+ rt_base_t scl_pin = rt_pin_get(cfg->scl_pin_name);
+ rt_base_t sda_pin = rt_pin_get(cfg->sda_pin_name);
+ if (scl_pin < 0 || sda_pin < 0)
+ {
+ LOG_E("i2c bus %s pin init error!", cfg->bus_name);
+ return;
+ }
+
+ rt_pin_mode(scl_pin, PIN_MODE_OUTPUT_OD);
+ rt_pin_mode(sda_pin, PIN_MODE_OUTPUT_OD);
+
+ rt_pin_write(scl_pin, PIN_HIGH);
+ rt_pin_write(sda_pin, PIN_HIGH);
+}
+
+static void hpm_i2c_pin_init(void)
+{
+ rt_size_t obj_num = sizeof(i2c_obj) / sizeof(struct hpm_i2c);
+
+ for(rt_size_t i = 0; i < obj_num; i++)
+ {
+ hpm_i2c_gpio_init(&i2c_obj[i]);
+ }
+}
+
+/**
+ * This function sets the sda pin.
+ *
+ * @param hpm config class.
+ * @param The sda pin state.
+ */
+static void hpm_set_sda(void *data, rt_int32_t state)
+{
+ struct hpm_soft_i2c_config* cfg = (struct hpm_soft_i2c_config*)data;
+ rt_base_t sda_pin = rt_pin_get(cfg->sda_pin_name);
+ if (state)
+ {
+ rt_pin_write(sda_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(sda_pin, PIN_LOW);
+ }
+}
+
+/**
+ * This function sets the scl pin.
+ *
+ * @param hpm config class.
+ * @param The scl pin state.
+ */
+static void hpm_set_scl(void *data, rt_int32_t state)
+{
+ struct hpm_soft_i2c_config* cfg = (struct hpm_soft_i2c_config*)data;
+ rt_base_t scl_pin = rt_pin_get(cfg->scl_pin_name);
+ if (state)
+ {
+ rt_pin_write(scl_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(scl_pin, PIN_LOW);
+ }
+}
+
+/**
+ * This function gets the sda pin state.
+ *
+ * @param The sda pin state.
+ */
+static rt_int32_t hpm_get_sda(void *data)
+{
+ struct hpm_soft_i2c_config* cfg = (struct hpm_soft_i2c_config*)data;
+ rt_base_t sda_pin = rt_pin_get(cfg->sda_pin_name);
+ return rt_pin_read(sda_pin);
+}
+
+/**
+ * This function gets the scl pin state.
+ *
+ * @param The scl pin state.
+ */
+static rt_int32_t hpm_get_scl(void *data)
+{
+ struct hpm_soft_i2c_config* cfg = (struct hpm_soft_i2c_config*)data;
+ rt_base_t scl_pin = rt_pin_get(cfg->scl_pin_name);
+ return rt_pin_read(scl_pin);
+}
+
+static const struct rt_i2c_bit_ops hpm_bit_ops_default =
+{
+ .data = RT_NULL,
+ .pin_init = hpm_i2c_pin_init,
+ .set_sda = hpm_set_sda,
+ .set_scl = hpm_set_scl,
+ .get_sda = hpm_get_sda,
+ .get_scl = hpm_get_scl,
+ .udelay = rt_hw_us_delay,
+ .delay_us = BSP_USING_SOFT_I2C_TIMING_DELAY_US,
+ .timeout = BSP_USING_SOFT_I2C_TIMING_TIMEOUT,
+ .i2c_pin_init_flag = RT_FALSE
+};
+
+/**
+ * if i2c is locked, this function will unlock it
+ *
+ * @param hpm config class
+ *
+ * @return RT_EOK indicates successful unlock.
+ */
+static rt_err_t hpm_i2c_bus_unlock(const struct hpm_soft_i2c_config *cfg)
+{
+ rt_int32_t i = 0;
+ rt_base_t sda_pin = rt_pin_get(cfg->sda_pin_name);
+ rt_base_t scl_pin = rt_pin_get(cfg->scl_pin_name);
+ if (PIN_LOW == rt_pin_read(sda_pin))
+ {
+ while (i++ < 9)
+ {
+ rt_pin_write(scl_pin, PIN_HIGH);
+ rt_hw_us_delay(100);
+ rt_pin_write(scl_pin, PIN_LOW);
+ rt_hw_us_delay(100);
+ }
+ }
+ if (PIN_LOW == rt_pin_read(sda_pin))
+ {
+ return -RT_ERROR;
+ }
+
+ return RT_EOK;
+}
+
+/* I2C initialization function */
+int rt_software_i2c_init(void)
+{
+ rt_err_t result = RT_EOK;
+ for (rt_size_t i = 0; i < SOFT_I2C_PTRS_NUM; i++)
+ {
+ if ((soft_i2c_configs[i].scl_pin_name == RT_NULL)
+ || (soft_i2c_configs[i].sda_pin_name == RT_NULL))
+ {
+ LOG_E("soft i2c%d pin config error!", i);
+ result = -RT_ERROR;
+ continue;
+ }
+ if ((rt_strcmp(soft_i2c_configs[i].scl_pin_name, "None") == 0)
+ || (rt_strcmp(soft_i2c_configs[i].sda_pin_name, "None") == 0))
+ {
+ LOG_E("soft i2c%d pin name is None, please check!", i);
+ result = -RT_ERROR;
+ continue;
+ }
+ i2c_obj[i].ops = hpm_bit_ops_default;
+ i2c_obj[i].ops.data = (void*)&soft_i2c_configs[i];
+ i2c_obj[i].i2c_bus.priv = &i2c_obj[i].ops;
+ result = rt_i2c_bit_add_bus(&i2c_obj[i].i2c_bus, soft_i2c_configs[i].bus_name);
+ RT_ASSERT(result == RT_EOK);
+ hpm_i2c_bus_unlock(&soft_i2c_configs[i]);
+ LOG_D("software simulation %s init done, pin scl: %s, pin sda %s",
+ soft_i2c_configs[i].bus_name,
+ soft_i2c_configs[i].scl_pin_name,
+ soft_i2c_configs[i].sda_pin_name);
+ }
+
+ return result;
+}
+INIT_BOARD_EXPORT(rt_software_i2c_init);
+
+#endif /* BSP_USING_SOFT_I2C */
diff --git a/bsp/hpmicro/libraries/drivers/drv_soft_i2c.h b/bsp/hpmicro/libraries/drivers/drv_soft_i2c.h
new file mode 100644
index 000000000000..384e13e18a61
--- /dev/null
+++ b/bsp/hpmicro/libraries/drivers/drv_soft_i2c.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __DRV_SOFT_I2C__
+#define __DRV_SOFT_I2C__
+
+#include
+#include
+#include
+
+/* HPM config class */
+struct hpm_soft_i2c_config
+{
+ const char *scl_pin_name;
+ const char *sda_pin_name;
+ const char *bus_name;
+};
+
+/* HPM i2c driver class */
+struct hpm_i2c
+{
+ struct rt_i2c_bit_ops ops;
+ struct rt_i2c_bus_device i2c_bus;
+};
+
+int rt_hw_i2c_init(void);
+
+#endif /* __DRV_SOFT_I2C__ */
diff --git a/bsp/hpmicro/libraries/drivers/drv_soft_spi.c b/bsp/hpmicro/libraries/drivers/drv_soft_spi.c
new file mode 100644
index 000000000000..7d2282fbea2f
--- /dev/null
+++ b/bsp/hpmicro/libraries/drivers/drv_soft_spi.c
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ *
+ */
+
+#include "drv_soft_spi.h"
+#include
+#include
+#include
+#include "rtt_board.h"
+
+#ifdef BSP_USING_SOFT_SPI
+#include
+
+#define DBG_TAG "drv.soft_spi"
+#define DBG_LVL DBG_INFO
+#include
+
+/*
+ * SPI device structure initialization macro
+ * This macro initializes a soft SPI configuration structure with pin names and bus name
+ * Usage: SPI_INIT_STRUCT(n) where n is the SPI number (0-2)
+ */
+#define SPI_INIT_STRUCT(n) \
+ { \
+ .sck_pin_name = BSP_SOFT_SPI##n##_SCK_PIN, \
+ .mosi_pin_name = BSP_SOFT_SPI##n##_MOSI_PIN, \
+ .miso_pin_name = BSP_SOFT_SPI##n##_MISO_PIN, \
+ .bus_name = "soft_spi"#n, \
+ }
+
+/*
+ * Dynamically build configuration array using weak symbol.
+ * Users define SPI configuration macros in board.h or rtconfig.h:
+ #define SPI1_BUS_CONFIG \
+ { \
+ .sck = "PD20", \
+ .mosi = "PD21", \
+ .miso = "PD22", \
+ .bus_name = "spi1", \
+ }
+ */
+
+ATTR_WEAK struct hpm_soft_spi_config soft_spi_configs[] = {
+#if defined(BSP_USING_SOFT_SPI0)
+ SPI_INIT_STRUCT(0),
+#endif
+
+#if defined(BSP_USING_SOFT_SPI1)
+ SPI_INIT_STRUCT(1),
+#endif
+
+#if defined(BSP_USING_SOFT_SPI2)
+ SPI_INIT_STRUCT(2),
+#endif
+};
+
+/* Number of soft SPI devices configured */
+#define SOFT_SPI_PTRS_NUM (sizeof(soft_spi_configs) / sizeof(soft_spi_configs[0]))
+
+static struct hpm_soft_spi spi_obj[SOFT_SPI_PTRS_NUM];
+
+/**
+ * This function initializes the spi pin.
+ *
+ * @param hpm spi driver class.
+ */
+static void hpm_spi_gpio_init(struct hpm_soft_spi *spi)
+{
+ /* use cfg pointer stored in our hpm_soft_spi instance */
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)spi->cfg;
+ rt_base_t sck_pin = rt_pin_get(cfg->sck_pin_name);
+ rt_base_t mosi_pin = rt_pin_get(cfg->mosi_pin_name);
+ rt_base_t miso_pin = rt_pin_get(cfg->miso_pin_name);
+ if (sck_pin < 0 || mosi_pin < 0 || miso_pin < 0)
+ {
+ LOG_E("spi bus %s pin init error!", cfg->bus_name);
+ return;
+ }
+
+ rt_pin_mode(sck_pin, PIN_MODE_OUTPUT);
+ rt_pin_mode(mosi_pin, PIN_MODE_OUTPUT);
+ rt_pin_mode(miso_pin, PIN_MODE_INPUT);
+
+ rt_pin_write(sck_pin, PIN_HIGH);
+ rt_pin_write(mosi_pin, PIN_HIGH);
+}
+
+static void hpm_spi_pin_init(void)
+{
+ rt_size_t obj_num = sizeof(spi_obj) / sizeof(struct hpm_soft_spi);
+
+ for(rt_size_t i = 0; i < obj_num; i++)
+ {
+ hpm_spi_gpio_init(&spi_obj[i]);
+ }
+}
+
+/**
+ * This function toggle the sck pin.
+ *
+ * @param hpm config class.
+ */
+static void hpm_tog_sck(void *data)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t sck_pin = rt_pin_get(cfg->sck_pin_name);
+ if(rt_pin_read(sck_pin) == PIN_HIGH)
+ {
+ rt_pin_write(sck_pin, PIN_LOW);
+ }
+ else
+ {
+ rt_pin_write(sck_pin, PIN_HIGH);
+ }
+}
+
+/**
+ * This function sets the sck pin.
+ *
+ * @param hpm config class.
+ * @param The sck pin state.
+ */
+static void hpm_set_sck(void *data, rt_int32_t state)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t sck_pin = rt_pin_get(cfg->sck_pin_name);
+ if (state)
+ {
+ rt_pin_write(sck_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(sck_pin, PIN_LOW);
+ }
+}
+
+/**
+ * This function sets the mosi pin.
+ *
+ * @param hpm config class.
+ * @param The mosi pin state.
+ */
+static void hpm_set_mosi(void *data, rt_int32_t state)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t mosi_pin = rt_pin_get(cfg->mosi_pin_name);
+ if (state)
+ {
+ rt_pin_write(mosi_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(mosi_pin, PIN_LOW);
+ }
+}
+
+/**
+ * This function sets the miso pin.
+ *
+ * @param hpm config class.
+ * @param The miso pin state.
+ */
+static void hpm_set_miso(void *data, rt_int32_t state)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t miso_pin = rt_pin_get(cfg->miso_pin_name);
+ if (state)
+ {
+ rt_pin_write(miso_pin, PIN_HIGH);
+ }
+ else
+ {
+ rt_pin_write(miso_pin, PIN_LOW);
+ }
+}
+
+/**
+ * This function gets the sck pin state.
+ *
+ * @param The sck pin state.
+ */
+static rt_int32_t hpm_get_sck(void *data)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t sck_pin = rt_pin_get(cfg->sck_pin_name);
+ return rt_pin_read(sck_pin);
+}
+
+/**
+ * This function gets the mosi pin state.
+ *
+ * @param The mosi pin state.
+ */
+static rt_int32_t hpm_get_mosi(void *data)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t mosi_pin = rt_pin_get(cfg->mosi_pin_name);
+ return rt_pin_read(mosi_pin);
+}
+
+/**
+ * This function gets the miso pin state.
+ *
+ * @param The miso pin state.
+ */
+static rt_int32_t hpm_get_miso(void *data)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t miso_pin = rt_pin_get(cfg->miso_pin_name);
+ return rt_pin_read(miso_pin);
+}
+
+/**
+ * This function sets the mosi pin direction (input/output).
+ *
+ * @param hpm config class.
+ * @param state: 1 for input, 0 for output.
+ */
+static void hpm_dir_mosi(void *data, rt_int32_t state)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t mosi_pin = rt_pin_get(cfg->mosi_pin_name);
+ if (state)
+ {
+ rt_pin_mode(mosi_pin, PIN_MODE_INPUT);
+ }
+ else
+ {
+ rt_pin_mode(mosi_pin, PIN_MODE_OUTPUT);
+ }
+}
+
+/**
+ * This function sets the miso pin direction (input/output).
+ *
+ * @param hpm config class.
+ * @param state: 1 for input, 0 for output.
+ */
+static void hpm_dir_miso(void *data, rt_int32_t state)
+{
+ struct hpm_soft_spi_config* cfg = (struct hpm_soft_spi_config*)data;
+ rt_base_t miso_pin = rt_pin_get(cfg->miso_pin_name);
+ if (state)
+ {
+ rt_pin_mode(miso_pin, PIN_MODE_INPUT);
+ }
+ else
+ {
+ rt_pin_mode(miso_pin, PIN_MODE_OUTPUT);
+ }
+}
+
+/**
+ * This function provides microsecond delay.
+ *
+ * @param us: microseconds to delay.
+ */
+static void hpm_spi_udelay(rt_uint32_t us)
+{
+ rt_hw_us_delay(us);
+}
+
+static const struct rt_spi_bit_ops hpm_bit_ops_default =
+{
+ .data = RT_NULL,
+ .pin_init = hpm_spi_pin_init,
+ .tog_sclk = hpm_tog_sck,
+ .set_sclk = hpm_set_sck,
+ .set_mosi = hpm_set_mosi,
+ .set_miso = hpm_set_miso,
+ .get_sclk = hpm_get_sck,
+ .get_mosi = hpm_get_mosi,
+ .get_miso = hpm_get_miso,
+ .dir_mosi = hpm_dir_mosi,
+ .dir_miso = hpm_dir_miso,
+ .udelay = hpm_spi_udelay,
+ .delay_us = BSP_USING_SOFT_SPI_TIMING_DELAY_US,
+};
+
+/**
+ * Attach the spi device to soft SPI bus, this function must be used after initialization.
+ *
+ * @param bus_name: soft spi bus name.
+ * @param device_name: spi device name.
+ * @param pin_name: chip select pin name.
+ *
+ * @return RT_EOK indicates successful attachment.
+ */
+rt_err_t rt_hw_soft_spi_device_attach(const char *bus_name, const char *device_name, const char *pin_name)
+{
+ rt_err_t result;
+ struct rt_spi_device *spi_device;
+
+ /* initialize the cs pin && select the slave */
+ rt_base_t cs_pin = rt_pin_get(pin_name);
+ rt_pin_mode(cs_pin, PIN_MODE_OUTPUT);
+ rt_pin_write(cs_pin, PIN_HIGH);
+
+ /* attach the device to soft spi bus */
+ spi_device = (struct rt_spi_device *)rt_malloc(sizeof(struct rt_spi_device));
+ RT_ASSERT(spi_device != RT_NULL);
+
+ result = rt_spi_bus_attach_device(spi_device, device_name, bus_name, (void *)cs_pin);
+
+ if (result == RT_EOK)
+ {
+ LOG_D("soft spi device %s attach to %s success (cs_pin: %s)",
+ device_name, bus_name, pin_name);
+ }
+ else
+ {
+ LOG_E("soft spi device %s attach to %s failed", device_name, bus_name);
+ }
+
+ return result;
+}
+
+/* SPI initialization function */
+int rt_software_spi_init(void)
+{
+ rt_err_t result = RT_EOK;
+
+ for (rt_size_t i = 0; i < SOFT_SPI_PTRS_NUM; i++)
+ {
+ if ((soft_spi_configs[i].sck_pin_name == RT_NULL)
+ || (soft_spi_configs[i].mosi_pin_name == RT_NULL) || (soft_spi_configs[i].miso_pin_name == RT_NULL))
+ {
+ LOG_E("soft spi%d pin config error!", i);
+ result = -RT_ERROR;
+ continue;
+ }
+ if ((rt_strcmp(soft_spi_configs[i].sck_pin_name, "None") == 0)
+ || (rt_strcmp(soft_spi_configs[i].mosi_pin_name, "None") == 0)
+ || (rt_strcmp(soft_spi_configs[i].miso_pin_name, "None") == 0))
+ {
+ LOG_E("soft spi%d pin name is None, please check!", i);
+ result = -RT_ERROR;
+ continue;
+ }
+ /* copy default ops into instance, set private data, and register bit-banged bus */
+ rt_memcpy(&spi_obj[i].ops, &hpm_bit_ops_default, sizeof(struct rt_spi_bit_ops));
+ spi_obj[i].ops.data = (void*)&soft_spi_configs[i];
+ /* point bus.ops to our instance ops */
+ spi_obj[i].spi.ops = &spi_obj[i].ops;
+ spi_obj[i].cfg = (void *)&soft_spi_configs[i];
+ /* initialize gpio for this instance */
+ hpm_spi_gpio_init(&spi_obj[i]);
+ result = rt_spi_bit_add_bus(&spi_obj[i].spi, soft_spi_configs[i].bus_name, &spi_obj[i].ops);
+ RT_ASSERT(result == RT_EOK);
+
+ LOG_D("software simulation %s init done, pin sck: %s, pin mosi: %s, pin miso: %s",
+ soft_spi_configs[i].bus_name,
+ soft_spi_configs[i].sck_pin_name,
+ soft_spi_configs[i].mosi_pin_name,
+ soft_spi_configs[i].miso_pin_name);
+ }
+
+ return result;
+}
+INIT_BOARD_EXPORT(rt_software_spi_init);
+
+#endif /* BSP_USING_SOFT_SPI */
diff --git a/bsp/hpmicro/libraries/drivers/drv_soft_spi.h b/bsp/hpmicro/libraries/drivers/drv_soft_spi.h
new file mode 100644
index 000000000000..21c56bcd874e
--- /dev/null
+++ b/bsp/hpmicro/libraries/drivers/drv_soft_spi.h
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef __DRV_SOFT_SPI__
+#define __DRV_SOFT_SPI__
+
+#include
+#ifdef BSP_USING_SOFT_SPI
+#include
+#include
+/* rt_spi_bit_ops is defined in dev_spi_bit_ops.h */
+#include
+
+/* HPM config class */
+struct hpm_soft_spi_config
+{
+ const char *sck_pin_name;
+ const char *mosi_pin_name;
+ const char *miso_pin_name;
+ const char *bus_name;
+};
+
+/* HPM spi driver class */
+struct hpm_soft_spi
+{
+ struct rt_spi_bit_obj spi; /* bit-banged spi object (contains rt_spi_bus inside) */
+ struct rt_spi_bit_ops ops; /* local copy of bit ops */
+ void *cfg; /* pointer to hpm_soft_spi_config */
+};
+
+int rt_hw_spi_init(void);
+rt_err_t rt_hw_soft_spi_device_attach(const char *bus_name, const char *device_name, const char *pin_name);
+#endif /* BSP_USING_SOFT_SPI */
+
+#endif /* __DRV_SOFT_SPI__ */
diff --git a/bsp/hpmicro/libraries/drivers/drv_spi.c b/bsp/hpmicro/libraries/drivers/drv_spi.c
index bfdfd2627619..5b5ece2a21d9 100644
--- a/bsp/hpmicro/libraries/drivers/drv_spi.c
+++ b/bsp/hpmicro/libraries/drivers/drv_spi.c
@@ -31,6 +31,7 @@
#define DBG_LVL DBG_INFO
#include
+/* Set default IO mode to SINGLE_IO if not specified */
#if defined(BSP_USING_SPI0)
#ifndef BSP_SPI0_USING_QUAD_IO
#ifndef BSP_SPI0_USING_DUAL_IO
@@ -146,279 +147,271 @@ typedef struct {
static rt_err_t hpm_spi_configure(struct rt_spi_device *device, struct rt_spi_configuration *cfg);
static rt_ssize_t hpm_spi_xfer(struct rt_spi_device *device, struct rt_spi_message *msg);
-static struct hpm_spi hpm_spis[] =
-{
-#if defined(BSP_USING_SPI0)
- {
+/* Macros to reduce repetitive SPI configuration code */
+#define HPM_SPI_BUS_NAME_MODE(idx) HPM_SPI_BUS_NAME_MODE_##idx
+#define HPM_SPI_IO_MODE(idx) HPM_SPI_IO_MODE_##idx
+
+/* Bus name based on IO mode */
#if defined(BSP_SPI0_USING_SINGLE_IO)
- .bus_name = "spi0",
- .spi_io_mode = spi_single_io_mode,
-#endif
-#if defined(BSP_SPI0_USING_DUAL_IO)
- .bus_name = "dspi0",
- .spi_io_mode = spi_dual_io_mode,
-#endif
-#if defined(BSP_SPI0_USING_QUAD_IO)
- .bus_name = "qspi0",
- .spi_io_mode = spi_quad_io_mode,
+#define HPM_SPI_BUS_NAME_MODE_0 .bus_name = "spi0", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI0_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_0 .bus_name = "dspi0", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI0_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_0 .bus_name = "qspi0", .spi_io_mode = spi_quad_io_mode,
#endif
- .spi_base = HPM_SPI0,
- .clk_name = clock_spi0,
-#if defined(BSP_SPI0_USING_DMA)
- .enable_dma = RT_TRUE,
-#endif
- .tx_dmamux = HPM_DMA_SRC_SPI0_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI0_RX,
- .spi_irq = IRQn_SPI0,
-#if defined(BSP_SPI0_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI0_IRQ_PRIORITY,
-#else
- .spi_irq_priority = 1,
-#endif
-#if !defined BSP_SPI0_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
-#else
- .spi_pins_init = init_spi_pins,
+
+#if defined(BSP_SPI1_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_1 .bus_name = "spi1", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI1_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_1 .bus_name = "dspi1", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI1_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_1 .bus_name = "qspi1", .spi_io_mode = spi_quad_io_mode,
+#endif
+
+#if defined(BSP_SPI2_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_2 .bus_name = "spi2", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI2_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_2 .bus_name = "dspi2", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI2_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_2 .bus_name = "qspi2", .spi_io_mode = spi_quad_io_mode,
#endif
- },
+
+#if defined(BSP_SPI3_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_3 .bus_name = "spi3", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI3_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_3 .bus_name = "dspi3", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI3_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_3 .bus_name = "qspi3", .spi_io_mode = spi_quad_io_mode,
#endif
-#if defined(BSP_USING_SPI1)
- {
-#if defined(BSP_SPI1_USING_SINGLE_IO)
- .bus_name = "spi1",
- .spi_io_mode = spi_single_io_mode,
+
+#if defined(BSP_SPI4_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_4 .bus_name = "spi4", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI4_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_4 .bus_name = "dspi4", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI4_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_4 .bus_name = "qspi4", .spi_io_mode = spi_quad_io_mode,
#endif
-#if defined(BSP_SPI1_USING_DUAL_IO)
- .bus_name = "dspi1",
- .spi_io_mode = spi_dual_io_mode,
+
+#if defined(BSP_SPI5_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_5 .bus_name = "spi5", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI5_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_5 .bus_name = "dspi5", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI5_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_5 .bus_name = "qspi5", .spi_io_mode = spi_quad_io_mode,
#endif
-#if defined(BSP_SPI1_USING_QUAD_IO)
- .bus_name = "qspi1",
- .spi_io_mode = spi_quad_io_mode,
+
+#if defined(BSP_SPI6_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_6 .bus_name = "spi6", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI6_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_6 .bus_name = "dspi6", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI6_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_6 .bus_name = "qspi6", .spi_io_mode = spi_quad_io_mode,
#endif
- .spi_base = HPM_SPI1,
- .clk_name = clock_spi1,
-#if defined(BSP_SPI1_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_SPI7_USING_SINGLE_IO)
+#define HPM_SPI_BUS_NAME_MODE_7 .bus_name = "spi7", .spi_io_mode = spi_single_io_mode,
+#elif defined(BSP_SPI7_USING_DUAL_IO)
+#define HPM_SPI_BUS_NAME_MODE_7 .bus_name = "dspi7", .spi_io_mode = spi_dual_io_mode,
+#elif defined(BSP_SPI7_USING_QUAD_IO)
+#define HPM_SPI_BUS_NAME_MODE_7 .bus_name = "qspi7", .spi_io_mode = spi_quad_io_mode,
#endif
- .tx_dmamux = HPM_DMA_SRC_SPI1_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI1_RX,
- .spi_irq = IRQn_SPI1,
-#if defined(BSP_SPI1_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI1_IRQ_PRIORITY,
+
+/* DMA configuration per instance */
+#if defined(BSP_SPI0_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_0 .enable_dma = RT_TRUE,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_DMA_CONFIG_0
#endif
-#if !defined BSP_SPI1_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if defined(BSP_SPI1_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_1 .enable_dma = RT_TRUE,
#else
- .spi_pins_init = init_spi_pins,
-#endif
- },
-#endif
-#if defined(BSP_USING_SPI2)
- {
-#if defined(BSP_SPI2_USING_SINGLE_IO)
- .bus_name = "spi2",
- .spi_io_mode = spi_single_io_mode,
-#endif
-#if defined(BSP_SPI2_USING_DUAL_IO)
- .bus_name = "dspi2",
- .spi_io_mode = spi_dual_io_mode,
+#define HPM_SPI_DMA_CONFIG_1
#endif
-#if defined(BSP_SPI2_USING_QUAD_IO)
- .bus_name = "qspi2",
- .spi_io_mode = spi_quad_io_mode,
-#endif
- .spi_base = HPM_SPI2,
- .clk_name = clock_spi2,
+
#if defined(BSP_SPI2_USING_DMA)
- .enable_dma = RT_TRUE,
-#endif
- .tx_dmamux = HPM_DMA_SRC_SPI2_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI2_RX,
- .spi_irq = IRQn_SPI2,
-#if defined(BSP_SPI2_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI2_IRQ_PRIORITY,
+#define HPM_SPI_DMA_CONFIG_2 .enable_dma = RT_TRUE,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_DMA_CONFIG_2
#endif
-#if !defined BSP_SPI2_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if defined(BSP_SPI3_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_3 .enable_dma = RT_TRUE,
#else
- .spi_pins_init = init_spi_pins,
-#endif
- },
+#define HPM_SPI_DMA_CONFIG_3
#endif
-#if defined(BSP_USING_SPI3)
- {
-#if defined(BSP_SPI3_USING_SINGLE_IO)
- .bus_name = "spi3",
- .spi_io_mode = spi_single_io_mode,
-#endif
-#if defined(BSP_SPI3_USING_DUAL_IO)
- .bus_name = "dspi3",
- .spi_io_mode = spi_dual_io_mode,
-#endif
-#if defined(BSP_SPI3_USING_QUAD_IO)
- .bus_name = "qspi3",
- .spi_io_mode = spi_quad_io_mode,
-#endif
- .spi_base = HPM_SPI3,
- .clk_name = clock_spi3,
-#if defined(BSP_SPI3_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_SPI4_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_4 .enable_dma = RT_TRUE,
+#else
+#define HPM_SPI_DMA_CONFIG_4
#endif
- .tx_dmamux = HPM_DMA_SRC_SPI3_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI3_RX,
- .spi_irq = IRQn_SPI3,
-#if defined(BSP_SPI3_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI3_IRQ_PRIORITY,
+
+#if defined(BSP_SPI5_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_5 .enable_dma = RT_TRUE,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_DMA_CONFIG_5
#endif
-#if !defined BSP_SPI3_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if defined(BSP_SPI6_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_6 .enable_dma = RT_TRUE,
#else
- .spi_pins_init = init_spi_pins,
+#define HPM_SPI_DMA_CONFIG_6
#endif
- },
+
+#if defined(BSP_SPI7_USING_DMA)
+#define HPM_SPI_DMA_CONFIG_7 .enable_dma = RT_TRUE,
+#else
+#define HPM_SPI_DMA_CONFIG_7
#endif
-#if defined(BSP_USING_SPI4)
- {
-#if defined(BSP_SPI4_USING_SINGLE_IO)
- .bus_name = "spi4",
- .spi_io_mode = spi_single_io_mode,
+
+/* IRQ priority configuration per instance */
+#if defined(BSP_SPI0_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_0 .spi_irq_priority = BSP_SPI0_IRQ_PRIORITY,
+#else
+#define HPM_SPI_IRQ_PRIORITY_0 .spi_irq_priority = 1,
#endif
-#if defined(BSP_SPI4_USING_DUAL_IO)
- .bus_name = "dspi4",
- .spi_io_mode = spi_dual_io_mode,
+
+#if defined(BSP_SPI1_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_1 .spi_irq_priority = BSP_SPI1_IRQ_PRIORITY,
+#else
+#define HPM_SPI_IRQ_PRIORITY_1 .spi_irq_priority = 1,
#endif
-#if defined(BSP_SPI4_USING_QUAD_IO)
- .bus_name = "qspi4",
- .spi_io_mode = spi_quad_io_mode,
+
+#if defined(BSP_SPI2_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_2 .spi_irq_priority = BSP_SPI2_IRQ_PRIORITY,
+#else
+#define HPM_SPI_IRQ_PRIORITY_2 .spi_irq_priority = 1,
#endif
- .spi_base = HPM_SPI4,
- .clk_name = clock_spi4,
-#if defined(BSP_SPI4_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if defined(BSP_SPI3_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_3 .spi_irq_priority = BSP_SPI3_IRQ_PRIORITY,
+#else
+#define HPM_SPI_IRQ_PRIORITY_3 .spi_irq_priority = 1,
#endif
- .tx_dmamux = HPM_DMA_SRC_SPI4_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI4_RX,
- .spi_irq = IRQn_SPI4,
+
#if defined(BSP_SPI4_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI4_IRQ_PRIORITY,
+#define HPM_SPI_IRQ_PRIORITY_4 .spi_irq_priority = BSP_SPI4_IRQ_PRIORITY,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_IRQ_PRIORITY_4 .spi_irq_priority = 1,
#endif
-#if !defined BSP_SPI4_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if defined(BSP_SPI5_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_5 .spi_irq_priority = BSP_SPI5_IRQ_PRIORITY,
#else
- .spi_pins_init = init_spi_pins,
-#endif
- },
-#endif
-#if defined(BSP_USING_SPI5)
- {
-#if defined(BSP_SPI5_USING_SINGLE_IO)
- .bus_name = "spi5",
- .spi_io_mode = spi_single_io_mode,
+#define HPM_SPI_IRQ_PRIORITY_5 .spi_irq_priority = 1,
#endif
-#if defined(BSP_SPI5_USING_DUAL_IO)
- .bus_name = "dspi5",
- .spi_io_mode = spi_dual_io_mode,
-#endif
-#if defined(BSP_SPI5_USING_QUAD_IO)
- .bus_name = "qspi5",
- .spi_io_mode = spi_quad_io_mode,
-#endif
- .spi_base = HPM_SPI5,
- .clk_name = clock_spi5,
-#if defined(BSP_SPI5_USING_DMA)
- .enable_dma = RT_TRUE,
-#endif
- .tx_dmamux = HPM_DMA_SRC_SPI5_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI5_RX,
- .spi_irq = IRQn_SPI5,
-#if defined(BSP_SPI5_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI5_IRQ_PRIORITY,
+
+#if defined(BSP_SPI6_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_6 .spi_irq_priority = BSP_SPI6_IRQ_PRIORITY,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_IRQ_PRIORITY_6 .spi_irq_priority = 1,
#endif
-#if !defined BSP_SPI5_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if defined(BSP_SPI7_IRQ_PRIORITY)
+#define HPM_SPI_IRQ_PRIORITY_7 .spi_irq_priority = BSP_SPI7_IRQ_PRIORITY,
#else
- .spi_pins_init = init_spi_pins,
+#define HPM_SPI_IRQ_PRIORITY_7 .spi_irq_priority = 1,
#endif
- },
+
+/* CS pin init configuration per instance */
+#if !defined(BSP_SPI0_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_0 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_0 .spi_pins_init = init_spi_pins,
#endif
-#if defined(BSP_USING_SPI6)
- {
-#if defined(BSP_SPI6_USING_SINGLE_IO)
- .bus_name = "spi6",
- .spi_io_mode = spi_single_io_mode,
+
+#if !defined(BSP_SPI1_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_1 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_1 .spi_pins_init = init_spi_pins,
#endif
-#if defined(BSP_SPI6_USING_DUAL_IO)
- .bus_name = "dspi6",
- .spi_io_mode = spi_dual_io_mode,
+
+#if !defined(BSP_SPI2_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_2 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_2 .spi_pins_init = init_spi_pins,
#endif
-#if defined(BSP_SPI6_USING_QUAD_IO)
- .bus_name = "qspi6",
- .spi_io_mode = spi_quad_io_mode,
+
+#if !defined(BSP_SPI3_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_3 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_3 .spi_pins_init = init_spi_pins,
#endif
- .spi_base = HPM_SPI6,
- .clk_name = clock_spi6,
-#if defined(BSP_SPI6_USING_DMA)
- .enable_dma = RT_TRUE,
+
+#if !defined(BSP_SPI4_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_4 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_4 .spi_pins_init = init_spi_pins,
#endif
- .tx_dmamux = HPM_DMA_SRC_SPI6_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI6_RX,
- .spi_irq = IRQn_SPI6,
-#if defined(BSP_SPI6_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI6_IRQ_PRIORITY,
+
+#if !defined(BSP_SPI5_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_5 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
#else
- .spi_irq_priority = 1,
+#define HPM_SPI_PINS_INIT_5 .spi_pins_init = init_spi_pins,
#endif
-#if !defined BSP_SPI6_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+
+#if !defined(BSP_SPI6_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_6 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
#else
- .spi_pins_init = init_spi_pins,
+#define HPM_SPI_PINS_INIT_6 .spi_pins_init = init_spi_pins,
#endif
- },
+
+#if !defined(BSP_SPI7_USING_HARD_CS)
+#define HPM_SPI_PINS_INIT_7 .spi_pins_init = init_spi_pins_with_gpio_as_cs,
+#else
+#define HPM_SPI_PINS_INIT_7 .spi_pins_init = init_spi_pins,
+#endif
+
+/* Main SPI configuration macro */
+#define HPM_SPI_CONFIG(idx) \
+ { \
+ HPM_SPI_BUS_NAME_MODE_##idx \
+ .spi_base = HPM_SPI##idx, \
+ .clk_name = clock_spi##idx, \
+ HPM_SPI_DMA_CONFIG_##idx \
+ .tx_dmamux = HPM_DMA_SRC_SPI##idx##_TX, \
+ .rx_dmamux = HPM_DMA_SRC_SPI##idx##_RX, \
+ .spi_irq = IRQn_SPI##idx, \
+ HPM_SPI_IRQ_PRIORITY_##idx \
+ HPM_SPI_PINS_INIT_##idx \
+ }
+
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+/* Macro for ISR handler declaration and implementation */
+#define HPM_SPI_ISR_HANDLER(idx) \
+ SDK_DECLARE_EXT_ISR_M(IRQn_SPI##idx, spi##idx##_isr); \
+ void spi##idx##_isr(void) \
+ { \
+ handle_spi_isr(HPM_SPI##idx); \
+ }
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+static struct hpm_spi hpm_spis[] =
+{
+#if defined(BSP_USING_SPI0)
+ HPM_SPI_CONFIG(0),
#endif
-#if defined(BSP_USING_SPI7)
- {
-#if defined(BSP_SPI7_USING_SINGLE_IO)
- .bus_name = "spi7",
- .spi_io_mode = spi_single_io_mode,
+#if defined(BSP_USING_SPI1)
+ HPM_SPI_CONFIG(1),
#endif
-#if defined(BSP_SPI7_USING_DUAL_IO)
- .bus_name = "dspi7",
- .spi_io_mode = spi_dual_io_mode,
+#if defined(BSP_USING_SPI2)
+ HPM_SPI_CONFIG(2),
#endif
-#if defined(BSP_SPI7_USING_QUAD_IO)
- .bus_name = "qspi7",
- .spi_io_mode = spi_quad_io_mode,
+#if defined(BSP_USING_SPI3)
+ HPM_SPI_CONFIG(3),
#endif
- .spi_base = HPM_SPI7,
- .clk_name = clock_spi7,
-#if defined(BSP_SPI7_USING_DMA)
- .enable_dma = RT_TRUE,
+#if defined(BSP_USING_SPI4)
+ HPM_SPI_CONFIG(4),
#endif
- .tx_dmamux = HPM_DMA_SRC_SPI7_TX,
- .rx_dmamux = HPM_DMA_SRC_SPI7_RX,
- .spi_irq = IRQn_SPI7,
-#if defined(BSP_SPI7_IRQ_PRIORITY)
- .spi_irq_priority = BSP_SPI7_IRQ_PRIORITY,
-#else
- .spi_irq_priority = 1,
+#if defined(BSP_USING_SPI5)
+ HPM_SPI_CONFIG(5),
#endif
-#if !defined BSP_SPI7_USING_HARD_CS
- .spi_pins_init = init_spi_pins_with_gpio_as_cs,
-#else
- .spi_pins_init = init_spi_pins,
+#if defined(BSP_USING_SPI6)
+ HPM_SPI_CONFIG(6),
#endif
- },
+#if defined(BSP_USING_SPI7)
+ HPM_SPI_CONFIG(7),
#endif
};
static struct rt_spi_ops hpm_spi_ops =
@@ -427,7 +420,11 @@ static struct rt_spi_ops hpm_spi_ops =
.xfer = hpm_spi_xfer,
};
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static inline void handle_spi_isr(SPI_Type *ptr)
+#else
+static inline void handle_spi_isr(int vector, SPI_Type *ptr)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
volatile uint32_t irq_status;
RT_ASSERT(ptr != RT_NULL);
@@ -449,69 +446,39 @@ static inline void handle_spi_isr(SPI_Type *ptr)
rt_hw_interrupt_enable(level);
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
#if defined(BSP_USING_SPI0)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI0, spi0_isr);
-void spi0_isr(void)
-{
- handle_spi_isr(HPM_SPI0);
-}
+HPM_SPI_ISR_HANDLER(0)
#endif
#if defined(BSP_USING_SPI1)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI1, spi1_isr);
-void spi1_isr(void)
-{
- handle_spi_isr(HPM_SPI1);
-}
+HPM_SPI_ISR_HANDLER(1)
#endif
#if defined(BSP_USING_SPI2)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI2, spi2_isr);
-void spi2_isr(void)
-{
- handle_spi_isr(HPM_SPI2);
-}
+HPM_SPI_ISR_HANDLER(2)
#endif
#if defined(BSP_USING_SPI3)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI3, spi3_isr);
-void spi3_isr(void)
-{
- handle_spi_isr(HPM_SPI3);
-}
+HPM_SPI_ISR_HANDLER(3)
#endif
#if defined(BSP_USING_SPI4)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI4, spi4_isr);
-void spi4_isr(void)
-{
- handle_spi_isr(HPM_SPI4);
-}
+HPM_SPI_ISR_HANDLER(4)
#endif
#if defined(BSP_USING_SPI5)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI5, spi5_isr);
-void spi5_isr(void)
-{
- handle_spi_isr(HPM_SPI5);
-}
+HPM_SPI_ISR_HANDLER(5)
#endif
#if defined(BSP_USING_SPI6)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI6, spi6_isr);
-void spi6_isr(void)
-{
- handle_spi_isr(HPM_SPI6);
-}
+HPM_SPI_ISR_HANDLER(6)
#endif
#if defined(BSP_USING_SPI7)
-SDK_DECLARE_EXT_ISR_M(IRQn_SPI7, spi7_isr);
-void spi7_isr(void)
-{
- handle_spi_isr(HPM_SPI7);
-}
+HPM_SPI_ISR_HANDLER(7)
#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
void spi_dma_channel_tc_callback(DMA_Type *ptr, uint32_t channel, void *user_data)
{
@@ -538,14 +505,20 @@ static rt_err_t hpm_spi_configure(struct rt_spi_device *device, struct rt_spi_co
spi_timing_config_t timing_config = { 0 };
spi_format_config_t format_config = { 0 };
struct hpm_spi *spi = RT_NULL;
+ struct rt_spi_configuration *spi_cfg = RT_NULL;
hpm_stat_t stat = status_success;
spi = (struct hpm_spi *)(device->bus->parent.user_data);
RT_ASSERT(spi != RT_NULL);
+#ifdef RT_USING_QSPI
+ struct rt_qspi_device *qspi_dev = (struct rt_qspi_device *)device;
+ spi_cfg = (struct rt_spi_configuration *)&qspi_dev->config.parent;
+ RT_ASSERT((spi_cfg->data_width > 0) && (spi_cfg->data_width <= 32));
+#else
/* hpm spi data width support 1 ~ 32 */
RT_ASSERT((cfg->data_width > 0) && (cfg->data_width <= 32));
-
+ spi_cfg = cfg;
+#endif
spi->spi_pins_init(spi->spi_base);
- struct rt_spi_configuration *spi_cfg = cfg;
if (spi_cfg->mode & RT_SPI_SLAVE) {
spi_slave_get_default_format_config(&format_config);
@@ -571,11 +544,11 @@ static rt_err_t hpm_spi_configure(struct rt_spi_device *device, struct rt_spi_co
}
}
- format_config.common_config.data_len_in_bits = cfg->data_width;
- format_config.common_config.cpha = (cfg->mode & RT_SPI_CPHA) ? spi_sclk_sampling_even_clk_edges : spi_sclk_sampling_odd_clk_edges;
- format_config.common_config.cpol = (cfg->mode & RT_SPI_CPOL) ? spi_sclk_high_idle : spi_sclk_low_idle;
- format_config.common_config.lsb = (cfg->mode & RT_SPI_MSB) ? false : true;
- format_config.common_config.mosi_bidir = cfg->mode & RT_SPI_3WIRE ? true : false;
+ format_config.common_config.data_len_in_bits = spi_cfg->data_width;
+ format_config.common_config.cpha = (spi_cfg->mode & RT_SPI_CPHA) ? spi_sclk_sampling_even_clk_edges : spi_sclk_sampling_odd_clk_edges;
+ format_config.common_config.cpol = (spi_cfg->mode & RT_SPI_CPOL) ? spi_sclk_high_idle : spi_sclk_low_idle;
+ format_config.common_config.lsb = (spi_cfg->mode & RT_SPI_MSB) ? false : true;
+ format_config.common_config.mosi_bidir = spi_cfg->mode & RT_SPI_3WIRE ? true : false;
spi_format_init(spi->spi_base, &format_config);
@@ -642,47 +615,59 @@ static rt_err_t hpm_spi_check_params(struct rt_spi_device *device, struct rt_spi
return -RT_EINVAL;
}
- if (qspi_cfg->qspi_dl_width != 0) {
- switch (qspi_cfg->qspi_dl_width)
+ if (qspi_msg->qspi_data_lines != 0) {
+ if ((qspi_msg->qspi_data_lines != 1) && (qspi_msg->qspi_data_lines != 2) && (qspi_msg->qspi_data_lines != 4)) {
+ LOG_E("dspi/qspi only support data phase qspi lines 1/2/4 for master\n");
+ return -RT_EINVAL;
+ }
+ if ((qspi_cfg->qspi_dl_width != 0) && (qspi_msg->qspi_data_lines > qspi_cfg->qspi_dl_width)) {
+ LOG_E("msg data_lines must not exceed qspi_dl_width, qspi_dl_width=%d, data_lines=%d\n",
+ qspi_cfg->qspi_dl_width, qspi_msg->qspi_data_lines);
+ return -RT_EINVAL;
+ }
+ }
+
+ if ((qspi_cfg->qspi_dl_width != 0) && (qspi_msg->address.qspi_lines > qspi_cfg->qspi_dl_width)) {
+ LOG_E("msg address_lines must not exceed qspi_dl_width, qspi_dl_width=%d, address_lines=%d\n",
+ qspi_cfg->qspi_dl_width, qspi_msg->address.qspi_lines);
+ return -RT_EINVAL;
+ }
+
+ if (qspi_msg->dummy_cycles != 0) {
+ switch (qspi_msg->qspi_data_lines)
{
case 1:
- if (qspi_msg->dummy_cycles != 0) {
- if ((qspi_msg->dummy_cycles > (4 * 8))) {
- LOG_E("spi only support dummy phase cycles < 32 for master\n");
- return -RT_EINVAL;
- }
- if ((qspi_msg->dummy_cycles != 0) && (qspi_msg->dummy_cycles % 8)) {
- LOG_E("The number of cycles should be an integer multiple of 8 for spi master\n");
- return -RT_EINVAL;
- }
+ if ((qspi_msg->dummy_cycles > (4 * 8))) {
+ LOG_E("spi only support dummy phase cycles < 32 for master\n");
+ return -RT_EINVAL;
+ }
+ if (qspi_msg->dummy_cycles % 8) {
+ LOG_E("The number of cycles should be an integer multiple of 8 for spi master\n");
+ return -RT_EINVAL;
}
break;
case 2:
- if (qspi_msg->dummy_cycles != 0) {
- if (qspi_msg->dummy_cycles > (4 * 4)) {
- LOG_E("dspi only support dummy phase cycles < 16 for master\n");
- return -RT_EINVAL;
- }
- if (qspi_msg->dummy_cycles % 4) {
- LOG_E("The number of cycles should be an integer multiple of 4 for spi master\n");
- return -RT_EINVAL;
- }
+ if (qspi_msg->dummy_cycles > (4 * 4)) {
+ LOG_E("dspi only support dummy phase cycles < 16 for master\n");
+ return -RT_EINVAL;
+ }
+ if (qspi_msg->dummy_cycles % 4) {
+ LOG_E("The number of cycles should be an integer multiple of 4 for spi master\n");
+ return -RT_EINVAL;
}
break;
case 4:
- if (qspi_msg->dummy_cycles != 0) {
- if (qspi_msg->dummy_cycles > (4 * 2)) {
- LOG_E("qspi only support dummy phase cycles < 8 for master\n");
- return -RT_EINVAL;
- }
- if (qspi_msg->dummy_cycles % 2) {
- LOG_E("The number of cycles should be an integer multiple of 2 for spi master\n");
- return -RT_EINVAL;
- }
+ if (qspi_msg->dummy_cycles > (4 * 2)) {
+ LOG_E("qspi only support dummy phase cycles < 8 for master\n");
+ return -RT_EINVAL;
+ }
+ if (qspi_msg->dummy_cycles % 2) {
+ LOG_E("The number of cycles should be an integer multiple of 2 for spi master\n");
+ return -RT_EINVAL;
}
break;
default:
- LOG_E("spi only support data phase qspi lines 1/2/4 for master\n");
+ LOG_E("dummy phase requires data phase qspi lines 1/2/4 for master\n");
return -RT_EINVAL;
}
}
@@ -699,8 +684,6 @@ bool hpm_qspi_parse_phase_message(struct rt_spi_device *device, struct rt_qspi_m
struct hpm_spi *spi = (struct hpm_spi *)(device->bus->parent.user_data);
#ifdef RT_USING_QSPI
struct rt_qspi_message *qspi_msg = (struct rt_qspi_message *)msg;
- struct rt_qspi_device *qspi_dev = (struct rt_qspi_device *)device;
- struct rt_qspi_configuration *qspi_cfg = (struct rt_qspi_configuration *)&qspi_dev->config;
if ((device->bus->mode == RT_SPI_BUS_MODE_QSPI) && ((device->config.mode & RT_SPI_MASTER) == RT_SPI_MASTER)) {
if (msg->instruction.qspi_lines == 1) {
(*cmd) = msg->instruction.content;
@@ -784,32 +767,19 @@ bool hpm_qspi_parse_phase_message(struct rt_spi_device *device, struct rt_qspi_m
break;
}
}
- if (qspi_cfg->qspi_dl_width == 1) {
- if (msg->qspi_data_lines == 1) {
- spi->control_config.common_config.data_phase_fmt = spi_single_io_mode;
- } else {
- LOG_E("msg data_lines must be 1 when qspi_dl_width is 1, but msg data_lines is %d\n", msg->qspi_data_lines);
- }
- } else if (qspi_cfg->qspi_dl_width == 2) {
- if (msg->qspi_data_lines == 1) {
- spi->control_config.common_config.data_phase_fmt = spi_dual_io_mode;
- } else if (msg->qspi_data_lines == 2) {
- spi->control_config.common_config.data_phase_fmt = spi_quad_io_mode;
- } else {
- LOG_E("msg data_lines must be 1 or 2 when qspi_dl_width is 2, but msg data_lines is %d\n", msg->qspi_data_lines);
- }
- } else if (qspi_cfg->qspi_dl_width == 4) {
- if (msg->qspi_data_lines == 1) {
- spi->control_config.common_config.data_phase_fmt = spi_single_io_mode;
- } else if (msg->qspi_data_lines == 2) {
- spi->control_config.common_config.data_phase_fmt = spi_dual_io_mode;
- } else if (msg->qspi_data_lines == 4) {
- spi->control_config.common_config.data_phase_fmt = spi_quad_io_mode;
- } else {
- spi->control_config.common_config.data_phase_fmt = spi_single_io_mode;
- }
- } else {
- spi->control_config.common_config.data_phase_fmt = spi_single_io_mode;
+ switch (qspi_msg->qspi_data_lines) {
+ case 1:
+ control_config->common_config.data_phase_fmt = spi_single_io_mode;
+ break;
+ case 2:
+ control_config->common_config.data_phase_fmt = spi_dual_io_mode;
+ break;
+ case 4:
+ control_config->common_config.data_phase_fmt = spi_quad_io_mode;
+ break;
+ default:
+ control_config->common_config.data_phase_fmt = spi_single_io_mode;
+ break;
}
}
#endif
@@ -858,6 +828,7 @@ static rt_ssize_t hpm_spi_xfer_polling(struct rt_spi_device *device, struct rt_s
hpm_stat_t spi_stat = status_success;
struct rt_spi_message *_msg = (struct rt_spi_message *)msg;
struct rt_spi_message *spi_msg = (struct rt_spi_message *)_msg;
+ uint8_t data_len_in_bytes = spi_get_data_length_in_bytes(spi->spi_base);
#ifdef RT_USING_QSPI
struct rt_qspi_message *qspi_msg = RT_NULL;
#endif
@@ -888,16 +859,16 @@ static rt_ssize_t hpm_spi_xfer_polling(struct rt_spi_device *device, struct rt_s
if (hpm_spi_check_params(device, _msg) != RT_EOK) {
return -RT_EINVAL;
}
+ remaining_size = _msg->length;
#ifdef RT_USING_QSPI
qspi_msg = (struct rt_qspi_message *)_msg;
need_dummy = hpm_qspi_parse_phase_message(device, qspi_msg, &spi->control_config, &cmd, &addr);
- remaining_size = _msg->length;
if (remaining_size == 0) {
actual_len = hpm_spi_send_no_data(spi->spi_base, &spi->control_config, &cmd, &addr, qspi_msg);
}
#endif
while (remaining_size > 0) {
- transfer_len = MIN(SPI_SOC_TRANSFER_COUNT_MAX, remaining_size);
+ transfer_len = MIN(SPI_SOC_TRANSFER_COUNT_MAX * data_len_in_bytes, remaining_size);
/* Next sub-packet: Disable CMD and ADDR phase for the following packet */
if (index > 0) {
spi->control_config.master_config.cmd_enable = RT_FALSE;
@@ -905,7 +876,7 @@ static rt_ssize_t hpm_spi_xfer_polling(struct rt_spi_device *device, struct rt_s
}
if ((_msg->send_buf != NULL) && (_msg->recv_buf != NULL)) {
spi->control_config.common_config.trans_mode = spi_trans_write_read_together;
- spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, tx_buf, transfer_len, rx_buf, transfer_len);
+ spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, tx_buf, transfer_len / data_len_in_bytes, rx_buf, transfer_len / data_len_in_bytes);
}
else if (_msg->send_buf != NULL) {
if ((need_dummy == RT_TRUE) && (index == 0)) {
@@ -913,7 +884,7 @@ static rt_ssize_t hpm_spi_xfer_polling(struct rt_spi_device *device, struct rt_s
} else {
spi->control_config.common_config.trans_mode = spi_trans_write_only;
}
- spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, (uint8_t*) tx_buf, transfer_len, NULL, 0);
+ spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, (uint8_t*) tx_buf, transfer_len / data_len_in_bytes, NULL, 0);
}
else if (_msg->recv_buf != NULL){
if ((need_dummy == RT_TRUE) && (index == 0)) {
@@ -921,7 +892,7 @@ static rt_ssize_t hpm_spi_xfer_polling(struct rt_spi_device *device, struct rt_s
} else {
spi->control_config.common_config.trans_mode = spi_trans_read_only;
}
- spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, NULL, 0, rx_buf, transfer_len);
+ spi_stat = spi_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, NULL, 0, rx_buf, transfer_len / data_len_in_bytes);
}
if (spi_stat != status_success) {
actual_len = -RT_EIO;
@@ -1020,9 +991,6 @@ static hpm_stat_t hpm_spi_rx_dma_start(struct rt_spi_device *device)
static void hpm_spi_transfer_data_cache_handle(struct rt_spi_message *msg, spi_dma_buf_ctx_t *ctx, rt_uint32_t len)
{
- rt_uint32_t transfer_len;
- rt_uint8_t *tx_buf = RT_NULL;
- rt_uint8_t *rx_buf = RT_NULL;
uint32_t aligned_start = 0;
uint32_t aligned_end = 0;
uint32_t aligned_size = 0;
@@ -1073,21 +1041,26 @@ static hpm_stat_t hpm_spi_transmit_use_fifo(struct rt_spi_device *device, struct
{
hpm_stat_t stat = status_fail;
struct hpm_spi *spi = (struct hpm_spi *)(device->bus->parent.user_data);
- if (((*remaining_size) <= SPI_SOC_FIFO_DEPTH) && ((device->config.mode & RT_SPI_MASTER) == RT_SPI_MASTER)
+ uint8_t data_len_in_bytes = spi_get_data_length_in_bytes(spi->spi_base);
+ rt_uint32_t transfer_count = (*remaining_size) / data_len_in_bytes;
+
+ if ((transfer_count <= SPI_SOC_FIFO_DEPTH) && ((device->config.mode & RT_SPI_MASTER) == RT_SPI_MASTER)
&& (msg->send_buf != NULL) && (msg->recv_buf == NULL)) {
+ /* Clear the semaphore */
+ while (rt_sem_take(spi->spi_xfer_done_sem, 0) == RT_EOK) {
+ }
spi_enable_interrupt(spi->spi_base, spi_end_int);
if ((*need_dummy) == RT_TRUE) {
spi->control_config.common_config.trans_mode = spi_trans_dummy_write;
} else {
spi->control_config.common_config.trans_mode = spi_trans_write_only;
}
- stat = spi_control_init(spi->spi_base, &spi->control_config, (*remaining_size), 0);
+ stat = spi_control_init(spi->spi_base, &spi->control_config, transfer_count, 0);
if (stat != status_success) {
return stat;
}
- uint8_t data_len_in_bytes = spi_get_data_length_in_bytes(spi->spi_base);
if (msg->send_buf != NULL) {
- for (uint8_t j = 0; j < (*remaining_size); j++) {
+ for (uint8_t j = 0; j < transfer_count; j++) {
switch (data_len_in_bytes) {
case 1:
spi->spi_base->DATA = *(uint8_t *)msg->send_buf;
@@ -1114,24 +1087,24 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
{
spi_dma_buf_ctx_t dma_buf_ctx = {0};
rt_uint8_t cmd = 0;
- rt_uint32_t addr = 0, aligned_len = 0;
+ rt_uint32_t addr = 0;
rt_uint32_t remaining_size = msg->length;
rt_uint32_t transfer_len;
rt_uint8_t *tx_buf = RT_NULL;
rt_uint8_t *rx_buf = RT_NULL;
- uint32_t aligned_start = 0;
- uint32_t aligned_end = 0;
- uint32_t aligned_size = 0;
rt_ssize_t actual_len = 0;
bool need_dummy = RT_FALSE;
hpm_stat_t stat = status_success;
rt_uint32_t index;
struct rt_spi_message *_msg = (struct rt_spi_message *)msg;
- struct rt_spi_message *spi_msg = (struct rt_spi_message *)_msg;
#ifdef RT_USING_QSPI
struct rt_qspi_message *qspi_msg = RT_NULL;
#endif
struct hpm_spi *spi = (struct hpm_spi *)(device->bus->parent.user_data);
+ uint8_t data_len_in_bytes = spi_get_data_length_in_bytes(spi->spi_base);
+ /* Clear the semaphore */
+ while (rt_sem_take(spi->spi_xfer_done_sem, 0) == RT_EOK) {
+ }
spi_enable_interrupt(spi->spi_base, spi_end_int);
while (_msg != RT_NULL) {
index = 0;
@@ -1154,7 +1127,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
_msg = _msg->next;
continue;
}
- hpm_spi_transfer_data_cache_handle(_msg, &dma_buf_ctx, msg->length);
+ hpm_spi_transfer_data_cache_handle(_msg, &dma_buf_ctx, _msg->length);
tx_buf = dma_buf_ctx.aligned_tx_buf;
rx_buf = dma_buf_ctx.aligned_rx_buf;
dma_mgr_disable_chn_irq(&spi->rx_dma, DMA_MGR_INTERRUPT_MASK_TC);
@@ -1162,7 +1135,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
}
}
while (remaining_size > 0) {
- transfer_len = MIN(SPI_SOC_TRANSFER_COUNT_MAX, remaining_size);
+ transfer_len = MIN(SPI_SOC_TRANSFER_COUNT_MAX * data_len_in_bytes, remaining_size);
/* Next sub-packet: Disable CMD and ADDR phase for the following packet */
if (index > 0) {
spi->control_config.master_config.cmd_enable = RT_FALSE;
@@ -1190,7 +1163,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
break;
}
/* third: config spi */
- stat = spi_control_init(spi->spi_base, &spi->control_config, transfer_len, transfer_len);
+ stat = spi_control_init(spi->spi_base, &spi->control_config, transfer_len / data_len_in_bytes, transfer_len / data_len_in_bytes);
if (stat != status_success) {
break;
}
@@ -1221,7 +1194,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
} else {
spi->control_config.common_config.trans_mode = spi_trans_write_only;
}
- stat = spi_setup_dma_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, transfer_len, RT_NULL);
+ stat = spi_setup_dma_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, transfer_len / data_len_in_bytes, RT_NULL);
if (stat != status_success) {
break;
}
@@ -1253,7 +1226,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
if (stat != status_success) {
break;
}
- stat = spi_setup_dma_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, RT_NULL, transfer_len);
+ stat = spi_setup_dma_transfer(spi->spi_base, &spi->control_config, &cmd, &addr, RT_NULL, transfer_len / data_len_in_bytes);
if (stat != status_success) {
break;
}
@@ -1272,7 +1245,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
index++;
}
if (l1c_dc_is_enabled() && (_msg->length > 0)) {
- if (((rt_uint32_t)msg->send_buf % HPM_L1C_CACHELINE_SIZE) || (_msg->length % HPM_L1C_CACHELINE_SIZE)) {
+ if (((rt_uint32_t)_msg->send_buf % HPM_L1C_CACHELINE_SIZE) || (_msg->length % HPM_L1C_CACHELINE_SIZE)) {
if (dma_buf_ctx.aligned_tx_buf != RT_NULL) {
rt_free_align(dma_buf_ctx.raw_alloc_tx_buf);
dma_buf_ctx.raw_alloc_tx_buf = RT_NULL;
@@ -1281,7 +1254,7 @@ static rt_ssize_t hpm_spi_xfer_dma(struct rt_spi_device *device, struct rt_spi_m
}
if ((l1c_dc_is_enabled() == true) && (_msg->recv_buf != RT_NULL) && (dma_buf_ctx.aligned_rx_buf != RT_NULL)) {
l1c_dc_invalidate((uint32_t) dma_buf_ctx.aligned_rx_buf, dma_buf_ctx.aligned_size);
- if (((rt_uint32_t)msg->recv_buf % HPM_L1C_CACHELINE_SIZE) || (_msg->length % HPM_L1C_CACHELINE_SIZE)) {
+ if (((rt_uint32_t)_msg->recv_buf % HPM_L1C_CACHELINE_SIZE) || (_msg->length % HPM_L1C_CACHELINE_SIZE)) {
rt_memcpy(_msg->recv_buf, dma_buf_ctx.aligned_rx_buf, _msg->length);
rt_free_align(dma_buf_ctx.raw_alloc_rx_buf);
dma_buf_ctx.raw_alloc_rx_buf = RT_NULL;
@@ -1371,9 +1344,10 @@ rt_err_t rt_hw_spi_device_attach(const char *bus_name, const char *device_name,
#ifdef RT_USING_QSPI
struct rt_qspi_device *qspi_dev;
qspi_dev = (struct rt_qspi_device *) rt_malloc(sizeof(struct rt_qspi_device));
+ RT_ASSERT(qspi_dev != RT_NULL);
+ rt_memset(qspi_dev, 0, sizeof(struct rt_qspi_device));
qspi_dev->enter_qspi_mode = enter_qspi_mode;
qspi_dev->exit_qspi_mode = exit_qspi_mode;
- RT_ASSERT(qspi_dev != RT_NULL);
result = rt_spi_bus_attach_device(&qspi_dev->parent, device_name, bus_name, (void*)callback);
RT_ASSERT(result == RT_EOK);
struct hpm_spi *spi = RT_NULL;
@@ -1435,8 +1409,18 @@ int rt_hw_spi_init(void)
chg_config.dst_addr = (uint32_t)&spi->spi_base->DATA;
chg_config.en_dmamux = true;
chg_config.dmamux_src = spi->tx_dmamux;
- dma_mgr_setup_channel(&spi->tx_dma, &chg_config);
- dma_mgr_install_chn_tc_callback(&spi->tx_dma, spi_dma_channel_tc_callback, (void *)&hpm_spis[i]);
+ stat = dma_mgr_setup_channel(&spi->tx_dma, &chg_config);
+ if (stat != status_success)
+ {
+ LOG_E("[spi%d]tx dma setup channel failed\n", i);
+ return -RT_ERROR;
+ }
+ stat = dma_mgr_install_chn_tc_callback(&spi->tx_dma, spi_dma_channel_tc_callback, (void *)&hpm_spis[i]);
+ if (stat != status_success)
+ {
+ LOG_E("[spi%d]tx dma install callback failed\n", i);
+ return -RT_ERROR;
+ }
/* spi rx dma config */
stat = dma_mgr_request_resource(&spi->rx_dma);
if (stat != status_success) {
@@ -1450,8 +1434,18 @@ int rt_hw_spi_init(void)
chg_config.dst_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_INCREMENT;
chg_config.en_dmamux = true;
chg_config.dmamux_src = spi->rx_dmamux;
- dma_mgr_setup_channel(&spi->rx_dma, &chg_config);
- dma_mgr_install_chn_tc_callback(&spi->rx_dma, spi_dma_channel_tc_callback, (void *)&hpm_spis[i]);
+ stat = dma_mgr_setup_channel(&spi->rx_dma, &chg_config);
+ if (stat != status_success)
+ {
+ LOG_E("[spi%d]rx dma setup channel failed\n", i);
+ return -RT_ERROR;
+ }
+ stat = dma_mgr_install_chn_tc_callback(&spi->rx_dma, spi_dma_channel_tc_callback, (void *)&hpm_spis[i]);
+ if (stat != status_success)
+ {
+ LOG_E("[spi%d]rx dma install callback failed\n", i);
+ return -RT_ERROR;
+ }
intc_m_enable_irq_with_priority(hpm_spis[i].spi_irq, hpm_spis[i].spi_irq_priority);
dma_mgr_enable_dma_irq_with_priority(&spi->tx_dma, 1);
@@ -1472,7 +1466,7 @@ int rt_hw_spi_init(void)
hpm_spis[i].xfer_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
if (hpm_spis[i].xfer_sem == RT_NULL)
{
- ret = RT_ENOMEM;
+ ret = -RT_ENOMEM;
break;
}
@@ -1480,7 +1474,7 @@ int rt_hw_spi_init(void)
hpm_spis[i].spi_xfer_done_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
if (hpm_spis[i].spi_xfer_done_sem == RT_NULL)
{
- ret = RT_ENOMEM;
+ ret = -RT_ENOMEM;
break;
}
@@ -1488,7 +1482,7 @@ int rt_hw_spi_init(void)
hpm_spis[i].rxdma_xfer_done_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
if (hpm_spis[i].rxdma_xfer_done_sem == RT_NULL)
{
- ret = RT_ENOMEM;
+ ret = -RT_ENOMEM;
break;
}
@@ -1496,9 +1490,14 @@ int rt_hw_spi_init(void)
hpm_spis[i].txdma_xfer_done_sem = rt_sem_create(sem_name, 0, RT_IPC_FLAG_PRIO);
if (hpm_spis[i].txdma_xfer_done_sem == RT_NULL)
{
- ret = RT_ENOMEM;
+ ret = -RT_ENOMEM;
break;
}
+
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register SPI device to irq table */
+ rt_hw_interrupt_install(hpm_spis[i].spi_irq, (rt_isr_handler_t)handle_spi_isr, hpm_spis[i].spi_base, hpm_spis[i].bus_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return ret;
diff --git a/bsp/hpmicro/libraries/drivers/drv_timer.c b/bsp/hpmicro/libraries/drivers/drv_timer.c
index 3c3a37c4f46e..9e366f47ff6a 100644
--- a/bsp/hpmicro/libraries/drivers/drv_timer.c
+++ b/bsp/hpmicro/libraries/drivers/drv_timer.c
@@ -12,7 +12,14 @@
#include "drv_timer.h"
#include "board.h"
+#ifdef BSP_USING_GPTMRV2
+#include "hpm_gptmrv2_drv.h"
+#ifndef GPTMRV2_DEFAULT_FREQ
+#define GPTMRV2_DEFAULT_FREQ (100000UL) /* 100KHz */
+#endif
+#else
#include "hpm_gptmr_drv.h"
+#endif
#include "hpm_clock_drv.h"
@@ -46,7 +53,11 @@ static const struct rt_clock_timer_ops hpm_clock_timer_ops = {
static const struct rt_clock_timer_info hpm_clock_timer_info = {
.maxfreq = 100000000UL,
.minfreq = 93750UL,
+#ifdef BSP_USING_GPTMRV2
+ .maxcnt = 0xFFFFFFUL,
+#else
.maxcnt = 0xFFFFFFFFUL,
+#endif
.cntmode = CLOCK_TIMER_CNTMODE_UP
};
@@ -278,6 +289,10 @@ static void hpm_clock_timer_init(rt_clock_timer_t *timer, rt_uint32_t state)
clock_add_to_group(hpm_gptmr->clock_name, BOARD_RUNNING_CORE & 0x1);
hpm_gptmr->timer.freq = clock_get_frequency(hpm_gptmr->clock_name);
gptmr_channel_get_default_config(base, &config);
+#ifdef BSP_USING_GPTMRV2
+ hpm_gptmr->timer.freq = GPTMRV2_DEFAULT_FREQ;
+ config.prescaler = clock_get_frequency(hpm_gptmr->clock_name) / hpm_gptmr->timer.freq;
+#endif
gptmr_channel_config(base, hpm_gptmr->channel, &config, false);
}
}
@@ -291,6 +306,9 @@ static rt_err_t hpm_clock_timer_start(rt_clock_timer_t *timer, rt_uint32_t cnt,
gptmr_channel_get_default_config(base, &config);
config.cmp[0] = 0;
config.reload = cnt;
+#ifdef BSP_USING_GPTMRV2
+ config.prescaler = clock_get_frequency(hpm_gptmr->clock_name) / timer->freq;
+#endif
timer->mode = mode;
@@ -334,17 +352,35 @@ static rt_err_t hpm_clock_timer_control(rt_clock_timer_t *timer, rt_uint32_t cmd
switch (cmd)
{
case CLOCK_TIMER_CTRL_FREQ_SET:
+#ifdef BSP_USING_GPTMRV2
+ if ((args == RT_NULL) || (*(rt_uint32_t *)args == 0U))
+ {
+ return -RT_EINVAL;
+ }
+ hpm_gptmr->timer.freq = *(rt_uint32_t*)args;
+#else
err = -RT_ERROR;
+#endif
break;
case CLOCK_TIMER_CTRL_INFO_GET:
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
*(rt_clock_timer_t*)args = hpm_gptmr->timer;
break;
case CLOCK_TIMER_CTRL_MODE_SET:
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
hpm_gptmr->timer.mode = *(rt_uint32_t*)args;
break;
case CLOCK_TIMER_CTRL_STOP:
gptmr_stop_counter(base, hpm_gptmr->channel);
break;
+ default:
+ return -RT_EINVAL;
}
return err;
diff --git a/bsp/hpmicro/libraries/drivers/drv_tsw.c b/bsp/hpmicro/libraries/drivers/drv_tsw.c
index 79f302225098..d64ba419e74d 100644
--- a/bsp/hpmicro/libraries/drivers/drv_tsw.c
+++ b/bsp/hpmicro/libraries/drivers/drv_tsw.c
@@ -13,9 +13,10 @@
#ifdef BSP_USING_TSW
#include
#include "drv_tsw.h"
-#include "board.h"
#if defined(BSP_USING_TSW_PHY_RTL8211)
+#include "hpm_tsw_rtl8211.h"
+#include "board.h"
#include "hpm_rtl8211.h"
#endif
@@ -250,7 +251,11 @@ static void eth_rx_callback(struct eth_device* dev)
}
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
void isr_tsw(hpm_tsw_t *obj)
+#else
+void isr_tsw(int vector, hpm_tsw_t *obj)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
static int idx = 0;
uint8_t *prx = (uint8_t *)obj->tsw_dev->rx_buff_cfg->buffer;
@@ -262,11 +267,13 @@ void isr_tsw(hpm_tsw_t *obj)
eth_rx_callback(obj->eth_dev);
}
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
SDK_DECLARE_EXT_ISR_M(IRQn_TSW_0, isr_tsw_port_cpu)
void isr_tsw_port_cpu(void)
{
isr_tsw(&tsw);
}
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
int rt_hw_tsw_init(void)
{
@@ -313,6 +320,11 @@ int rt_hw_tsw_init(void)
LOG_D("Ethernet device %d initialize unsuccessfully!\n");
return err;
}
+
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register TSW device to irq table */
+ rt_hw_interrupt_install(s_geths[i]->irq_num, (rt_isr_handler_t)isr_tsw, s_geths[i], s_geths[i]->name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return err;
diff --git a/bsp/hpmicro/libraries/drivers/drv_tsw_phy.c b/bsp/hpmicro/libraries/drivers/drv_tsw_phy.c
index 7eb807408972..00fd3eb7aac8 100644
--- a/bsp/hpmicro/libraries/drivers/drv_tsw_phy.c
+++ b/bsp/hpmicro/libraries/drivers/drv_tsw_phy.c
@@ -6,6 +6,7 @@
* Change Logs:
* Date Author Notes
* 2025-3-31 Jiading Initial version
+ * 2026-9-18 Jiading Wait for tsw_phy_speed_valid before announcing link-up
*/
#include "rtthread.h"
@@ -16,9 +17,9 @@
#include "hpm_tsw_drv.h"
#include "drv_tsw_phy.h"
#include "hpm_tsw_phy.h"
-#include "hpm_soc.h"
#include "netif/ethernetif.h"
#include "board.h"
+#include "hpm_soc.h"
typedef struct {
TSW_Type *instance;
@@ -67,27 +68,51 @@ tsw_phy_monitor_handle_t phy_monitor_handle = {
static struct rt_phy_ops phy_ops;
-static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz)
+static rt_phy_status phy_query_status(rt_phy_t *phy, tsw_phy_status_t *phy_status)
{
- tsw_phy_instance_t *phy_ins = (tsw_phy_instance_t *)object;
+ tsw_phy_instance_t *phy_ins = phy->bus->hw_obj;
+ hpm_stat_t stat = status_fail;
- if (phy_ins->instance == HPM_TSW) {
- rtl8211_config_t phy_config;
+ *phy_status = (tsw_phy_status_t){0};
- /* Set MDC clock frequency */
- tsw_ep_set_mdio_config(phy_ins->instance, phy_ins->port, src_clock_hz / (2 * PHY_MDIO_CLK_FREQ) - 1);
+#if defined(__USE_RTL8211) && __USE_RTL8211
+ stat = rtl8211_get_phy_status(phy_ins->instance, phy_ins->port, RTL8211_ADDR, phy_status);
+#endif
- /* PHY Reset */
- rtl8211_reset(phy_ins->instance, phy_ins->port);
- rtl8211_basic_mode_default_config(phy_ins->instance, &phy_config);
- if (rtl8211_basic_mode_init(phy_ins->instance, phy_ins->port, &phy_config) == true) {
- return PHY_STATUS_OK;
- } else {
- return PHY_STATUS_FAIL;
- }
+ if (stat != status_success) {
+ return PHY_STATUS_FAIL;
}
- return -RT_EINVAL;
+ return PHY_STATUS_OK;
+}
+
+static void phy_apply_mac(tsw_phy_instance_t *phy_ins, const phy_info_t *phy_info)
+{
+ tsw_port_speed_t port_speed[] = {tsw_port_speed_10mbps, tsw_port_speed_100mbps, tsw_port_speed_1000mbps};
+
+ if (phy_info->phy_speed >= ARRAY_SIZE(port_speed)) {
+ return;
+ }
+
+ tsw_set_port_speed(phy_ins->instance, phy_ins->port, port_speed[phy_info->phy_speed]);
+}
+
+static rt_phy_status phy_init(void *object, rt_uint32_t phy_addr, rt_uint32_t src_clock_hz)
+{
+ tsw_phy_instance_t *phy_ins = (tsw_phy_instance_t *)object;
+ rtl8211_config_t phy_config;
+
+ /* Set MDC clock frequency */
+ tsw_ep_set_mdio_config(phy_ins->instance, phy_ins->port, src_clock_hz / (2 * PHY_MDIO_CLK_FREQ) - 1);
+
+ /* PHY Reset */
+ rtl8211_reset(phy_ins->instance, phy_ins->port, RTL8211_ADDR);
+ rtl8211_basic_mode_default_config(phy_ins->instance, &phy_config);
+ if (rtl8211_basic_mode_init(phy_ins->instance, phy_ins->port, RTL8211_ADDR, &phy_config) == true) {
+ return PHY_STATUS_OK;
+ } else {
+ return PHY_STATUS_FAIL;
+ }
}
static rt_size_t phy_read(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *data, rt_uint32_t size)
@@ -120,29 +145,28 @@ static rt_size_t phy_write(void *bus, rt_uint32_t addr, rt_uint32_t reg, void *d
static rt_phy_status phy_get_link_status(rt_phy_t *phy, rt_bool_t *status)
{
- tsw_phy_instance_t *phy_ins = phy->bus->hw_obj;
tsw_phy_status_t phy_status;
- if (phy_ins->instance == HPM_TSW) {
- #if defined(__USE_RTL8211) && __USE_RTL8211
- rtl8211_get_phy_status(phy_ins->instance, phy_ins->port, &phy_status);
- #endif
+ if (phy_query_status(phy, &phy_status) != PHY_STATUS_OK) {
+ *status = RT_FALSE;
+ return PHY_STATUS_FAIL;
}
- *status = phy_status.tsw_phy_link;
+ *status = (phy_status.tsw_phy_link == tsw_phy_link_up) ? RT_TRUE : RT_FALSE;
return PHY_STATUS_OK;
}
static rt_phy_status phy_get_link_speed_duplex(rt_phy_t *phy, rt_uint32_t *speed, rt_uint32_t *duplex)
{
- tsw_phy_instance_t *phy_ins = phy->bus->hw_obj;
tsw_phy_status_t phy_status;
- if (phy_ins->instance == HPM_TSW) {
- #if defined(__USE_RTL8211) && __USE_RTL8211
- rtl8211_get_phy_status(phy_ins->instance, phy_ins->port, &phy_status);
- #endif
+ if (phy_query_status(phy, &phy_status) != PHY_STATUS_OK) {
+ return PHY_STATUS_FAIL;
+ }
+
+ if (!tsw_phy_link_up_with_valid_speed(&phy_status)) {
+ return PHY_STATUS_FAIL;
}
*speed = phy_status.tsw_phy_speed;
@@ -155,43 +179,56 @@ static void phy_poll_status(void *parameter)
{
int ret;
phy_info_t phy_info;
- rt_bool_t status;
- rt_device_t dev;
- rt_phy_msg_t msg;
- rt_uint32_t speed, duplex;
+ tsw_phy_status_t phy_status;
phy_device_t *phy_dev;
- struct eth_device* eth_dev;
+ struct eth_device *eth_dev;
char const *ps[] = {"10Mbps", "100Mbps", "1000Mbps"};
- tsw_port_speed_t port_speed[] = {tsw_port_speed_10mbps, tsw_port_speed_100mbps, tsw_port_speed_1000mbps};
tsw_phy_monitor_handle_t *phy_monitor_handle = (tsw_phy_monitor_handle_t *)parameter;
for (uint32_t i = 0; i < phy_monitor_handle->phy_handle_cnt; i++) {
eth_dev = phy_monitor_handle->phy_handle[i]->eth_dev;
phy_dev = phy_monitor_handle->phy_handle[i]->phy_dev;
- phy_dev->phy.ops->get_link_status(&phy_dev->phy, &status);
-
- if (status) {
- phy_dev->phy.ops->get_link_speed_duplex(&phy_dev->phy, &phy_info.phy_speed, &phy_info.phy_duplex);
+ if (phy_query_status(&phy_dev->phy, &phy_status) != PHY_STATUS_OK) {
+ continue;
+ }
- ret = memcmp(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
- if (ret != 0) {
- memcpy(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (phy_status.tsw_phy_link == tsw_phy_link_down) {
+ if (phy_dev->phy_link != PHY_LINK_DOWN) {
+ phy_dev->phy_link = PHY_LINK_DOWN;
+ eth_device_linkchange(eth_dev, RT_FALSE);
+ LOG_I("PHY Status: %s", "Link down\n");
}
+ continue;
+ }
+
+ if (!tsw_phy_link_up_with_valid_speed(&phy_status)) {
+ continue;
}
- if (phy_dev->phy_link != status) {
- phy_dev->phy_link = status ? PHY_LINK_UP : PHY_LINK_DOWN;
- eth_device_linkchange(eth_dev, status);
- LOG_I("PHY Status: %s", status ? "Link up" : "Link down\n");
- if (status == PHY_LINK_UP) {
+ phy_info.phy_speed = phy_status.tsw_phy_speed;
+ phy_info.phy_duplex = phy_status.tsw_phy_duplex;
+
+ ret = memcmp(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (ret != 0) {
+ memcpy(&phy_dev->phy_info, &phy_info, sizeof(phy_info_t));
+ if (phy_dev->phy_link == PHY_LINK_UP) {
+ phy_apply_mac(phy_monitor_handle->phy_handle[i]->phy_ins, &phy_dev->phy_info);
LOG_I("PHY Speed: %s", ps[phy_dev->phy_info.phy_speed]);
LOG_I("PHY Duplex: %s\n", phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX ? "full duplex" : "half duplex");
- tsw_set_port_speed(phy_monitor_handle->phy_handle[i]->phy_ins->instance, phy_monitor_handle->phy_handle[i]->phy_ins->port, port_speed[phy_dev->phy_info.phy_speed]);
- if (!(phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX)) {
- LOG_E("Error: PHY is in half duplex now, but TSW MAC supports only full duplex mode!\n");
- return;
- }
+ }
+ }
+
+ if (phy_dev->phy_link != PHY_LINK_UP) {
+ phy_dev->phy_link = PHY_LINK_UP;
+ eth_device_linkchange(eth_dev, RT_TRUE);
+ LOG_I("PHY Status: %s", "Link up");
+ LOG_I("PHY Speed: %s", ps[phy_dev->phy_info.phy_speed]);
+ LOG_I("PHY Duplex: %s\n", phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX ? "full duplex" : "half duplex");
+ phy_apply_mac(phy_monitor_handle->phy_handle[i]->phy_ins, &phy_dev->phy_info);
+ if (!(phy_dev->phy_info.phy_duplex & PHY_FULL_DUPLEX)) {
+ LOG_E("Error: PHY is in half duplex now, but TSW MAC supports only full duplex mode!\n");
+ return;
}
}
}
diff --git a/bsp/hpmicro/libraries/drivers/drv_tsw_phy.h b/bsp/hpmicro/libraries/drivers/drv_tsw_phy.h
index d7d360410509..ad6f9bb54803 100644
--- a/bsp/hpmicro/libraries/drivers/drv_tsw_phy.h
+++ b/bsp/hpmicro/libraries/drivers/drv_tsw_phy.h
@@ -12,6 +12,7 @@
#include
#if defined(BSP_USING_TSW_PHY_RTL8211)
+#include "hpm_tsw_rtl8211.h"
#include "hpm_rtl8211.h"
#endif
diff --git a/bsp/hpmicro/libraries/drivers/drv_uart.c b/bsp/hpmicro/libraries/drivers/drv_uart.c
index 991fa6142eac..72f2264dc5aa 100644
--- a/bsp/hpmicro/libraries/drivers/drv_uart.c
+++ b/bsp/hpmicro/libraries/drivers/drv_uart.c
@@ -38,160 +38,161 @@ static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void
static int hpm_uart_putc(struct rt_serial_device *serial, char ch);
static int hpm_uart_getc(struct rt_serial_device *serial);
-
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
#if defined(BSP_USING_UART0)
struct rt_serial_device serial0;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART0,uart0_isr)
void uart0_isr(void)
{
hpm_uart_isr(&serial0);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART0,uart0_isr)
#endif
#if defined(BSP_USING_UART1)
struct rt_serial_device serial1;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART1,uart1_isr)
void uart1_isr(void)
{
hpm_uart_isr(&serial1);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART1,uart1_isr)
#endif
#if defined(BSP_USING_UART2)
struct rt_serial_device serial2;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART2,uart2_isr)
void uart2_isr(void)
{
hpm_uart_isr(&serial2);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART2,uart2_isr)
#endif
#if defined(BSP_USING_UART3)
struct rt_serial_device serial3;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART3,uart3_isr)
void uart3_isr(void)
{
hpm_uart_isr(&serial3);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART3,uart3_isr)
#endif
#if defined(BSP_USING_UART4)
struct rt_serial_device serial4;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART4,uart4_isr)
void uart4_isr(void)
{
hpm_uart_isr(&serial4);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART4,uart4_isr)
#endif
#if defined(BSP_USING_UART5)
struct rt_serial_device serial5;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART5,uart5_isr)
void uart5_isr(void)
{
hpm_uart_isr(&serial5);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART5,uart5_isr)
#endif
#if defined(BSP_USING_UART6)
struct rt_serial_device serial6;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART6,uart6_isr)
void uart6_isr(void)
{
hpm_uart_isr(&serial6);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART6,uart6_isr)
#endif
#if defined(BSP_USING_UART7)
struct rt_serial_device serial7;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART7,uart7_isr)
void uart7_isr(void)
{
hpm_uart_isr(&serial7);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART7,uart7_isr)
#endif
#if defined(BSP_USING_UART8)
struct rt_serial_device serial8;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART8,uart8_isr)
void uart8_isr(void)
{
hpm_uart_isr(&serial8);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART8,uart8_isr)
#endif
#if defined(BSP_USING_UART9)
struct rt_serial_device serial9;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART9,uart9_isr)
void uart9_isr(void)
{
hpm_uart_isr(&serial9);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART9,uart9_isr)
#endif
#if defined(BSP_USING_UART10)
struct rt_serial_device serial10;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART10,uart10_isr)
void uart10_isr(void)
{
hpm_uart_isr(&serial10);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART10,uart10_isr)
#endif
#if defined(BSP_USING_UART11)
struct rt_serial_device serial11;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART11,uart11_isr)
void uart11_isr(void)
{
hpm_uart_isr(&serial11);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART11,uart11_isr)
#endif
#if defined(BSP_USING_UART12)
struct rt_serial_device serial12;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART12,uart12_isr)
void uart12_isr(void)
{
hpm_uart_isr(&serial12);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART12,uart12_isr)
#endif
#if defined(BSP_USING_UART13)
struct rt_serial_device serial13;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART13,uart13_isr)
void uart13_isr(void)
{
hpm_uart_isr(&serial13);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART13,uart13_isr)
#endif
#if defined(BSP_USING_UART14)
struct rt_serial_device serial14;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART14,uart14_isr)
void uart14_isr(void)
{
hpm_uart_isr(&serial14);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART14,uart14_isr)
#endif
#if defined(BSP_USING_UART15)
struct rt_serial_device serial15;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART15,uart15_isr)
void uart15_isr(void)
{
hpm_uart_isr(&serial15);
}
+SDK_DECLARE_EXT_ISR_M(IRQn_UART15,uart15_isr)
#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
static const struct hpm_uart uarts[] = {
#if defined(BSP_USING_UART0)
@@ -441,7 +442,11 @@ static const struct hpm_uart uarts[] = {
*
* @param serial Serial device
*/
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_uart_isr(struct rt_serial_device *serial)
+#else
+static void hpm_uart_isr(int vector, struct rt_serial_device *serial)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
struct hpm_uart *uart;
@@ -461,6 +466,7 @@ static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct seria
RT_ASSERT(cfg != RT_NULL);
uart_config_t uart_config;
+ hpm_stat_t stat;
struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
init_uart_pins(uart->uart_base);
@@ -472,10 +478,13 @@ static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct seria
uart_config.parity = cfg->parity;
uart_config.word_length = cfg->data_bits - DATA_BITS_5;
+ stat = uart_init(uart->uart_base, &uart_config);
+ if (stat != status_success)
+ {
+ return -RT_ERROR;
+ }
- uart_init(uart->uart_base, &uart_config);
-
- hpm_uart_control(serial, RT_DEVICE_CTRL_SET_INT, NULL);
+ return hpm_uart_control(serial, RT_DEVICE_CTRL_SET_INT, NULL);
}
@@ -558,6 +567,10 @@ int rt_hw_uart_init(void)
uarts[i].device_name,
RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_INT_RX,
(void*)&uarts[i]);
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register UART device to irq table */
+ rt_hw_interrupt_install(uarts[i].irq_num, (rt_isr_handler_t)hpm_uart_isr, uarts[i].serial, uarts[i].device_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return err;
diff --git a/bsp/hpmicro/libraries/drivers/drv_uart_v2.c b/bsp/hpmicro/libraries/drivers/drv_uart_v2.c
index 279236978a98..8a5c8bc73084 100644
--- a/bsp/hpmicro/libraries/drivers/drv_uart_v2.c
+++ b/bsp/hpmicro/libraries/drivers/drv_uart_v2.c
@@ -3,40 +3,90 @@
*
* SPDX-License-Identifier: BSD-3-Clause
*
+ * @file drv_uart_v2.c
+ * @brief UART driver implementation for RT-Thread on HPMicro Microcontrollers
+ *
+ * This file implements the UART (Universal Asynchronous Receiver-Transmitter) driver
+ * for HPMicro microcontrollers, providing a complete interface
+ * between RT-Thread's serial framework and the HPM UART hardware.
+ *
+ * Features:
+ * - Support for up to 16 UART controllers (UART0-UART15)
+ * - Interrupt-driven and DMA-based data transfer
+ * - Configurable baud rates, data bits, stop bits, and parity
+ * - Hardware flow control support
+ * - Ring buffer management for efficient data handling
+ * - Cache coherency support for DMA operations
+ * - RX idle detection for improved DMA efficiency
+ *
+ * Architecture:
+ * - Each UART controller is represented by a hpm_uart structure
+ * - ISR functions handle interrupt-driven operations
+ * - DMA channels are dynamically allocated and managed
+ * - Configuration macros reduce code duplication
+ *
* Change Logs:
* Date Author Notes
* 2022-03-08 HPMicro First version
* 2022-07-28 HPMicro Fix compiling warning if RT_SERIAL_USING_DMA was not defined
- * 2022-08-08 HPMicro Integrate DMA Manager and support dynamic DMA resource assignment'
+ * 2022-08-08 HPMicro Integrate DMA Manager and support dynamic DMA resource assignment
* 2023-03-07 HPMicro Fix the issue that the data_width was not initialized before setup dma handshake
* 2024-06-10 HPMicro Fix memory leakage issue
+ * 2025-09-01 HPMicro Added comprehensive macros to reduce code duplication
+ * 2025-12-10 HPMicro Added DMA ping-pong buffer support for RX DMA mode
*
*/
-#include
-#include
-#include "board.h"
-#include "drv_uart_v2.h"
-#include "hpm_uart_drv.h"
-#include "hpm_sysctl_drv.h"
-#include "hpm_l1c_drv.h"
-#include "hpm_dma_mgr.h"
-#include "hpm_soc.h"
-#include "hpm_clock_drv.h"
+/* RT-Thread configuration */
+#include "rtconfig.h"
#ifdef RT_USING_SERIAL_V2
+/* RT-Thread core includes */
+#include /* RT-Thread kernel and threading support */
+#include /* RT-Thread device framework */
+
+/* Board and driver specific includes */
+#include "board.h" /* Board configuration and pin definitions */
+#include "drv_uart_v2.h" /* UART driver header file */
+
+/* HPM SDK includes */
+#include "hpm_uart_drv.h" /* HPM UART driver API */
+#include "hpm_l1c_drv.h" /* L1 cache driver for DMA coherency */
+#include "hpm_dma_mgr.h" /* DMA manager for resource allocation */
+#include "hpm_soc.h" /* HPM SoC definitions and register maps */
+#include "hpm_clock_drv.h" /* Clock driver for UART clock configuration */
+#include "hpm_sysctl_drv.h"
+
+
+/* ============================================================================
+ * DMA Configuration and Definitions
+ * ============================================================================
+ */
+
#ifdef RT_SERIAL_USING_DMA
-#define BOARD_UART_DMAMUX HPM_DMAMUX
-#define UART_DMA_TRIGGER_LEVEL (1U)
+/* DMA hardware configuration */
+#define BOARD_UART_DMAMUX HPM_DMAMUX /* DMA multiplexer base address */
+#define UART_DMA_TRIGGER_LEVEL (1U) /* DMA trigger level for UART operations */
+
+/**
+ * @brief DMA channel handle structure for UART operations
+ *
+ * This structure manages DMA channel resources and callbacks for UART operations.
+ * It provides a complete interface for DMA-based UART data transfer with proper
+ * error handling and completion notification.
+ */
typedef struct dma_channel {
- struct rt_serial_device *serial;
- dma_resource_t resource;
- void (*tranfer_done)(struct rt_serial_device *serial);
- void (*tranfer_abort)(struct rt_serial_device *serial);
- void (*tranfer_error)(struct rt_serial_device *serial);
- void *ringbuf_ptr;
+ struct rt_serial_device *serial; /* Associated RT-Thread serial device */
+ dma_resource_t resource; /* DMA resource (base, channel, IRQ) */
+ void (*transfer_done)(struct rt_serial_device *serial); /* Transfer completion callback */
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ void (*halftransfer_cb)(struct rt_serial_device *serial); /* Half transfer callback */
+#endif
+ void (*transfer_abort)(struct rt_serial_device *serial); /* Transfer abort callback */
+ void (*transfer_error)(struct rt_serial_device *serial); /* Transfer error callback */
+ void *ringbuf_ptr; /* Pointer to ring buffer for DMA operations */
} hpm_dma_channel_handle_t;
//static struct dma_channel dma_channels[DMA_SOC_CHANNEL_NUM];
@@ -44,41 +94,73 @@ static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg);
static void hpm_uart_receive_dma_next(struct rt_serial_device *serial);
#endif
-#define UART_ROOT_CLK_FREQ BOARD_APP_UART_SRC_FREQ
-
+/**
+ * @brief UART device structure for HPM microcontrollers
+ *
+ * This structure contains all the necessary information to manage a UART controller,
+ * including hardware registers, DMA configuration, interrupt settings, and device
+ * identification. It serves as the primary data structure for UART operations.
+ */
struct hpm_uart {
- UART_Type *uart_base;
- rt_uint32_t irq_num;
- rt_uint8_t irq_priority;
- clock_name_t clk_name;
- struct rt_serial_device *serial;
- char *device_name;
+ /* Hardware configuration */
+ UART_Type *uart_base; /* UART hardware register base address */
+ rt_uint32_t txbuf_size; /* Transmit buffer size in bytes */
+ rt_uint32_t rxbuf_size; /* Receive buffer size in bytes */
+ rt_uint32_t irq_num; /* UART interrupt number */
+ rt_uint8_t irq_priority; /* UART interrupt priority */
+
+ /* DMA configuration */
+ bool enable_dma; /* Overall DMA enable flag */
+ bool enable_tx_dma; /* Transmit DMA enable flag */
+ bool enable_rx_dma; /* Receive DMA enable flag */
+
+ /* Clock and device configuration */
+ clock_name_t clk_name; /* UART clock source name */
+ struct rt_serial_device *serial; /* Associated RT-Thread serial device */
+ char *device_name; /* Device name string (e.g., "uart0") */
+
+ /* DMA multiplexer configuration */
+ uint32_t tx_dma_mux; /* TX DMA multiplexer source */
+ uint32_t rx_dma_mux; /* RX DMA multiplexer source */
+ uint32_t dma_flags; /* DMA operation flags */
+
#ifdef RT_SERIAL_USING_DMA
- uint32_t tx_dma_mux;
- uint32_t rx_dma_mux;
- uint32_t dma_flags;
- hpm_dma_channel_handle_t tx_chn_ctx;
- hpm_dma_channel_handle_t rx_chn_ctx;
- bool tx_resource_allocated;
- bool rx_resource_allocated;
-#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
- ATTR_ALIGN(HPM_L1C_CACHELINE_SIZE) uint8_t rx_idle_tmp_buffer[1024];
-#endif
-#endif
+ /* DMA channel contexts */
+ hpm_dma_channel_handle_t tx_chn_ctx; /* TX DMA channel context */
+ hpm_dma_channel_handle_t rx_chn_ctx; /* RX DMA channel context */
+ bool tx_resource_allocated; /* TX DMA resource allocation status */
+ bool rx_resource_allocated; /* RX DMA resource allocation status */
+ rt_uint32_t dma_pingpong_size; /* DMA ping buffer size */
+ rt_uint32_t dma_rx_remain_size; /* Remaining size for RX DMA operations */
+#endif
+ rt_uint32_t rx_buffer_size; /* RX buffer size */
+ rt_uint32_t rx_fifo_index; /* RX FIFO index */
};
+/* ============================================================================
+ * Function Declarations
+ * ============================================================================
+ */
+
+/* External functions */
+extern void init_uart_pins(UART_Type *ptr); /* Initialize UART pins (defined in board.c) */
-extern void init_uart_pins(UART_Type *ptr);
-static void hpm_uart_isr(struct rt_serial_device *serial);
-static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg);
-static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg);
-static int hpm_uart_putc(struct rt_serial_device *serial, char ch);
-static int hpm_uart_getc(struct rt_serial_device *serial);
+/* UART driver function prototypes */
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+static void hpm_uart_isr(struct rt_serial_device *serial); /* UART interrupt service routine */
+#else
+static void hpm_uart_isr(int vector, struct rt_serial_device *serial); /* UART interrupt service routine */
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg); /* Configure UART parameters */
+static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg); /* Control UART operations */
+static int hpm_uart_putc(struct rt_serial_device *serial, char ch); /* Send single character */
+static int hpm_uart_getc(struct rt_serial_device *serial); /* Receive single character */
#ifdef RT_SERIAL_USING_DMA
int hpm_uart_dma_register_channel(struct rt_serial_device *serial,
bool is_tx,
void (*done)(struct rt_serial_device *serial),
+ void (*htc)(struct rt_serial_device *serial),
void (*abort)(struct rt_serial_device *serial),
void (*error)(struct rt_serial_device *serial))
{
@@ -87,622 +169,523 @@ int hpm_uart_dma_register_channel(struct rt_serial_device *serial,
if (is_tx) {
uart->tx_chn_ctx.serial = serial;
- uart->tx_chn_ctx.tranfer_done = done;
- uart->tx_chn_ctx.tranfer_abort = abort;
- uart->tx_chn_ctx.tranfer_error = error;
+ uart->tx_chn_ctx.transfer_done = done;
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ uart->tx_chn_ctx.halftransfer_cb = htc;
+#else
+ (void)htc;
+#endif
+ uart->tx_chn_ctx.transfer_abort = abort;
+ uart->tx_chn_ctx.transfer_error = error;
} else {
uart->rx_chn_ctx.serial = serial;
- uart->rx_chn_ctx.tranfer_done = done;
- uart->rx_chn_ctx.tranfer_abort = abort;
- uart->rx_chn_ctx.tranfer_error = error;
+ uart->rx_chn_ctx.transfer_done = done;
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ uart->rx_chn_ctx.halftransfer_cb = htc;
+#else
+ (void)htc;
+#endif
+ uart->rx_chn_ctx.transfer_abort = abort;
+ uart->rx_chn_ctx.transfer_error = error;
}
return RT_EOK;
}
#endif /* RT_SERIAL_USING_DMA */
-#if defined(BSP_USING_UART0)
-struct rt_serial_device serial0;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART0,uart0_isr)
-void uart0_isr(void)
-{
- hpm_uart_isr(&serial0);
-}
-#endif
-
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+/* ============================================================================
+ * UART ISR Function Macros
+ * ============================================================================
+ *
+ * These macros generate UART interrupt service routine functions and device
+ * declarations for each UART controller. They reduce code duplication by
+ * automatically generating the necessary ISR functions and device structures.
+ *
+ * Each macro generates:
+ * - A serial device structure (serial0, serial1, etc.)
+ * - An ISR function declaration with proper interrupt mapping
+ * - An ISR function implementation that calls the common ISR handler
+ *
+ * Usage: UART_ISR_DECLARE(n) where n is the UART number (0-15)
+ */
+#define UART_ISR_DECLARE(n) \
+ struct rt_serial_device serial##n; \
+ SDK_DECLARE_EXT_ISR_M(IRQn_UART##n,uart##n##_isr) \
+ void uart##n##_isr(void) \
+ { \
+ hpm_uart_isr(&serial##n); \
+ } \
-#if defined(BSP_USING_UART1)
-struct rt_serial_device serial1;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART1,uart1_isr)
-void uart1_isr(void)
-{
- hpm_uart_isr(&serial1);
-}
+#ifdef BSP_USING_UART0
+UART_ISR_DECLARE(0)
#endif
-
-#if defined(BSP_USING_UART2)
-struct rt_serial_device serial2;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART2,uart2_isr)
-void uart2_isr(void)
-{
- hpm_uart_isr(&serial2);
-}
+#ifdef BSP_USING_UART1
+UART_ISR_DECLARE(1)
#endif
-
-#if defined(BSP_USING_UART3)
-struct rt_serial_device serial3;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART3,uart3_isr)
-void uart3_isr(void)
-{
- hpm_uart_isr(&serial3);
-}
+#ifdef BSP_USING_UART2
+UART_ISR_DECLARE(2)
#endif
-
-#if defined(BSP_USING_UART4)
-struct rt_serial_device serial4;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART4,uart4_isr)
-void uart4_isr(void)
-{
- hpm_uart_isr(&serial4);
-}
+#ifdef BSP_USING_UART3
+UART_ISR_DECLARE(3)
#endif
-
-#if defined(BSP_USING_UART5)
-struct rt_serial_device serial5;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART5,uart5_isr)
-void uart5_isr(void)
-{
- hpm_uart_isr(&serial5);
-}
+#ifdef BSP_USING_UART4
+UART_ISR_DECLARE(4)
#endif
-
-#if defined(BSP_USING_UART6)
-struct rt_serial_device serial6;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART6,uart6_isr)
-void uart6_isr(void)
-{
- hpm_uart_isr(&serial6);
-}
+#ifdef BSP_USING_UART5
+UART_ISR_DECLARE(5)
#endif
-
-#if defined(BSP_USING_UART7)
-struct rt_serial_device serial7;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART7,uart7_isr)
-void uart7_isr(void)
-{
- hpm_uart_isr(&serial7);
-}
+#ifdef BSP_USING_UART6
+UART_ISR_DECLARE(6)
#endif
-
-#if defined(BSP_USING_UART8)
-struct rt_serial_device serial8;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART8,uart8_isr)
-void uart8_isr(void)
-{
- hpm_uart_isr(&serial8);
-}
+#ifdef BSP_USING_UART7
+UART_ISR_DECLARE(7)
#endif
+#ifdef BSP_USING_UART8
+UART_ISR_DECLARE(8)
+#endif
-#if defined(BSP_USING_UART9)
-struct rt_serial_device serial9;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART9,uart9_isr)
-void uart9_isr(void)
-{
- hpm_uart_isr(&serial9);
-}
+#ifdef BSP_USING_UART9
+UART_ISR_DECLARE(9)
#endif
+#ifdef BSP_USING_UART10
+UART_ISR_DECLARE(10)
+#endif
-#if defined(BSP_USING_UART10)
-struct rt_serial_device serial10;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART10,uart10_isr)
-void uart10_isr(void)
-{
- hpm_uart_isr(&serial10);
-}
+#ifdef BSP_USING_UART11
+UART_ISR_DECLARE(11)
#endif
-#if defined(BSP_USING_UART11)
-struct rt_serial_device serial11;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART11,uart11_isr)
-void uart11_isr(void)
-{
- hpm_uart_isr(&serial11);
-}
+#ifdef BSP_USING_UART12
+UART_ISR_DECLARE(12)
#endif
-#if defined(BSP_USING_UART12)
-struct rt_serial_device serial12;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART12,uart12_isr)
-void uart12_isr(void)
-{
- hpm_uart_isr(&serial12);
-}
+#ifdef BSP_USING_UART13
+UART_ISR_DECLARE(13)
#endif
-#if defined(BSP_USING_UART13)
-struct rt_serial_device serial13;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART13,uart13_isr)
-void uart13_isr(void)
-{
- hpm_uart_isr(&serial13);
-}
+#ifdef BSP_USING_UART14
+UART_ISR_DECLARE(14)
#endif
-#if defined(BSP_USING_UART14)
-struct rt_serial_device serial14;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART14,uart14_isr)
-void uart14_isr(void)
-{
- hpm_uart_isr(&serial14);
-}
+#ifdef BSP_USING_UART15
+UART_ISR_DECLARE(15)
#endif
-#if defined(BSP_USING_UART15)
-struct rt_serial_device serial15;
-SDK_DECLARE_EXT_ISR_M(IRQn_UART15,uart15_isr)
-void uart15_isr(void)
+#ifdef BSP_USING_PUART
+struct rt_serial_device serial_puart;
+SDK_DECLARE_EXT_ISR_M(IRQn_PUART, puart_isr)
+void puart_isr(void)
{
- hpm_uart_isr(&serial15);
+ hpm_uart_isr(&serial_puart);
}
#endif
-static struct hpm_uart uarts[] =
-{
-#if defined(BSP_USING_UART0)
-{
- HPM_UART0,
- IRQn_UART0,
-#if defined(BSP_UART0_IRQ_PRIORITY)
- .irq_priority = BSP_UART0_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart0,
- &serial0,
- "uart0",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART0_TX,
- HPM_DMA_SRC_UART0_RX,
- 0,
-#endif
-},
-#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
+
+/* ============================================================================
+ * UART Structure Initialization Macro
+ * ============================================================================
+ *
+ * This macro initializes a UART device structure with all necessary configuration
+ * parameters. It automatically sets up hardware addresses, buffer sizes, interrupt
+ * priorities, DMA configuration, and device identification.
+ *
+ * The macro handles:
+ * - Hardware register base addresses
+ * - Buffer size configuration from board definitions
+ * - Interrupt number and priority assignment
+ * - DMA enable flags based on configuration
+ * - Clock source assignment
+ * - Device name generation
+ * - DMA multiplexer source configuration
+ * - DMA resource allocation status initialization
+ *
+ * Usage: UART_INIT_STRUCT(n) where n is the UART number (0-15)
+ */
-#if defined(BSP_USING_UART1)
-{
- HPM_UART1,
- IRQn_UART1,
-#if defined(BSP_UART1_IRQ_PRIORITY)
- .irq_priority = BSP_UART1_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart1,
- &serial1,
- "uart1",
#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART1_TX,
- HPM_DMA_SRC_UART1_RX,
- 0,
-#endif
-},
+#define UART_INIT_STRUCT(n) \
+ { \
+ .uart_base = HPM_UART##n, \
+ .txbuf_size = BSP_UART##n##_TX_BUFSIZE, \
+ .rxbuf_size = BSP_UART##n##_RX_BUFSIZE, \
+ .irq_num = IRQn_UART##n, \
+ .irq_priority = UART_IRQ_PRI_VAL(n), \
+ .enable_dma = (UART_TX_USING_DMA_VAL(n) || UART_RX_USING_DMA_VAL(n)), \
+ .enable_tx_dma = UART_TX_USING_DMA_VAL(n), \
+ .enable_rx_dma = UART_RX_USING_DMA_VAL(n), \
+ .clk_name = clock_uart##n, \
+ .serial = &serial##n, \
+ .device_name = "uart" #n, \
+ .tx_dma_mux = HPM_DMA_SRC_UART##n##_TX, \
+ .rx_dma_mux = HPM_DMA_SRC_UART##n##_RX, \
+ .dma_flags = 0, \
+ .dma_pingpong_size = BSP_UART##n##_DMA_PINGPONG_BUFSIZE, \
+ .rx_buffer_size = BSP_UART##n##_RX_BUFSIZE, \
+ .rx_fifo_index = 0, \
+ }
+#else
+#define UART_INIT_STRUCT(n) \
+ { \
+ .uart_base = HPM_UART##n, \
+ .txbuf_size = BSP_UART##n##_TX_BUFSIZE, \
+ .rxbuf_size = BSP_UART##n##_RX_BUFSIZE, \
+ .irq_num = IRQn_UART##n, \
+ .irq_priority = UART_IRQ_PRI_VAL(n), \
+ .clk_name = clock_uart##n, \
+ .serial = &serial##n, \
+ .device_name = "uart" #n, \
+ .rx_buffer_size = BSP_UART##n##_RX_BUFSIZE, \
+ .rx_fifo_index = 0, \
+ }
#endif
-#if defined(BSP_USING_UART2)
-{
- HPM_UART2,
- IRQn_UART2,
-#if defined(BSP_UART2_IRQ_PRIORITY)
- .irq_priority = BSP_UART2_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
+
+/* ============================================================================
+ * UART Device Array
+ * ============================================================================
+ *
+ * This array contains all configured UART device structures. Each entry is
+ * conditionally compiled based on the BSP_USING_UARTx configuration macros.
+ * The array is used by the driver to manage multiple UART controllers.
+ */
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+#if defined(BSP_USING_UART0)
+struct rt_serial_device serial0;
#endif
- clock_uart2,
- &serial2,
- "uart2",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART2_TX,
- HPM_DMA_SRC_UART2_RX,
- 0,
+#if defined(BSP_USING_UART1)
+struct rt_serial_device serial1;
#endif
-},
+#if defined(BSP_USING_UART2)
+struct rt_serial_device serial2;
#endif
-
#if defined(BSP_USING_UART3)
-{
- HPM_UART3,
- IRQn_UART3,
-#if defined(BSP_UART3_IRQ_PRIORITY)
- .irq_priority = BSP_UART3_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart3,
- &serial3,
- "uart3",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART3_TX,
- HPM_DMA_SRC_UART3_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial3;
#endif
-
#if defined(BSP_USING_UART4)
-{
- HPM_UART4,
- IRQn_UART4,
-#if defined(BSP_UART4_IRQ_PRIORITY)
- .irq_priority = BSP_UART4_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart4,
- &serial4,
- "uart4",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART4_TX,
- HPM_DMA_SRC_UART4_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial4;
#endif
-
#if defined(BSP_USING_UART5)
-{
- HPM_UART5,
- IRQn_UART5,
-#if defined(BSP_UART5_IRQ_PRIORITY)
- .irq_priority = BSP_UART5_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart5,
- &serial5,
- "uart5",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART5_TX,
- HPM_DMA_SRC_UART5_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial5;
#endif
-
#if defined(BSP_USING_UART6)
-{
- HPM_UART6,
- IRQn_UART6,
-#if defined(BSP_UART6_IRQ_PRIORITY)
- .irq_priority = BSP_UART6_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart6,
- &serial6,
- "uart6",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART6_TX,
- HPM_DMA_SRC_UART6_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial6;
#endif
-
#if defined(BSP_USING_UART7)
-{
- HPM_UART7,
- IRQn_UART7,
-#if defined(BSP_UART7_IRQ_PRIORITY)
- .irq_priority = BSP_UART7_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart7,
- &serial7,
- "uart7",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART7_TX,
- HPM_DMA_SRC_UART7_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial7;
#endif
-
#if defined(BSP_USING_UART8)
-{
- HPM_UART8,
- IRQn_UART8,
-#if defined(BSP_UART8_IRQ_PRIORITY)
- .irq_priority = BSP_UART8_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart8,
- &serial8,
- "uart8",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART8_TX,
- HPM_DMA_SRC_UART8_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial8;
#endif
-
#if defined(BSP_USING_UART9)
-{
- HPM_UART9,
- IRQn_UART9,
-#if defined(BSP_UART9_IRQ_PRIORITY)
- .irq_priority = BSP_UART9_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart9,
- &serial9,
- "uart9",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART9_TX,
- HPM_DMA_SRC_UART9_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial9;
#endif
-
#if defined(BSP_USING_UART10)
-{
- HPM_UART10,
- IRQn_UART10,
-#if defined(BSP_UART10_IRQ_PRIORITY)
- .irq_priority = BSP_UART10_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart10,
- &serial10,
- "uart10",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART10_TX,
- HPM_DMA_SRC_UART10_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial10;
#endif
-
#if defined(BSP_USING_UART11)
-{
- HPM_UART11,
- IRQn_UART11,
-#if defined(BSP_UART11_IRQ_PRIORITY)
- .irq_priority = BSP_UART11_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart11,
- &serial11,
- "uart11",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART11_TX,
- HPM_DMA_SRC_UART11_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial11;
#endif
-
#if defined(BSP_USING_UART12)
-{
- HPM_UART12,
- IRQn_UART12,
-#if defined(BSP_UART12_IRQ_PRIORITY)
- .irq_priority = BSP_UART12_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart12,
- &serial12,
- "uart12",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART12_TX,
- HPM_DMA_SRC_UART12_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial12;
#endif
-
#if defined(BSP_USING_UART13)
-{
- HPM_UART13,
- IRQn_UART13,
-#if defined(BSP_UART13_IRQ_PRIORITY)
- .irq_priority = BSP_UART13_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart13,
- &serial13,
- "uart13",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART13_TX,
- HPM_DMA_SRC_UART13_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial13;
#endif
-
#if defined(BSP_USING_UART14)
-{
- HPM_UART14,
- IRQn_UART14,
-#if defined(BSP_UART14_IRQ_PRIORITY)
- .irq_priority = BSP_UART14_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart14,
- &serial14,
- "uart14",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART14_TX,
- HPM_DMA_SRC_UART14_RX,
- 0,
-#endif
-},
+struct rt_serial_device serial14;
#endif
-
#if defined(BSP_USING_UART15)
-{
- HPM_UART15,
- IRQn_UART15,
-#if defined(BSP_UART15_IRQ_PRIORITY)
- .irq_priority = BSP_UART15_IRQ_PRIORITY,
-#else
- .irq_priority = 1,
-#endif
- clock_uart15,
- &serial15,
- "uart15",
-#ifdef RT_SERIAL_USING_DMA
- HPM_DMA_SRC_UART15_TX,
- HPM_DMA_SRC_UART15_RX,
- 0,
+struct rt_serial_device serial15;
#endif
-},
+#if defined(BSP_USING_PUART)
+struct rt_serial_device serial_puart;
#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
-};
-
-enum
+static struct hpm_uart uarts[] =
{
#if defined(BSP_USING_UART0)
- HPM_UART0_INDEX,
+ UART_INIT_STRUCT(0),
#endif
#if defined(BSP_USING_UART1)
- HPM_UART1_INDEX,
+ UART_INIT_STRUCT(1),
#endif
#if defined(BSP_USING_UART2)
- HPM_UART2_INDEX,
+ UART_INIT_STRUCT(2),
#endif
#if defined(BSP_USING_UART3)
- HPM_UART3_INDEX,
+ UART_INIT_STRUCT(3),
#endif
#if defined(BSP_USING_UART4)
- HPM_UART4_INDEX,
+ UART_INIT_STRUCT(4),
#endif
#if defined(BSP_USING_UART5)
- HPM_UART5_INDEX,
+ UART_INIT_STRUCT(5),
#endif
#if defined(BSP_USING_UART6)
- HPM_UART6_INDEX,
+ UART_INIT_STRUCT(6),
#endif
#if defined(BSP_USING_UART7)
- HPM_UART7_INDEX,
+ UART_INIT_STRUCT(7),
#endif
#if defined(BSP_USING_UART8)
- HPM_UART8_INDEX,
+ UART_INIT_STRUCT(8),
#endif
#if defined(BSP_USING_UART9)
- HPM_UART9_INDEX,
+ UART_INIT_STRUCT(9),
#endif
#if defined(BSP_USING_UART10)
- HPM_UART10_INDEX,
+ UART_INIT_STRUCT(10),
#endif
#if defined(BSP_USING_UART11)
- HPM_UART11_INDEX,
+ UART_INIT_STRUCT(11),
#endif
#if defined(BSP_USING_UART12)
- HPM_UART12_INDEX,
+ UART_INIT_STRUCT(12),
#endif
#if defined(BSP_USING_UART13)
- HPM_UART13_INDEX,
+ UART_INIT_STRUCT(13),
#endif
#if defined(BSP_USING_UART14)
- HPM_UART14_INDEX,
+ UART_INIT_STRUCT(14),
#endif
#if defined(BSP_USING_UART15)
- HPM_UART15_INDEX,
+ UART_INIT_STRUCT(15),
+#endif
+
+#if defined(BSP_USING_PUART)
+ {
+ .uart_base = HPM_PUART,
+ .txbuf_size = BSP_PUART_TX_BUFSIZE,
+ .rxbuf_size = BSP_PUART_RX_BUFSIZE,
+ .irq_num = IRQn_PUART,
+ .irq_priority = BSP_PUART_IRQ_PRIORITY,
+ .clk_name = clock_puart,
+ .serial = &serial_puart,
+ .device_name = "puart",
+ .rx_buffer_size = BSP_PUART_RX_BUFSIZE,
+ .rx_fifo_index = 0,
+ }
#endif
};
+
+
#if defined(RT_SERIAL_USING_DMA)
+/**
+ * @brief DMA transfer completion callback
+ *
+ * This function is called when a DMA transfer completes successfully.
+ * It validates the DMA resource and calls the appropriate completion callback.
+ *
+ * @param base DMA controller base address
+ * @param channel DMA channel number
+ * @param user_data Pointer to DMA channel handle
+ */
static void uart_dma_tc_callback(DMA_Type *base, uint32_t channel, void *user_data)
{
hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
+
+ /* Validate DMA resource to ensure this callback is for the correct channel */
+ if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
+ {
+ return;
+ }
+
+ /* Call the transfer completion callback */
+ if (dma_handle->transfer_done != RT_NULL) {
+ dma_handle->transfer_done(dma_handle->serial);
+ }
+}
+
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+/**
+ * @brief DMA half transfer completion callback
+ *
+ * This function is called when a DMA transfer reaches half completion.
+ * It validates the DMA resource and calls the appropriate half transfer callback.
+ *
+ * @param base DMA controller base address
+ * @param channel DMA channel number
+ * @param user_data Pointer to DMA channel handle
+ */
+static void uart_dma_htc_callback(DMA_Type *base, uint32_t channel, void *user_data)
+{
+ hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
+
+ /* Validate DMA resource to ensure this callback is for the correct channel */
if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
{
return;
}
- dma_handle->tranfer_done(dma_handle->serial);
+
+ /* Call the half transfer completion callback */
+ if (dma_handle->halftransfer_cb != RT_NULL) {
+ dma_handle->halftransfer_cb(dma_handle->serial);
+ }
+}
+
+#endif
+
+/**
+ * @brief DMA receive interrupt service routine
+ *
+ * This function handles DMA receive interrupts, processes received data,
+ * and notifies the RT-Thread serial framework about the received data.
+ *
+ * @param serial Pointer to the serial device structure
+ * @param isr_flag Interrupt flag indicating the type of interrupt
+ */
+static void dma_recv_isr(struct rt_serial_device *serial, rt_uint8_t isr_flag)
+{
+ rt_size_t recv_len, counter;
+ rt_base_t level;
+ RT_ASSERT(serial != RT_NULL);
+ struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
+
+ /* Skip processing if ping buffer is not configured */
+ if (serial->config.dma_ping_bufsz == 0) {
+ return;
+ }
+
+ if (isr_flag == UART_RX_DMA_IT_TC_FLAG) {
+ level = rt_hw_interrupt_disable();
+ dma_mgr_disable_channel(&uart->rx_chn_ctx.resource);
+ }
+ counter = dma_get_remaining_transfer_size(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel);
+ if (counter <= uart->dma_rx_remain_size) {
+ recv_len = uart->dma_rx_remain_size - counter;
+ } else {
+ recv_len = serial->config.dma_ping_bufsz + uart->dma_rx_remain_size - counter;
+ }
+ if (recv_len > 0) {
+ rt_uint8_t *ptr = NULL;
+ rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, (void *)&ptr);
+ if (l1c_dc_is_enabled()) {
+ uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)ptr);
+ uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)ptr + serial->config.dma_ping_bufsz);
+ uint32_t aligned_size = aligned_end - aligned_start;
+ l1c_dc_invalidate(aligned_start, aligned_size);
+ }
+ uart->dma_rx_remain_size = counter;
+ rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
+ }
+ if (isr_flag == UART_RX_DMA_IT_TC_FLAG) {
+ rt_hw_interrupt_enable(level);
+ dma_mgr_enable_channel(&uart->rx_chn_ctx.resource);
+ }
}
+/**
+ * @brief DMA transfer abort callback
+ *
+ * This function is called when a DMA transfer is aborted.
+ * It validates the DMA resource and calls the appropriate abort callback.
+ *
+ * @param base DMA controller base address
+ * @param channel DMA channel number
+ * @param user_data Pointer to DMA channel handle
+ */
static void uart_dma_abort_callback(DMA_Type *base, uint32_t channel, void *user_data)
{
hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
+
+ /* Validate DMA resource to ensure this callback is for the correct channel */
if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
{
return;
}
- dma_handle->tranfer_abort(dma_handle->serial);
+
+ /* Call the transfer abort callback */
+ if (dma_handle->transfer_abort != RT_NULL) {
+ dma_handle->transfer_abort(dma_handle->serial);
+ }
}
+/**
+ * @brief DMA transfer error callback
+ *
+ * This function is called when a DMA transfer encounters an error.
+ * It validates the DMA resource and calls the appropriate error callback.
+ *
+ * @param base DMA controller base address
+ * @param channel DMA channel number
+ * @param user_data Pointer to DMA channel handle
+ */
static void uart_dma_error_callback(DMA_Type *base, uint32_t channel, void *user_data)
{
hpm_dma_channel_handle_t *dma_handle = (hpm_dma_channel_handle_t*)user_data;
+
+ /* Validate DMA resource to ensure this callback is for the correct channel */
if ((dma_handle->resource.base != base) || (dma_handle->resource.channel != channel))
{
return;
}
- dma_handle->tranfer_error(dma_handle->serial);
+
+ /* Call the transfer error callback */
+ if (dma_handle->transfer_error != RT_NULL) {
+ dma_handle->transfer_error(dma_handle->serial);
+ }
}
+/**
+ * @brief UART TX DMA transfer completion handler
+ *
+ * This function is called when a TX DMA transfer completes.
+ * It notifies the RT-Thread serial framework about the completion.
+ *
+ * @param serial Pointer to the serial device structure
+ */
static void uart_tx_done(struct rt_serial_device *serial)
{
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DMADONE);
}
+/**
+ * @brief UART RX DMA transfer completion handler
+ *
+ * This function is called when an RX DMA transfer completes.
+ * It handles cache coherency, processes received data, and notifies
+ * the RT-Thread serial framework about the completion.
+ *
+ * @param serial Pointer to the serial device structure
+ */
static void uart_rx_done(struct rt_serial_device *serial)
{
struct rt_serial_rx_fifo *rx_fifo;
rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
- #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
- uint32_t uart_recv_data_count = 0;
- struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
- uint32_t rx_idle_tmp_buffer_size = sizeof(uart->rx_idle_tmp_buffer);
- uart_recv_data_count = rx_idle_tmp_buffer_size - dma_get_remaining_transfer_size(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel);
- if (l1c_dc_is_enabled()) {
- uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)uart->rx_idle_tmp_buffer);
- uint32_t aligned_end = HPM_L1C_CACHELINE_ALIGN_UP((uint32_t)uart->rx_idle_tmp_buffer + rx_idle_tmp_buffer_size);
- uint32_t aligned_size = aligned_end - aligned_start;
- l1c_dc_invalidate(aligned_start, aligned_size);
- }
- /* if open uart again after closing uart, an idle interrupt may be triggered, but uart initialization is not performed at this time, and the program exits if the rxfifo is empty. */
- if (rx_fifo == RT_NULL) {
- return;
- }
- rt_ringbuffer_put(&(rx_fifo->rb), uart->rx_idle_tmp_buffer, uart_recv_data_count);
- rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE);
+#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
+ dma_recv_isr(serial, UART_RX_DMA_IT_TC_FLAG);
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ /* DMAV2 supports circular mode, no need to reconfigure DMA, can return directly */
+ return;
+#endif
#else
if (l1c_dc_is_enabled()) {
uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)rx_fifo->rb.buffer_ptr);
@@ -711,18 +694,46 @@ static void uart_rx_done(struct rt_serial_device *serial)
l1c_dc_invalidate(aligned_start, aligned_size);
}
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (serial->config.rx_bufsz << 8));
-#endif
/* prepare for next read */
+#endif
hpm_uart_receive_dma_next(serial);
}
+
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+/**
+ * @brief UART RX DMA half transfer completion handler
+ *
+ * This function is called when an RX DMA transfer reaches half completion.
+ * It handles cache coherency and processes received data.
+ *
+ * @param serial Pointer to the serial device structure
+ */
+static void uart_rx_half_done(struct rt_serial_device *serial)
+{
+ dma_recv_isr(serial, UART_RX_DMA_IT_HT_FLAG);
+}
+#endif
#endif /* RT_SERIAL_USING_DMA */
/**
- * @brief UART common interrupt process. This
+ * @brief UART common interrupt service routine
+ *
+ * This function handles all UART interrupt events including:
+ * - RX data available: Reads data from UART FIFO and stores in ring buffer
+ * - RX timeout: Handles timeout conditions and overrun errors
+ * - TX slot available: Transmits data from ring buffer to UART FIFO
+ * - RX idle detection: Handles DMA-based RX idle detection (if supported)
*
- * @param serial Serial device
+ * The function processes interrupts efficiently by reading multiple bytes
+ * when possible and managing ring buffer operations.
+ *
+ * @param serial Pointer to the serial device structure
*/
+#ifndef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
static void hpm_uart_isr(struct rt_serial_device *serial)
+#else
+static void hpm_uart_isr(int vector, struct rt_serial_device *serial)
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
{
struct hpm_uart *uart;
rt_uint32_t stat, enabled_irq;
@@ -743,6 +754,7 @@ static void hpm_uart_isr(struct rt_serial_device *serial)
if (irq_id == uart_intr_id_rx_data_avail) {
while (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
count++;
+ uart->rx_fifo_index++;
put_char = uart_read_byte(uart->uart_base);
rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
/*in order to ensure rx fifo there are remaining bytes*/
@@ -751,26 +763,31 @@ static void hpm_uart_isr(struct rt_serial_device *serial)
}
}
}
-
+ /* check if RX FIFO index has reached minimum buffer size */
+ if (uart->rx_fifo_index >= RT_SERIAL_RX_MINBUFSZ) {
+ rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
+ uart->rx_fifo_index = 0;
+ }
if (irq_id == uart_intr_id_rx_timeout) {
while ((uart_check_status(uart->uart_base, uart_stat_data_ready)) || (uart_check_status(uart->uart_base, uart_stat_overrun_error))) {
put_char= uart_read_byte(uart->uart_base);
rt_ringbuffer_putchar(&(rx_fifo->rb), put_char);
}
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);
+ uart->rx_fifo_index = 0;
}
- if ((irq_id & uart_intr_tx_slot_avail) && (stat & uart_stat_tx_slot_avail)) {
+ if ((irq_id == uart_intr_tx_slot_avail) && (stat & uart_stat_tx_slot_avail)) {
/* UART in mode Transmitter */
struct rt_serial_tx_fifo *tx_fifo;
tx_fifo = (struct rt_serial_tx_fifo *) serial->serial_tx;
RT_ASSERT(tx_fifo != RT_NULL);
rt_uint8_t put_char = 0;
uint32_t fifo_size = 0, ringbuffer_data_len = 0, tx_size = 0;
- uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
fifo_size = uart_get_fifo_size(uart->uart_base);
ringbuffer_data_len = rt_ringbuffer_data_len(&tx_fifo->rb);
- if (ringbuffer_data_len <= 0) {
+ if (ringbuffer_data_len == 0) {
+ uart_disable_irq(uart->uart_base, uart_intr_tx_slot_avail);
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_TX_DONE);
} else {
tx_size = (ringbuffer_data_len > fifo_size) ? fifo_size : ringbuffer_data_len;
@@ -778,25 +795,31 @@ static void hpm_uart_isr(struct rt_serial_device *serial)
rt_ringbuffer_getchar(&tx_fifo->rb, &put_char);
uart_write_byte(uart->uart_base, put_char);
}
- uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
}
}
- #if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
+#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1) && defined(RT_SERIAL_USING_DMA)
if (uart_is_rxline_idle(uart->uart_base)) {
- if ((uart->rx_chn_ctx.resource.base != RT_NULL) && (dma_get_remaining_transfer_size(uart->rx_chn_ctx.resource.base, uart->rx_chn_ctx.resource.channel) > 0)) {
- /* if the rxline is idle, but the dma transfer is not finished, it means that the rxline idle interrupt is triggered before the dma transfer is finished */
- uart_rx_done(serial);
- }
uart_clear_rxline_idle_flag(uart->uart_base);
- uart_flush(uart->uart_base);
+ dma_recv_isr(serial, UART_RX_DMA_IT_IDLE_FLAG);
}
#endif
}
+/**
+ * @brief Configure UART parameters
+ *
+ * This function configures the UART hardware with the specified parameters
+ * including baud rate, data bits, stop bits, parity, and DMA settings.
+ * It also initializes the UART pins and clock configuration.
+ *
+ * @param serial Pointer to the serial device structure
+ * @param cfg Pointer to the serial configuration structure
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static rt_err_t hpm_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg)
{
-
+ /* Validate input parameters */
RT_ASSERT(serial != RT_NULL);
RT_ASSERT(cfg != RT_NULL);
@@ -849,6 +872,9 @@ hpm_stat_t hpm_uart_dma_rx_init(struct hpm_uart *uart_ctx)
uart_ctx->dma_flags |= RT_DEVICE_FLAG_DMA_RX;
uart_ctx->rx_resource_allocated = true;
dma_mgr_install_chn_tc_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_tc_callback, &uart_ctx->rx_chn_ctx);
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ dma_mgr_install_chn_half_tc_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_htc_callback, &uart_ctx->rx_chn_ctx);
+#endif
dma_mgr_install_chn_abort_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_abort_callback, &uart_ctx->rx_chn_ctx);
dma_mgr_install_chn_error_callback(&uart_ctx->rx_chn_ctx.resource, uart_dma_error_callback, &uart_ctx->rx_chn_ctx);
}
@@ -890,12 +916,18 @@ static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg)
chg_config.dmamux_src = uart->rx_dma_mux;
chg_config.src_addr = (uint32_t)&(uart->uart_base->RBR);
chg_config.src_addr_ctrl = DMA_MGR_ADDRESS_CONTROL_FIXED;
- chg_config.src_mode = DMA_HANDSHAKE_MODE_HANDSHAKE;
+ chg_config.src_mode = DMA_MGR_HANDSHAKE_MODE_HANDSHAKE;
chg_config.src_width = DMA_TRANSFER_WIDTH_BYTE;
#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
- chg_config.dst_addr = (uint32_t)uart->rx_idle_tmp_buffer;
- chg_config.size_in_byte = sizeof(uart->rx_idle_tmp_buffer);
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ chg_config.en_infiniteloop = true;
+#endif
+ uart->dma_rx_remain_size = serial->config.dma_ping_bufsz;
+ rt_uint8_t *ptr = NULL;
+ rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, (void *)&ptr);
+ chg_config.dst_addr = (uint32_t)ptr;
+ chg_config.size_in_byte = serial->config.dma_ping_bufsz;
#else
chg_config.dst_addr = (uint32_t)rx_fifo->rb.buffer_ptr;
chg_config.size_in_byte = serial->config.rx_bufsz;
@@ -904,9 +936,14 @@ static int hpm_uart_dma_config(struct rt_serial_device *serial, void *arg)
return -RT_ERROR;
}
dma_mgr_enable_channel(&uart->rx_chn_ctx.resource);
+#ifdef HPMSOC_HAS_HPMSDK_DMAV2
+ dma_mgr_enable_chn_irq(&uart->rx_chn_ctx.resource, DMA_MGR_INTERRUPT_MASK_TC | DMA_MGR_INTERRUPT_MASK_HALF_TC);
+ hpm_uart_dma_register_channel(serial, false, uart_rx_done, uart_rx_half_done, RT_NULL, RT_NULL);
+#else
dma_mgr_enable_chn_irq(&uart->rx_chn_ctx.resource, DMA_MGR_INTERRUPT_MASK_TC);
- dma_mgr_enable_dma_irq_with_priority(&uart->rx_chn_ctx.resource, 1);
- hpm_uart_dma_register_channel(serial, false, uart_rx_done, RT_NULL, RT_NULL);
+ hpm_uart_dma_register_channel(serial, false, uart_rx_done, RT_NULL, RT_NULL, RT_NULL);
+#endif
+ dma_mgr_enable_dma_irq_with_priority(&uart->rx_chn_ctx.resource, uart->irq_priority);
#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
#endif
@@ -936,8 +973,11 @@ static void hpm_uart_receive_dma_next(struct rt_serial_device *serial)
struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx;
#if defined(HPM_IP_FEATURE_UART_RX_IDLE_DETECT) && (HPM_IP_FEATURE_UART_RX_IDLE_DETECT == 1)
- buf_addr = (uint32_t)uart->rx_idle_tmp_buffer;
- buf_size = sizeof(uart->rx_idle_tmp_buffer);
+ rt_uint8_t *ptr = NULL;
+ uart->dma_rx_remain_size = serial->config.dma_ping_bufsz;
+ rt_hw_serial_control_isr(serial, RT_HW_SERIAL_CTRL_GET_DMA_PING_BUF, (void *)&ptr);
+ buf_addr = (uint32_t)ptr;
+ buf_size = serial->config.dma_ping_bufsz;
#else
buf_addr = (uint32_t)rx_fifo->rb.buffer_ptr;
buf_size = serial->config.rx_bufsz;
@@ -957,8 +997,23 @@ static void hpm_uart_transmit_dma(struct rt_serial_device *serial, uint8_t *src,
#endif /* RT_SERIAL_USING_DMA */
+/**
+ * @brief Control UART operations
+ *
+ * This function handles various UART control operations including:
+ * - Interrupt enable/disable (RX/TX)
+ * - DMA enable/disable and configuration
+ * - Buffer allocation and management
+ * - Operation mode checking
+ *
+ * @param serial Pointer to the serial device structure
+ * @param cmd Control command (RT_DEVICE_CTRL_*)
+ * @param arg Command argument
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void *arg)
{
+ /* Validate input parameters */
RT_ASSERT(serial != RT_NULL);
rt_ubase_t ctrl_arg = (rt_ubase_t) arg;
@@ -1032,35 +1087,65 @@ static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void
intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
} else if (ctrl_arg == RT_DEVICE_FLAG_INT_TX) {
/* enable tx irq */
- uart_enable_irq(uart->uart_base, uart_intr_tx_slot_avail);
intc_m_enable_irq_with_priority(uart->irq_num, uart->irq_priority);
}
break;
case RT_DEVICE_CTRL_CONFIG:
#ifdef RT_SERIAL_USING_DMA
- if ((ctrl_arg == RT_DEVICE_FLAG_DMA_RX) || (ctrl_arg == RT_DEVICE_FLAG_INT_RX)) {
- if ((rx_fifo) && (((rt_uint32_t)rx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (rx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
- rt_free(rx_fifo);
+ if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) {
+ if ((!rx_fifo) || (((rt_uint32_t)rx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (rx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
+ if (rx_fifo) {
+ rt_free(rx_fifo);
+ }
rx_fifo = RT_NULL;
rx_fifo = (struct rt_serial_rx_fifo *) rt_malloc(sizeof(struct rt_serial_rx_fifo));
RT_ASSERT(rx_fifo != RT_NULL);
- tmp_buffer = rt_malloc(serial->config.rx_bufsz + HPM_L1C_CACHELINE_SIZE);
+
+ /* Calculate total buffer size needed for both ring buffers plus alignment padding */
+ rt_uint32_t rx_tmp_size = serial->config.rx_bufsz + serial->config.dma_ping_bufsz;
+ /* Allocate extra cacheline size for alignment:
+ * - 1x for main buffer alignment
+ * - 1x for ping buffer alignment (if ping buffer is used)
+ */
+ rt_uint32_t extra_align = (serial->config.dma_ping_bufsz > 0) ?
+ (2 * HPM_L1C_CACHELINE_SIZE) : HPM_L1C_CACHELINE_SIZE;
+ if (rx_tmp_size > (UINT32_MAX - extra_align)) {
+ return -RT_ERROR;
+ }
+ tmp_buffer = rt_malloc(rx_tmp_size + extra_align);
RT_ASSERT(tmp_buffer != RT_NULL);
+
+ /* Free old buffer if exists */
if (uart->rx_chn_ctx.ringbuf_ptr != RT_NULL) {
rt_free(uart->rx_chn_ctx.ringbuf_ptr);
}
+ /* Save original pointer for later deallocation */
uart->rx_chn_ctx.ringbuf_ptr = (void *)tmp_buffer;
+
+ /* Align first buffer (main RX ring buffer) */
tmp_buffer += (HPM_L1C_CACHELINE_SIZE - ((rt_ubase_t) tmp_buffer % HPM_L1C_CACHELINE_SIZE));
rt_ringbuffer_init(&rx_fifo->rb, tmp_buffer, serial->config.rx_bufsz);
rt_ringbuffer_reset(&rx_fifo->rb);
+
+ /* Initialize DMA ping buffer only if size is non-zero */
+ if (serial->config.dma_ping_bufsz > 0) {
+ /* Move to next buffer position and align DMA ping buffer */
+ tmp_buffer += serial->config.rx_bufsz; /* Move past the main buffer */
+ tmp_buffer += (HPM_L1C_CACHELINE_SIZE - ((rt_ubase_t) tmp_buffer % HPM_L1C_CACHELINE_SIZE));
+ rt_ringbuffer_init(&rx_fifo->dma_ping_rb, tmp_buffer, serial->config.dma_ping_bufsz);
+ rt_ringbuffer_reset(&rx_fifo->dma_ping_rb);
+ }
+
serial->serial_rx = rx_fifo;
}
}
- if ((ctrl_arg == RT_DEVICE_FLAG_DMA_TX) || (ctrl_arg == RT_DEVICE_FLAG_INT_TX)) {
- if ((tx_fifo) && (((rt_uint32_t)tx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (tx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
- rt_free(tx_fifo);
+ if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) {
+ if ((!tx_fifo) || (((rt_uint32_t)tx_fifo->rb.buffer_ptr % HPM_L1C_CACHELINE_SIZE) || (tx_fifo->rb.buffer_size % HPM_L1C_CACHELINE_SIZE))) {
+ if (tx_fifo) {
+ rt_free(tx_fifo);
+ }
tx_fifo = RT_NULL;
tx_fifo = (struct rt_serial_tx_fifo *) rt_malloc(sizeof(struct rt_serial_tx_fifo));
RT_ASSERT(tx_fifo != RT_NULL);
@@ -1102,19 +1187,44 @@ static rt_err_t hpm_uart_control(struct rt_serial_device *serial, int cmd, void
}
+/**
+ * @brief Send a single character via UART
+ *
+ * This function sends a single character through the UART interface.
+ * It uses blocking operation and flushes the UART buffer after transmission.
+ *
+ * @param serial Pointer to the serial device structure
+ * @param ch Character to send
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static int hpm_uart_putc(struct rt_serial_device *serial, char ch)
{
- struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
- uart_send_byte(uart->uart_base, ch);
- uart_flush(uart->uart_base);
- return ch;
+ hpm_stat_t stat;
+ struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
+
+ /* Send the character and flush the UART buffer */
+ stat = uart_send_byte(uart->uart_base, ch);
+ if (stat == status_success) {
+ stat = uart_flush(uart->uart_base);
+ }
+ return (stat == status_success) ? RT_EOK : -RT_ERROR;
}
+/**
+ * @brief Receive a single character from UART
+ *
+ * This function receives a single character from the UART interface.
+ * It checks if data is available before attempting to read.
+ *
+ * @param serial Pointer to the serial device structure
+ * @return The received character, or -1 if no data is available
+ */
static int hpm_uart_getc(struct rt_serial_device *serial)
{
int result = -1;
struct hpm_uart *uart = (struct hpm_uart *)serial->parent.user_data;
+ /* Check if data is available in the UART FIFO */
if (uart_check_status(uart->uart_base, uart_stat_data_ready)) {
uart_receive_byte(uart->uart_base, (uint8_t*)&result);
}
@@ -1122,6 +1232,18 @@ static int hpm_uart_getc(struct rt_serial_device *serial)
return result;
}
+/**
+ * @brief Transmit data via UART
+ *
+ * This function transmits data through the UART interface using either
+ * DMA or interrupt-driven methods based on the configuration.
+ *
+ * @param serial Pointer to the serial device structure
+ * @param buf Pointer to the data buffer to transmit
+ * @param size Number of bytes to transmit
+ * @param tx_flag Transmission flags
+ * @return Number of bytes transmitted
+ */
static rt_ssize_t hpm_uart_transmit(struct rt_serial_device *serial,
rt_uint8_t *buf,
rt_size_t size,
@@ -1139,7 +1261,7 @@ static rt_ssize_t hpm_uart_transmit(struct rt_serial_device *serial,
RT_ASSERT(tx_fifo != RT_NULL);
#ifdef RT_SERIAL_USING_DMA
if (uart->dma_flags & RT_DEVICE_FLAG_DMA_TX) {
- hpm_uart_dma_register_channel(serial, true, uart_tx_done, RT_NULL, RT_NULL);
+ hpm_uart_dma_register_channel(serial, true, uart_tx_done, RT_NULL, RT_NULL, RT_NULL);
intc_m_enable_irq(uart->tx_chn_ctx.resource.irq_num);
if (l1c_dc_is_enabled()) {
uint32_t aligned_start = HPM_L1C_CACHELINE_ALIGN_DOWN((uint32_t)buf);
@@ -1171,398 +1293,92 @@ static rt_ssize_t hpm_uart_transmit(struct rt_serial_device *serial,
return size;
}
+/**
+ * @brief UART operations structure
+ *
+ * This structure defines the function pointers for all UART operations.
+ * It provides the interface between RT-Thread's serial framework and
+ * the HPM UART driver implementation.
+ */
static const struct rt_uart_ops hpm_uart_ops = {
- hpm_uart_configure,
- hpm_uart_control,
- hpm_uart_putc,
- hpm_uart_getc,
- hpm_uart_transmit,
+ .configure = hpm_uart_configure, /* Configure UART parameters */
+ .control = hpm_uart_control, /* Control UART operations */
+ .putc = hpm_uart_putc, /* Send single character */
+ .getc = hpm_uart_getc, /* Receive single character */
+ .transmit = hpm_uart_transmit, /* Transmit data buffer */
};
+/**
+ * @brief Configure all UART devices
+ *
+ * This function configures all enabled UART devices with default settings
+ * and initializes DMA resources if configured. It sets up buffer sizes,
+ * DMA channels, and other device-specific parameters.
+ *
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
static int hpm_uart_config(void)
{
- struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
- hpm_stat_t status = status_success;
-
-#ifdef BSP_USING_UART0
- uarts[HPM_UART0_INDEX].serial->config = config;
- uarts[HPM_UART0_INDEX].serial->config.rx_bufsz = BSP_UART0_RX_BUFSIZE;
- uarts[HPM_UART0_INDEX].serial->config.tx_bufsz = BSP_UART0_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART0_INDEX].dma_flags = 0;
-#ifdef BSP_UART0_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART0_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART0_RX_USING_DMA
-#ifdef BSP_UART0_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART0_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART0_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART0
-
-#ifdef BSP_USING_UART1
- uarts[HPM_UART1_INDEX].serial->config = config;
- uarts[HPM_UART1_INDEX].serial->config.rx_bufsz = BSP_UART1_RX_BUFSIZE;
- uarts[HPM_UART1_INDEX].serial->config.tx_bufsz = BSP_UART1_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART1_INDEX].dma_flags = 0;
-#ifdef BSP_UART1_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART1_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART1_RX_USING_DMA
-#ifdef BSP_UART1_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART1_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART1_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART1
-
-#ifdef BSP_USING_UART2
- uarts[HPM_UART2_INDEX].serial->config = config;
- uarts[HPM_UART2_INDEX].serial->config.rx_bufsz = BSP_UART2_RX_BUFSIZE;
- uarts[HPM_UART2_INDEX].serial->config.tx_bufsz = BSP_UART2_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART2_INDEX].dma_flags = 0;
-#ifdef BSP_UART2_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART2_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART2_RX_USING_DMA
-#ifdef BSP_UART2_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART2_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART2_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART2
-
-#ifdef BSP_USING_UART3
- uarts[HPM_UART3_INDEX].serial->config = config;
- uarts[HPM_UART3_INDEX].serial->config.rx_bufsz = BSP_UART3_RX_BUFSIZE;
- uarts[HPM_UART3_INDEX].serial->config.tx_bufsz = BSP_UART3_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART3_INDEX].dma_flags = 0;
-#ifdef BSP_UART3_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART3_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART3_RX_USING_DMA
-#ifdef BSP_UART3_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART3_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART3_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART3
-
-#ifdef BSP_USING_UART4
- uarts[HPM_UART4_INDEX].serial->config = config;
- uarts[HPM_UART4_INDEX].serial->config.rx_bufsz = BSP_UART4_RX_BUFSIZE;
- uarts[HPM_UART4_INDEX].serial->config.tx_bufsz = BSP_UART4_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART4_INDEX].dma_flags = 0;
-#ifdef BSP_UART4_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART4_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART4_RX_USING_DMA
-#ifdef BSP_UART4_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART4_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART4_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART4
-
-#ifdef BSP_USING_UART5
- uarts[HPM_UART5_INDEX].serial->config = config;
- uarts[HPM_UART5_INDEX].serial->config.rx_bufsz = BSP_UART5_RX_BUFSIZE;
- uarts[HPM_UART5_INDEX].serial->config.tx_bufsz = BSP_UART5_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART5_INDEX].dma_flags = 0;
-#ifdef BSP_UART5_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART5_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART5_RX_USING_DMA
-#ifdef BSP_UART5_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART5_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART5_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART5
-
-#ifdef BSP_USING_UART6
- uarts[HPM_UART6_INDEX].serial->config = config;
- uarts[HPM_UART6_INDEX].serial->config.rx_bufsz = BSP_UART6_RX_BUFSIZE;
- uarts[HPM_UART6_INDEX].serial->config.tx_bufsz = BSP_UART6_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART6_INDEX].dma_flags = 0;
-#ifdef BSP_UART6_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART6_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART6_RX_USING_DMA
-#ifdef BSP_UART6_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART6_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART6_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART6
-
-#ifdef BSP_USING_UART7
- uarts[HPM_UART7_INDEX].serial->config = config;
- uarts[HPM_UART7_INDEX].serial->config.rx_bufsz = BSP_UART7_RX_BUFSIZE;
- uarts[HPM_UART7_INDEX].serial->config.tx_bufsz = BSP_UART7_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART7_INDEX].dma_flags = 0;
-#ifdef BSP_UART7_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART7_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART7_RX_USING_DMA
-#ifdef BSP_UART7_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART7_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART7_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART7
-
-#ifdef BSP_USING_UART8
- uarts[HPM_UART8_INDEX].serial->config = config;
- uarts[HPM_UART8_INDEX].serial->config.rx_bufsz = BSP_UART8_RX_BUFSIZE;
- uarts[HPM_UART8_INDEX].serial->config.tx_bufsz = BSP_UART8_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART8_INDEX].dma_flags = 0;
-#ifdef BSP_UART8_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART8_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART8_RX_USING_DMA
-#ifdef BSP_UART8_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART8_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART8_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART8
-
-#ifdef BSP_USING_UART9
- uarts[HPM_UART9_INDEX].serial->config = config;
- uarts[HPM_UART9_INDEX].serial->config.rx_bufsz = BSP_UART9_RX_BUFSIZE;
- uarts[HPM_UART9_INDEX].serial->config.tx_bufsz = BSP_UART9_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART9_INDEX].dma_flags = 0;
-#ifdef BSP_UART9_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART9_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART9_RX_USING_DMA
-#ifdef BSP_UART9_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART9_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART9_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART9
-
-#ifdef BSP_USING_UART10
- uarts[HPM_UART10_INDEX].serial->config = config;
- uarts[HPM_UART10_INDEX].serial->config.rx_bufsz = BSP_UART10_RX_BUFSIZE;
- uarts[HPM_UART10_INDEX].serial->config.tx_bufsz = BSP_UART10_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART10_INDEX].dma_flags = 0;
-#ifdef BSP_UART10_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART10_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART10_RX_USING_DMA
-#ifdef BSP_UART10_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART10_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART10_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART10
-
-#ifdef BSP_USING_UART11
- uarts[HPM_UART11_INDEX].serial->config = config;
- uarts[HPM_UART11_INDEX].serial->config.rx_bufsz = BSP_UART11_RX_BUFSIZE;
- uarts[HPM_UART11_INDEX].serial->config.tx_bufsz = BSP_UART11_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART11_INDEX].dma_flags = 0;
-#ifdef BSP_UART11_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART11_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART11_RX_USING_DMA
-#ifdef BSP_UART11_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART11_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART11_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART11
-
-#ifdef BSP_USING_UART12
- uarts[HPM_UART12_INDEX].serial->config = config;
- uarts[HPM_UART12_INDEX].serial->config.rx_bufsz = BSP_UART12_RX_BUFSIZE;
- uarts[HPM_UART12_INDEX].serial->config.tx_bufsz = BSP_UART12_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART12_INDEX].dma_flags = 0;
-#ifdef BSP_UART12_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART12_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART12_RX_USING_DMA
-#ifdef BSP_UART12_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART12_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART12_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART12
-
-#ifdef BSP_USING_UART13
- uarts[HPM_UART13_INDEX].serial->config = config;
- uarts[HPM_UART13_INDEX].serial->config.rx_bufsz = BSP_UART13_RX_BUFSIZE;
- uarts[HPM_UART13_INDEX].serial->config.tx_bufsz = BSP_UART13_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART13_INDEX].dma_flags = 0;
-#ifdef BSP_UART13_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART13_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART13_RX_USING_DMA
-#ifdef BSP_UART13_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART13_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART13_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART13
-
-#ifdef BSP_USING_UART14
- uarts[HPM_UART14_INDEX].serial->config = config;
- uarts[HPM_UART14_INDEX].serial->config.rx_bufsz = BSP_UART14_RX_BUFSIZE;
- uarts[HPM_UART14_INDEX].serial->config.tx_bufsz = BSP_UART14_TX_BUFSIZE;
-#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART14_INDEX].dma_flags = 0;
-#ifdef BSP_UART14_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART14_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART14_RX_USING_DMA
-#ifdef BSP_UART14_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART14_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART14_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART14
-
-#ifdef BSP_USING_UART15
- uarts[HPM_UART15_INDEX].serial->config = config;
- uarts[HPM_UART15_INDEX].serial->config.rx_bufsz = BSP_UART15_RX_BUFSIZE;
- uarts[HPM_UART15_INDEX].serial->config.tx_bufsz = BSP_UART15_TX_BUFSIZE;
+ struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT; /* Default serial configuration */
+ hpm_stat_t status = status_success; /* DMA initialization status */
+
+ for (uint32_t i=0; i < ARRAY_SIZE(uarts); i++) {
+ struct hpm_uart *uart = &uarts[i];
+ uart->serial->config = config;
+ uart->serial->config.rx_bufsz = uart->rxbuf_size;
+ uart->serial->config.tx_bufsz = uart->txbuf_size;
+ uart->dma_flags = 0;
+ if (uart->enable_rx_dma) {
+#if defined (RT_SERIAL_USING_DMA)
+ status = hpm_uart_dma_rx_init(uart);
+ if (status != status_success) {
+ return -RT_ERROR;
+ }
+#else
+ return -RT_ERROR;
+#endif
+ } else {
+ uart->dma_flags = (uart->dma_flags & ~RT_DEVICE_FLAG_DMA_RX) | RT_DEVICE_FLAG_INT_RX;
+ }
+ if (uart->enable_tx_dma) {
+#if defined (RT_SERIAL_USING_DMA)
+ status = hpm_uart_dma_tx_init(uart);
+ if (status != status_success) {
+ return -RT_ERROR;
+ }
+#else
+ return -RT_ERROR;
+#endif
+ } else {
+ uart->dma_flags = (uart->dma_flags & ~RT_DEVICE_FLAG_DMA_TX) | RT_DEVICE_FLAG_INT_TX;
+ }
#ifdef RT_SERIAL_USING_DMA
- uarts[HPM_UART15_INDEX].dma_flags = 0;
-#ifdef BSP_UART15_RX_USING_DMA
- status = hpm_uart_dma_rx_init(&uarts[HPM_UART15_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
- }
-#endif //BSP_UART15_RX_USING_DMA
-#ifdef BSP_UART15_TX_USING_DMA
- status = hpm_uart_dma_tx_init(&uarts[HPM_UART15_INDEX]);
- if (status != status_success)
- {
- return -RT_ERROR;
+ if (uart->enable_rx_dma) {
+ uart->serial->config.dma_ping_bufsz = uart->dma_pingpong_size;
+ }
+#endif
}
-#endif //BSP_UART15_TX_USING_DMA
-#endif // RT_SERIAL_USING_DMA
-#endif //BSP_USING_UART15
-
return RT_EOK;
}
+/**
+ * @brief Initialize UART hardware
+ *
+ * This function initializes all configured UART devices and registers them
+ * with the RT-Thread device framework. It includes protection against
+ * multiple initialization calls.
+ *
+ * @return RT_EOK on success, -RT_ERROR on failure
+ */
int rt_hw_uart_init(void)
{
- /* Added bypass logic here since the rt_hw_uart_init function will be initialized twice, the 2nd initialization should be bypassed */
+ /* Protection against multiple initialization calls */
static bool initialized;
rt_err_t err = RT_EOK;
+
if (initialized)
{
return err;
@@ -1576,7 +1392,7 @@ int rt_hw_uart_init(void)
return -RT_ERROR;
}
- for (uint32_t i = 0; i < sizeof(uarts) / sizeof(uarts[0]); i++) {
+ for (uint32_t i = 0; i < ARRAY_SIZE(uarts); i++) {
uarts[i].serial->ops = &hpm_uart_ops;
/* register UART device */
@@ -1584,11 +1400,16 @@ int rt_hw_uart_init(void)
uarts[i].device_name,
RT_DEVICE_FLAG_RDWR,
(void*)&uarts[i]);
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register UART device to irq table */
+ rt_hw_interrupt_install(uarts[i].irq_num, (rt_isr_handler_t)hpm_uart_isr, uarts[i].serial, uarts[i].device_name);
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
}
return err;
}
+/* Register UART initialization function to be called during board initialization */
INIT_BOARD_EXPORT(rt_hw_uart_init);
-#endif /* RT_USING_SERIAL */
+#endif /* RT_USING_SERIAL_V2 */
diff --git a/bsp/hpmicro/libraries/drivers/drv_uart_v2.h b/bsp/hpmicro/libraries/drivers/drv_uart_v2.h
index 34ca294f7475..eeb6005c91c5 100644
--- a/bsp/hpmicro/libraries/drivers/drv_uart_v2.h
+++ b/bsp/hpmicro/libraries/drivers/drv_uart_v2.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2021-2023 HPMicro
+ * Copyright (c) 2021-2025 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
@@ -7,6 +7,393 @@
#ifndef DRV_UART_V2_H
#define DRV_UART_V2_H
+#include "rtconfig.h"
+
+/* ============================================================================
+ * UART IRQ Priority Configuration Macros
+ * ============================================================================
+ *
+ * These macros handle the configuration of interrupt priorities for each UART controller.
+ * If a specific priority is defined in the board configuration (BSP_UARTx_IRQ_PRIORITY),
+ * it will be used; otherwise, a default priority of 1 is applied.
+ *
+ * The macros follow a consistent pattern:
+ * - Check if BSP_UARTx_IRQ_PRIORITY is defined
+ * - Use the configured value if available
+ * - Fall back to default priority of 1
+ *
+ * Usage: UART_IRQ_PRI_VAL(n) where n is the UART number (0-15)
+ */
+
+#ifdef BSP_UART0_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_0 BSP_UART0_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_0 1
+#endif
+
+#ifdef BSP_UART1_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_1 BSP_UART1_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_1 1
+#endif
+
+#ifdef BSP_UART2_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_2 BSP_UART2_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_2 1
+#endif
+
+#ifdef BSP_UART3_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_3 BSP_UART3_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_3 1
+#endif
+
+#ifdef BSP_UART4_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_4 BSP_UART4_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_4 1
+#endif
+
+#ifdef BSP_UART5_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_5 BSP_UART5_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_5 1
+#endif
+
+#ifdef BSP_UART6_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_6 BSP_UART6_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_6 1
+#endif
+
+#ifdef BSP_UART7_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_7 BSP_UART7_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_7 1
+#endif
+
+#ifdef BSP_UART8_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_8 BSP_UART8_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_8 1
+#endif
+
+#ifdef BSP_UART9_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_9 BSP_UART9_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_9 1
+#endif
+
+#ifdef BSP_UART10_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_10 BSP_UART10_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_10 1
+#endif
+
+#ifdef BSP_UART11_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_11 BSP_UART11_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_11 1
+#endif
+
+#ifdef BSP_UART12_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_12 BSP_UART12_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_12 1
+#endif
+
+#ifdef BSP_UART13_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_13 BSP_UART13_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_13 1
+#endif
+
+#ifdef BSP_UART14_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_14 BSP_UART14_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_14 1
+#endif
+
+#ifdef BSP_UART15_IRQ_PRIORITY
+#define UART_IRQ_PRI_VAL_15 BSP_UART15_IRQ_PRIORITY
+#else
+#define UART_IRQ_PRI_VAL_15 1
+#endif
+
+#define UART_IRQ_PRI_VAL(n) UART_IRQ_PRI_VAL_##n
+
+/* ============================================================================
+* UART DMA Configuration Macros
+* ============================================================================
+*
+* These macros handle the configuration of DMA usage for each UART controller.
+* They check if DMA is enabled for TX and/or RX operations and set appropriate
+* boolean values for the UART device structure.
+*
+* Configuration options:
+* - BSP_UARTx_RX_USING_DMA: Enable DMA for receive operations
+* - BSP_UARTx_TX_USING_DMA: Enable DMA for transmit operations
+*
+* The macros follow a consistent pattern:
+* - Check if BSP_UARTx_RX_USING_DMA is defined
+* - Set to true if defined, false otherwise
+* - Similar pattern for TX DMA configuration
+*
+* Usage:
+* - UART_RX_USING_DMA_VAL(n) for RX DMA configuration
+* - UART_TX_USING_DMA_VAL(n) for TX DMA configuration
+* where n is the UART number (0-15)
+*/
+#ifdef BSP_UART0_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_0 true
+#else
+#define UART_RX_USING_DMA_VAL_0 false
+#endif
+
+#ifdef BSP_UART1_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_1 true
+#else
+#define UART_RX_USING_DMA_VAL_1 false
+#endif
+
+#ifdef BSP_UART2_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_2 true
+#else
+#define UART_RX_USING_DMA_VAL_2 false
+#endif
+
+#ifdef BSP_UART3_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_3 true
+#else
+#define UART_RX_USING_DMA_VAL_3 false
+#endif
+
+#ifdef BSP_UART4_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_4 true
+#else
+#define UART_RX_USING_DMA_VAL_4 false
+#endif
+
+#ifdef BSP_UART5_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_5 true
+#else
+#define UART_RX_USING_DMA_VAL_5 false
+#endif
+
+#ifdef BSP_UART6_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_6 true
+#else
+#define UART_RX_USING_DMA_VAL_6 false
+#endif
+
+#ifdef BSP_UART7_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_7 true
+#else
+#define UART_RX_USING_DMA_VAL_7 false
+#endif
+
+#ifdef BSP_UART8_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_8 true
+#else
+#define UART_RX_USING_DMA_VAL_8 false
+#endif
+
+#ifdef BSP_UART9_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_9 true
+#else
+#define UART_RX_USING_DMA_VAL_9 false
+#endif
+
+#ifdef BSP_UART10_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_10 true
+#else
+#define UART_RX_USING_DMA_VAL_10 false
+#endif
+
+#ifdef BSP_UART11_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_11 true
+#else
+#define UART_RX_USING_DMA_VAL_11 false
+#endif
+
+#ifdef BSP_UART12_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_12 true
+#else
+#define UART_RX_USING_DMA_VAL_12 false
+#endif
+
+#ifdef BSP_UART13_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_13 true
+#else
+#define UART_RX_USING_DMA_VAL_13 false
+#endif
+
+#ifdef BSP_UART14_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_14 true
+#else
+#define UART_RX_USING_DMA_VAL_14 false
+#endif
+
+#ifdef BSP_UART15_RX_USING_DMA
+#define UART_RX_USING_DMA_VAL_15 true
+#else
+#define UART_RX_USING_DMA_VAL_15 false
+#endif
+
+#define UART_RX_USING_DMA_VAL(n) UART_RX_USING_DMA_VAL_##n
+
+#ifdef BSP_UART0_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_0 true
+#else
+#define UART_TX_USING_DMA_VAL_0 false
+#endif
+
+#ifdef BSP_UART1_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_1 true
+#else
+#define UART_TX_USING_DMA_VAL_1 false
+#endif
+
+#ifdef BSP_UART2_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_2 true
+#else
+#define UART_TX_USING_DMA_VAL_2 false
+#endif
+
+#ifdef BSP_UART3_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_3 true
+#else
+#define UART_TX_USING_DMA_VAL_3 false
+#endif
+
+#ifdef BSP_UART4_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_4 true
+#else
+#define UART_TX_USING_DMA_VAL_4 false
+#endif
+
+#ifdef BSP_UART5_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_5 true
+#else
+#define UART_TX_USING_DMA_VAL_5 false
+#endif
+
+#ifdef BSP_UART6_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_6 true
+#else
+#define UART_TX_USING_DMA_VAL_6 false
+#endif
+
+#ifdef BSP_UART7_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_7 true
+#else
+#define UART_TX_USING_DMA_VAL_7 false
+#endif
+
+#ifdef BSP_UART8_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_8 true
+#else
+#define UART_TX_USING_DMA_VAL_8 false
+#endif
+
+#ifdef BSP_UART9_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_9 true
+#else
+#define UART_TX_USING_DMA_VAL_9 false
+#endif
+
+#ifdef BSP_UART10_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_10 true
+#else
+#define UART_TX_USING_DMA_VAL_10 false
+#endif
+
+#ifdef BSP_UART11_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_11 true
+#else
+#define UART_TX_USING_DMA_VAL_11 false
+#endif
+
+#ifdef BSP_UART12_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_12 true
+#else
+#define UART_TX_USING_DMA_VAL_12 false
+#endif
+
+#ifdef BSP_UART13_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_13 true
+#else
+#define UART_TX_USING_DMA_VAL_13 false
+#endif
+
+#ifdef BSP_UART14_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_14 true
+#else
+#define UART_TX_USING_DMA_VAL_14 false
+#endif
+
+#ifdef BSP_UART15_TX_USING_DMA
+#define UART_TX_USING_DMA_VAL_15 true
+#else
+#define UART_TX_USING_DMA_VAL_15 false
+#endif
+
+#define UART_TX_USING_DMA_VAL(n) UART_TX_USING_DMA_VAL_##n
+
+#ifndef BSP_UART0_DMA_PINGPONG_BUFSIZE
+#define BSP_UART0_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART1_DMA_PINGPONG_BUFSIZE
+#define BSP_UART1_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART2_DMA_PINGPONG_BUFSIZE
+#define BSP_UART2_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART3_DMA_PINGPONG_BUFSIZE
+#define BSP_UART3_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART4_DMA_PINGPONG_BUFSIZE
+#define BSP_UART4_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART5_DMA_PINGPONG_BUFSIZE
+#define BSP_UART5_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART6_DMA_PINGPONG_BUFSIZE
+#define BSP_UART6_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART7_DMA_PINGPONG_BUFSIZE
+#define BSP_UART7_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART8_DMA_PINGPONG_BUFSIZE
+#define BSP_UART8_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART9_DMA_PINGPONG_BUFSIZE
+#define BSP_UART9_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART10_DMA_PINGPONG_BUFSIZE
+#define BSP_UART10_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART11_DMA_PINGPONG_BUFSIZE
+#define BSP_UART11_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART12_DMA_PINGPONG_BUFSIZE
+#define BSP_UART12_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART13_DMA_PINGPONG_BUFSIZE
+#define BSP_UART13_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART14_DMA_PINGPONG_BUFSIZE
+#define BSP_UART14_DMA_PINGPONG_BUFSIZE 0
+#endif
+#ifndef BSP_UART15_DMA_PINGPONG_BUFSIZE
+#define BSP_UART15_DMA_PINGPONG_BUFSIZE 0
+#endif
+
+#define UART_RX_DMA_IT_IDLE_FLAG 0x00
+#define UART_RX_DMA_IT_HT_FLAG 0x01
+#define UART_RX_DMA_IT_TC_FLAG 0x02
+
int rt_hw_uart_init(void);
diff --git a/bsp/hpmicro/libraries/drivers/drv_usb.c b/bsp/hpmicro/libraries/drivers/drv_usb.c
index 0d460417c405..a3c636a3103c 100644
--- a/bsp/hpmicro/libraries/drivers/drv_usb.c
+++ b/bsp/hpmicro/libraries/drivers/drv_usb.c
@@ -83,6 +83,10 @@ rt_err_t hpm_usb_control(rt_device_t dev, int cmd, void *args)
switch (cmd)
{
case RT_DEVICE_CTRL_BLK_GETGEOME:
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
struct rt_device_blk_geometry *geometry = (struct rt_device_blk_geometry *)args;
geometry->sector_count = tuh_msc_get_block_count(usb_dev_addr, LUN_USB);
geometry->bytes_per_sector = tuh_msc_get_block_size(usb_dev_addr, LUN_USB);
@@ -93,11 +97,11 @@ rt_err_t hpm_usb_control(rt_device_t dev, int cmd, void *args)
break;
default:
- ret = RT_EINVAL;
+ ret = -RT_EINVAL;
break;
}
- return RT_EOK;
+ return ret;
}
int rt_hw_usb_init(void)
@@ -112,6 +116,16 @@ int rt_hw_usb_init(void)
LOG_E("rt device %s failed, status=%d\n", "usb", err);
return err;
}
+
+#ifdef HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK
+ /* Register usb device to irq table */
+ extern void hpm_isr_usb0(void);
+ rt_hw_interrupt_install(IRQn_USB0, (rt_isr_handler_t)hpm_isr_usb0, HPM_USB0, "usb0");
+#ifdef HPM_USB1_BASE
+ extern void hpm_isr_usb1(void);
+ rt_hw_interrupt_install(IRQn_USB1, (rt_isr_handler_t)hpm_isr_usb1, HPM_USB1, "usb1");
+#endif
+#endif /* HPM_USING_RTTHREAD_INTERRUPT_FRAMEWORK */
return err;
}
diff --git a/bsp/hpmicro/libraries/drivers/drv_wdt.c b/bsp/hpmicro/libraries/drivers/drv_wdt.c
index ae1bae48e1fd..2c07294dbeb1 100644
--- a/bsp/hpmicro/libraries/drivers/drv_wdt.c
+++ b/bsp/hpmicro/libraries/drivers/drv_wdt.c
@@ -1,32 +1,58 @@
/*
- * Copyright (c) 2021 - 2022 HPMicro
+ * Copyright (c) 2021-2025 HPMicro
*
* SPDX-License-Identifier: BSD-3-Clause
*
+ * Change Logs:
+ * Date Author Notes
+ * 2022-05-08 HPMicro the first version
+ * 2025-09-01 HPMicro Revised the code, reduced repetitive codes, removed interrupt related codes
*/
-#include
-#include
-#include
+#include "rtconfig.h"
+
+#ifdef BSP_USING_WDG
#include "board.h"
#include "drv_wdt.h"
#include "hpm_wdg_drv.h"
+#include
+#include
+#include
#include "hpm_sysctl_drv.h"
-
-#ifdef BSP_USING_WDG
-
+/* Macros to reduce repetitive code */
+#define WDG_DECLARE(n) rt_watchdog_t wdog##n
+
+#define WDG_DEVICE_INIT(n) \
+ { \
+ .wdog_base = HPM_WDG## n, \
+ .device_name = "wdt" #n, \
+ .clock_name = clock_watchdog## n, \
+ .wdog = &wdog## n, \
+ .wdog_ctrl = \
+ { \
+ .reset_interval = reset_interval_clock_period_mult_16k, \
+ .interrupt_interval = interrupt_interval_clock_period_multi_8k, \
+ .reset_enable = true, \
+ .interrupt_enable = false, \
+ .clksrc = wdg_clksrc_extclk, \
+ .wdg_enable = false, \
+ }, \
+ },
+
+#define WDG_CTX(wdt) \
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)(wdt)->parent.user_data; \
+ WDG_Type *base = hpm_wdog->wdog_base
typedef struct hpm_wdog
{
WDG_Type *wdog_base;
char *device_name;
clock_name_t clock_name;
- uint32_t irq_num;
rt_watchdog_t *wdog;
wdg_control_t wdog_ctrl;
-}hpm_wdog_t;
+} hpm_wdog_t;
static rt_err_t hpm_wdog_init(rt_watchdog_t *wdt);
static rt_err_t hpm_wdog_open(rt_watchdog_t *wdt, rt_uint16_t oflag);
@@ -34,126 +60,50 @@ static rt_err_t hpm_wdog_close(rt_watchdog_t *wdt);
static rt_err_t hpm_wdog_refresh(rt_watchdog_t *wdt);
static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args);
-static void hpm_wdog_isr(rt_watchdog_t *wdt);
-
#if defined(BSP_USING_WDG0)
-rt_watchdog_t wdog0;
-SDK_DECLARE_EXT_ISR_M(IRQn_WDG0, wdog0_isr)
-void wdog0_isr(void)
-{
- hpm_wdog_isr(&wdog0);
-}
+WDG_DECLARE(0);
#endif
#if defined(BSP_USING_WDG1)
-rt_watchdog_t wdog1;
-SDK_DECLARE_EXT_ISR_M(IRQn_WDG1, wdog1_isr)
-void wdog1_isr(void)
-{
- hpm_wdog_isr(&wdog1);
-}
+WDG_DECLARE(1);
#endif
#if defined(BSP_USING_WDG2)
-rt_watchdog_t wdog2;
-SDK_DECLARE_EXT_ISR_M(IRQn_WDG2, wdog2_isr)
-void wdog2_isr(void)
-{
- hpm_wdog_isr(&wdog2);
-}
+WDG_DECLARE(2);
#endif
#if defined(BSP_USING_WDG3)
-rt_watchdog_t wdog3;
-SDK_DECLARE_EXT_ISR_M(IRQn_WDG3, wdog3_isr)
-void wdog3_isr(void)
-{
- hpm_wdog_isr(&wdog3);
-}
+WDG_DECLARE(3);
#endif
-static hpm_wdog_t wdogs[] = {
+static hpm_wdog_t wdogs[] =
+{
#ifdef BSP_USING_WDG0
- {
- .wdog_base = HPM_WDG0,
- .device_name = "wdt0",
- .clock_name = clock_watchdog0,
- .irq_num = IRQn_WDG0,
- .wdog = &wdog0,
- .wdog_ctrl = {
- .reset_interval = reset_interval_clock_period_mult_16k,
- .interrupt_interval = interrupt_interval_clock_period_multi_8k,
- .reset_enable = true,
- .interrupt_enable = false,
- .clksrc = wdg_clksrc_extclk,
- .wdg_enable = false,
- },
- },
+ WDG_DEVICE_INIT(0)
#endif
#ifdef BSP_USING_WDG1
- {
- .wdog_base = HPM_WDG1,
- .device_name = "wdt1",
- .clock_name = clock_watchdog1,
- .irq_num = IRQn_WDG1,
- .wdog = &wdog1,
- .wdog_ctrl = {
- .reset_interval = reset_interval_clock_period_mult_16k,
- .interrupt_interval = interrupt_interval_clock_period_multi_8k,
- .reset_enable = true,
- .interrupt_enable = false,
- .clksrc = wdg_clksrc_extclk,
- .wdg_enable = false,
- },
- },
+ WDG_DEVICE_INIT(1)
#endif
#ifdef BSP_USING_WDG2
- {
- .wdog_base = HPM_WDG2,
- .device_name = "wdt2",
- .clock_name = clock_watchdog2,
- .irq_num = IRQn_WDG2,
- .wdog = &wdog2,
- .wdog_ctrl = {
- .reset_interval = reset_interval_clock_period_mult_16k,
- .interrupt_interval = interrupt_interval_clock_period_multi_8k,
- .reset_enable = true,
- .interrupt_enable = false,
- .clksrc = wdg_clksrc_extclk,
- .wdg_enable = false,
- },
- },
+ WDG_DEVICE_INIT(2)
#endif
#ifdef BSP_USING_WDG3
- {
- .wdog_base = HPM_WDG3,
- .device_name = "wdt3",
- .clock_name = clock_watchdog3,
- .irq_num = IRQn_WDG3,
- .wdog = &wdog3,
- .wdog_ctrl = {
- .reset_interval = reset_interval_clock_period_mult_16k,
- .interrupt_interval = interrupt_interval_clock_period_multi_8k,
- .reset_enable = true,
- .interrupt_enable = false,
- .clksrc = wdg_clksrc_extclk,
- .wdg_enable = false,
- },
- },
+ WDG_DEVICE_INIT(3)
#endif
};
-static struct rt_watchdog_ops hpm_wdog_ops = {
+static struct rt_watchdog_ops hpm_wdog_ops =
+{
.init = hpm_wdog_init,
.control = hpm_wdog_control,
};
static rt_err_t hpm_wdog_init(rt_watchdog_t *wdt)
{
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
clock_add_to_group(hpm_wdog->clock_name, BOARD_RUNNING_CORE & 0x1);
@@ -165,7 +115,7 @@ static rt_err_t hpm_wdog_init(rt_watchdog_t *wdt)
static rt_err_t hpm_wdog_open(rt_watchdog_t *wdt, rt_uint16_t oflag)
{
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
rt_enter_critical();
@@ -176,7 +126,7 @@ static rt_err_t hpm_wdog_open(rt_watchdog_t *wdt, rt_uint16_t oflag)
static rt_err_t hpm_wdog_close(rt_watchdog_t *wdt)
{
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
rt_enter_critical();
@@ -188,7 +138,7 @@ static rt_err_t hpm_wdog_close(rt_watchdog_t *wdt)
static rt_err_t hpm_wdog_refresh(rt_watchdog_t *wdt)
{
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
rt_enter_critical();
@@ -202,7 +152,7 @@ static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args)
{
rt_err_t ret = RT_EOK;
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
wdg_control_t *wdog_ctrl = &hpm_wdog->wdog_ctrl;
@@ -210,12 +160,19 @@ static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args)
switch (cmd)
{
case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
temp = wdg_get_total_reset_interval_in_us(base, WDG_EXT_CLK_FREQ);
temp /= 1000000UL; /* Convert to seconds */
*(uint32_t *)args = temp;
break;
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
- RT_ASSERT(*(uint32_t *)args != 0);
+ if ((args == RT_NULL) || (*(uint32_t *)args == 0U))
+ {
+ return -RT_EINVAL;
+ }
temp = *(uint32_t *)args;
temp *= 1000000U; /* Convert to microseconds */
wdog_ctrl->interrupt_interval = wdg_convert_interrupt_interval_from_us(WDG_EXT_CLK_FREQ, temp);
@@ -230,13 +187,17 @@ static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args)
hpm_wdog_refresh(wdt);
break;
case RT_DEVICE_CTRL_WDT_START:
- hpm_wdog_open(wdt, *(uint16_t*)args);
+ if (args == RT_NULL)
+ {
+ return -RT_EINVAL;
+ }
+ hpm_wdog_open(wdt, *(uint16_t *)args);
break;
case RT_DEVICE_CTRL_WDT_STOP:
hpm_wdog_close(wdt);
break;
default:
- ret = RT_EINVAL;
+ ret = -RT_EINVAL;
break;
}
@@ -245,12 +206,13 @@ static rt_err_t hpm_wdog_control(rt_watchdog_t *wdt, int cmd, void *args)
void hpm_wdog_isr(rt_watchdog_t *wdt)
{
- hpm_wdog_t *hpm_wdog = (hpm_wdog_t*)wdt->parent.user_data;
+ hpm_wdog_t *hpm_wdog = (hpm_wdog_t *)wdt->parent.user_data;
WDG_Type *base = hpm_wdog->wdog_base;
uint32_t status = wdg_get_status(base);
- if (IS_HPM_BITMASK_SET(status, WDG_ST_INTEXPIRED_MASK)) {
+ if (IS_HPM_BITMASK_SET(status, WDG_ST_INTEXPIRED_MASK))
+ {
wdg_clear_status(base, WDG_ST_INTEXPIRED_MASK);
}
}
@@ -259,7 +221,6 @@ int rt_hw_wdt_init(void)
{
rt_err_t err = RT_EOK;
-#if defined(BSP_USING_WDG)
for (uint32_t i = 0; i < sizeof(wdogs) / sizeof(wdogs[0]); i++)
{
wdogs[i].wdog->ops = &hpm_wdog_ops;
@@ -270,9 +231,8 @@ int rt_hw_wdt_init(void)
LOG_E("rt device %s failed, status=%d\n", wdogs[i].device_name, err);
}
}
-#endif
return err;
}
INIT_BOARD_EXPORT(rt_hw_wdt_init);
-#endif /* RT_USING_WDT */
\ No newline at end of file
+#endif /* RT_USING_WDT */
diff --git a/bsp/hpmicro/libraries/misc/SConscript b/bsp/hpmicro/libraries/misc/SConscript
new file mode 100644
index 000000000000..bb673e4f1801
--- /dev/null
+++ b/bsp/hpmicro/libraries/misc/SConscript
@@ -0,0 +1,17 @@
+# for module compiling
+import os
+Import('RTT_ROOT')
+from building import *
+
+cwd = GetCurrentDir()
+objs = []
+list = os.listdir(cwd)
+
+ASFLAGS = ' -I' + cwd
+
+for d in list:
+ path = os.path.join(cwd, d)
+ if os.path.isfile(os.path.join(path, 'SConscript')):
+ objs = objs + SConscript(os.path.join(d, 'SConscript'))
+
+Return('objs')
\ No newline at end of file
diff --git a/bsp/hpmicro/libraries/misc/lwip_ptp/SConscript b/bsp/hpmicro/libraries/misc/lwip_ptp/SConscript
new file mode 100644
index 000000000000..812c8f3728ec
--- /dev/null
+++ b/bsp/hpmicro/libraries/misc/lwip_ptp/SConscript
@@ -0,0 +1,7 @@
+from building import *
+
+cwd = GetCurrentDir()
+
+group = DefineGroup('lwip_ptp', [], depend=['BSP_USING_ETH'], CPPPATH=[cwd])
+
+Return('group')
diff --git a/bsp/hpmicro/libraries/misc/lwip_ptp/lwip_ptp_tx_ts.h b/bsp/hpmicro/libraries/misc/lwip_ptp/lwip_ptp_tx_ts.h
new file mode 100644
index 000000000000..73bc53011141
--- /dev/null
+++ b/bsp/hpmicro/libraries/misc/lwip_ptp/lwip_ptp_tx_ts.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2026 HPMicro
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef LWIP_PTP_TX_TS_H
+#define LWIP_PTP_TX_TS_H
+
+#include
+#include "lwip/def.h"
+#include "lwip/pbuf.h"
+#include "lwip/prot/ethernet.h"
+#include "lwip/prot/ip.h"
+#include "lwip/prot/ip4.h"
+#include "lwip/prot/udp.h"
+
+/**
+ * @brief True if this Ethernet frame should use ENET TX descriptor TTSE and HW timestamp
+ * PTPd sends messages that need precise egress time on UDP event port 319 only.
+ * General port 320 (Announce, Follow_Up, Delay_Resp, etc.) does not use TX HW stamp.
+ */
+static inline bool lwip_ptp_frame_needs_tx_hw_timestamp(const struct pbuf *p)
+{
+ u8_t hdr[SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR + IP_HLEN + sizeof(struct udp_hdr)];
+ u16_t ethertype;
+ u16_t ip_off;
+ const struct ip_hdr *iph;
+ u16_t ip_len;
+ const struct udp_hdr *udph;
+
+ if (p == NULL || p->tot_len < (s16_t)(SIZEOF_ETH_HDR + IP_HLEN + UDP_HLEN)) {
+ return false;
+ }
+ if (pbuf_copy_partial(p, hdr, (u16_t)sizeof(hdr), 0) != (u16_t)sizeof(hdr)) {
+ return false;
+ }
+ ethertype = lwip_ntohs(*(u16_t *)(hdr + 12U));
+ ip_off = SIZEOF_ETH_HDR;
+ if (ethertype == ETHTYPE_VLAN) {
+ if (p->tot_len < (s16_t)(SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR + IP_HLEN + UDP_HLEN)) {
+ return false;
+ }
+ ethertype = lwip_ntohs(*(u16_t *)(hdr + (SIZEOF_ETH_HDR + 2U)));
+ ip_off = SIZEOF_ETH_HDR + SIZEOF_VLAN_HDR;
+ }
+ if (ethertype != ETHTYPE_IP) {
+ return false;
+ }
+ iph = (const struct ip_hdr *)(hdr + ip_off);
+ if (IPH_HL(iph) != 5) {
+ return false;
+ }
+ if (IPH_PROTO(iph) != IP_PROTO_UDP) {
+ return false;
+ }
+ ip_len = IP_HLEN;
+ if ((u32_t)ip_off + (u32_t)ip_len + UDP_HLEN > sizeof(hdr)) {
+ return false;
+ }
+ udph = (const struct udp_hdr *)(hdr + ip_off + ip_len);
+ return udph->dest == PP_HTONS(319);
+}
+
+#endif /* LWIP_PTP_TX_TS_H */
diff --git a/bsp/hpmicro/tools/sdk_dist.py b/bsp/hpmicro/tools/sdk_dist.py
index 3d7fd1aba43f..7169ecc10804 100644
--- a/bsp/hpmicro/tools/sdk_dist.py
+++ b/bsp/hpmicro/tools/sdk_dist.py
@@ -1,8 +1,4 @@
import os
-import sys
-import shutil
-cwd_path = os.getcwd()
-sys.path.append(os.path.join(os.path.dirname(cwd_path), 'rt-thread', 'tools'))
def update_rtt_root_path(path):
if not os.path.isfile(path):
@@ -38,7 +34,6 @@ def update_dist_project_paths(dist_dir):
# BSP dist function
def dist_do_building(BSP_ROOT, dist_dir):
from mkdist import bsp_copy_files
- import rtconfig
library_dir = os.path.join(dist_dir, 'libraries')