diff --git a/boards/ambiq/apollo510_evb/CMakeLists.txt b/boards/ambiq/apollo510_evb/CMakeLists.txt new file mode 100644 index 00000000000..218a0602483 --- /dev/null +++ b/boards/ambiq/apollo510_evb/CMakeLists.txt @@ -0,0 +1,4 @@ +# SPDX-License-Identifier: Apache-2.0 + +zephyr_library() +zephyr_library_sources(board.c) diff --git a/boards/ambiq/apollo510_evb/Kconfig b/boards/ambiq/apollo510_evb/Kconfig new file mode 100644 index 00000000000..6929d894103 --- /dev/null +++ b/boards/ambiq/apollo510_evb/Kconfig @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2025 Ambiq Micro Inc. + +config BOARD_APOLLO510_EVB + select BOARD_EARLY_INIT_HOOK diff --git a/boards/ambiq/apollo510_evb/Kconfig.apollo510_evb b/boards/ambiq/apollo510_evb/Kconfig.apollo510_evb new file mode 100644 index 00000000000..38315f5fd69 --- /dev/null +++ b/boards/ambiq/apollo510_evb/Kconfig.apollo510_evb @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2025 Ambiq Micro Inc. + +config BOARD_APOLLO510_EVB + select SOC_APOLLO510 diff --git a/boards/ambiq/apollo510_evb/Kconfig.defconfig b/boards/ambiq/apollo510_evb/Kconfig.defconfig new file mode 100644 index 00000000000..9f9c9b2a196 --- /dev/null +++ b/boards/ambiq/apollo510_evb/Kconfig.defconfig @@ -0,0 +1,15 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2025 Ambiq Micro Inc. + +if BOARD_APOLLO510_EVB + +config SYS_CLOCK_HW_CYCLES_PER_SEC + default 32768 if AMBIQ_STIMER_TIMER + default 96000000 if CORTEX_M_SYSTICK + +config LOG_BACKEND_SWO_FREQ_HZ + default 1000000 + depends on LOG_BACKEND_SWO + +endif # BOARD_APOLLO510_EVB diff --git a/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi b/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi new file mode 100644 index 00000000000..3f173b61a03 --- /dev/null +++ b/boards/ambiq/apollo510_evb/apollo510_evb-pinctrl.dtsi @@ -0,0 +1,24 @@ +/* + * Copyright (c) 2025 Ambiq Micro Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include + +&pinctrl { + uart0_default: uart0_default { + group1 { + pinmux = ; + }; + group2 { + pinmux = ; + input-enable; + }; + }; + swo_default: swo_default { + group0 { + pinmux = ; + }; + }; +}; diff --git a/boards/ambiq/apollo510_evb/apollo510_evb.dts b/boards/ambiq/apollo510_evb/apollo510_evb.dts new file mode 100644 index 00000000000..2303e43e125 --- /dev/null +++ b/boards/ambiq/apollo510_evb/apollo510_evb.dts @@ -0,0 +1,128 @@ +/dts-v1/; +#include +#include "apollo510_evb-pinctrl.dtsi" +#include + +/ { + model = "Ambiq Apollo510 evaluation board"; + compatible = "ambiq,apollo510_evb"; + + chosen { + zephyr,itcm = &itcm; + zephyr,dtcm = &dtcm; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &uart0; + zephyr,shell-uart = &uart0; + zephyr,uart-pipe = &uart0; + ambiq,xo32m = &xo32m_xtal; + ambiq,xo32k = &xo32k_xtal; + ambiq,extrefclk = &extrefclk; + }; + + aliases { + watchdog0 = &wdt0; + led0 = &led0; + led1 = &led1; + led2 = &led2; + sw0 = &button0; + sw1 = &button1; + }; + + sram0: memory@SSRAM_BASE_NAME { + compatible = "mmio-sram"; + reg = ; + }; + + sram_no_cache: memory@20280000 { + compatible = "zephyr,memory-region", "mmio-sram"; + reg = <0x20280000 0x100000>; + zephyr,memory-region = "SRAM_NO_CACHE"; + zephyr,memory-attr = <( DT_MEM_ARM(ATTR_MPU_RAM_NOCACHE) )>; + }; + + leds { + compatible = "gpio-leds"; + led0: led_0 { + gpios = <&gpio160_191 5 GPIO_ACTIVE_LOW>; + label = "LED 0"; + }; + led1: led_1 { + gpios = <&gpio64_95 25 GPIO_ACTIVE_LOW>; + label = "LED 1"; + }; + led2: led_2 { + gpios = <&gpio64_95 28 GPIO_ACTIVE_LOW>; + label = "LED 2"; + }; + }; + + buttons { + compatible = "gpio-keys"; + polling-mode; + button0: button_0 { + gpios = <&gpio64_95 29 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BTN0"; + zephyr,code = ; + status = "okay"; + }; + button1: button_1 { + gpios = <&gpio64_95 30 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>; + label = "BTN1"; + zephyr,code = ; + status = "okay"; + }; + }; +}; + +&xo32m_xtal { + clock-frequency = ; +}; + +&itm { + pinctrl-0 = <&swo_default>; + pinctrl-names = "default"; +}; + +&uart0 { + current-speed = <115200>; + pinctrl-0 = <&uart0_default>; + pinctrl-names = "default"; + status = "okay"; +}; + +&stimer0 { + clk-source = <3>; +}; + +&wdt0 { + status = "okay"; +}; + +&gpio0_31 { + status = "okay"; +}; + +&gpio32_63 { + status = "okay"; +}; + +&gpio64_95 { + status = "okay"; +}; + +&gpio96_127 { + status = "okay"; +}; + +&gpio128_159 { + status = "okay"; +}; + +&gpio160_191 { + status = "okay"; +}; + +&gpio192_223 { + status = "okay"; +}; diff --git a/boards/ambiq/apollo510_evb/apollo510_evb.yaml b/boards/ambiq/apollo510_evb/apollo510_evb.yaml new file mode 100644 index 00000000000..704c2c00208 --- /dev/null +++ b/boards/ambiq/apollo510_evb/apollo510_evb.yaml @@ -0,0 +1,19 @@ +identifier: apollo510_evb +name: Apollo510 EVB +type: mcu +arch: arm +ram: 3072 +flash: 4096 +toolchain: + - zephyr + - gnuarmemb +supported: + - uart + - watchdog + - gpio + - clock_control +testing: + ignore_tags: + - net + - bluetooth +vendor: ambiq diff --git a/boards/ambiq/apollo510_evb/apollo510_evb_defconfig b/boards/ambiq/apollo510_evb/apollo510_evb_defconfig new file mode 100644 index 00000000000..de397a65fbd --- /dev/null +++ b/boards/ambiq/apollo510_evb/apollo510_evb_defconfig @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: Apache-2.0 +# +# Copyright (c) 2025 Ambiq Micro Inc. + +CONFIG_CONSOLE=y +CONFIG_UART_CONSOLE=y +CONFIG_SERIAL=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_HW_STACK_PROTECTION=y +CONFIG_ARM_MPU=y +CONFIG_PM=y +CONFIG_PM_DEVICE=y +CONFIG_PM_DEVICE_RUNTIME=y diff --git a/boards/ambiq/apollo510_evb/board.c b/boards/ambiq/apollo510_evb/board.c new file mode 100644 index 00000000000..b3cc847698c --- /dev/null +++ b/boards/ambiq/apollo510_evb/board.c @@ -0,0 +1,57 @@ +/* + * Copyright 2025 Ambiq Micro Inc. + * + * SPDX-License-Identifier: Apache-2.0 + */ + +#include +#include +#include + +#if DT_HAS_CHOSEN(ambiq_xo32m) +#define XTAL_HS_FREQ DT_PROP(DT_CHOSEN(ambiq_xo32m), clock_frequency) +#if DT_SAME_NODE(DT_CHOSEN(ambiq_xo32m), DT_NODELABEL(xo32m_xtal)) +#define XTAL_HS_MODE AM_HAL_CLKMGR_XTAL_HS_MODE_XTAL +#elif DT_SAME_NODE(DT_CHOSEN(ambiq_xo32m), DT_NODELABEL(xo32m_ext)) +#define XTAL_HS_MODE AM_HAL_CLKMGR_XTAL_HS_MODE_EXT +#endif +#else +#define XTAL_HS_FREQ 0 +#define XTAL_HS_MODE AM_HAL_CLKMGR_XTAL_HS_MODE_XTAL +#endif + +#if DT_HAS_CHOSEN(ambiq_xo32k) +#define XTAL_LS_FREQ DT_PROP(DT_CHOSEN(ambiq_xo32k), clock_frequency) +#if DT_SAME_NODE(DT_CHOSEN(ambiq_xo32k), DT_NODELABEL(xo32k_xtal)) +#define XTAL_LS_MODE AM_HAL_CLKMGR_XTAL_LS_MODE_XTAL +#elif DT_SAME_NODE(DT_CHOSEN(ambiq_xo32k), DT_NODELABEL(xo32k_ext)) +#define XTAL_LS_MODE AM_HAL_CLKMGR_XTAL_LS_MODE_EXT +#endif +#else +#define XTAL_LS_FREQ 0 +#define XTAL_LS_MODE AM_HAL_CLKMGR_XTAL_LS_MODE_XTAL +#endif + +#if DT_HAS_CHOSEN(ambiq_extrefclk) +#define EXTREFCLK_FREQ DT_PROP(DT_CHOSEN(ambiq_extrefclk), clock_frequency) +#else +#define EXTREFCLK_FREQ 0 +#endif + +void board_early_init_hook(void) +{ + /* Set board related info into clock manager */ + am_hal_clkmgr_board_info_t sClkmgrBoardInfo = {.sXtalHs.eXtalHsMode = XTAL_HS_MODE, + .sXtalHs.ui32XtalHsFreq = XTAL_HS_FREQ, + .sXtalLs.eXtalLsMode = XTAL_LS_MODE, + .sXtalLs.ui32XtalLsFreq = XTAL_LS_FREQ, + .ui32ExtRefClkFreq = EXTREFCLK_FREQ}; + am_hal_clkmgr_board_info_set(&sClkmgrBoardInfo); + + /* Default HFRC and HFRC2 to Free Running clocks */ + am_hal_clkmgr_clock_config(AM_HAL_CLKMGR_CLK_ID_HFRC, + AM_HAL_CLKMGR_HFRC_FREQ_FREE_RUN_APPROX_48MHZ, NULL); + am_hal_clkmgr_clock_config(AM_HAL_CLKMGR_CLK_ID_HFRC2, + AM_HAL_CLKMGR_HFRC2_FREQ_FREE_RUN_APPROX_250MHZ, NULL); + +} diff --git a/boards/ambiq/apollo510_evb/board.cmake b/boards/ambiq/apollo510_evb/board.cmake new file mode 100644 index 00000000000..f4ec9988f02 --- /dev/null +++ b/boards/ambiq/apollo510_evb/board.cmake @@ -0,0 +1,6 @@ +# Copyright (c) 2025 Ambiq Micro Inc. +# SPDX-License-Identifier: Apache-2.0 + +board_runner_args(jlink "--device=AP510NFA-CBR" "--iface=swd" "--speed=1000") + +include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) diff --git a/boards/ambiq/apollo510_evb/board.yml b/boards/ambiq/apollo510_evb/board.yml new file mode 100644 index 00000000000..b42efb3b452 --- /dev/null +++ b/boards/ambiq/apollo510_evb/board.yml @@ -0,0 +1,6 @@ +board: + name: apollo510_evb + full_name: Apollo510 SOC Evaluation Board + vendor: ambiq + socs: + - name: apollo510 diff --git a/boards/ambiq/apollo510_evb/doc/apollo510-soc-eval-board.jpg b/boards/ambiq/apollo510_evb/doc/apollo510-soc-eval-board.jpg new file mode 100644 index 00000000000..906b08bae26 Binary files /dev/null and b/boards/ambiq/apollo510_evb/doc/apollo510-soc-eval-board.jpg differ diff --git a/boards/ambiq/apollo510_evb/doc/index.rst b/boards/ambiq/apollo510_evb/doc/index.rst new file mode 100644 index 00000000000..82916942776 --- /dev/null +++ b/boards/ambiq/apollo510_evb/doc/index.rst @@ -0,0 +1,75 @@ +.. zephyr:board:: apollo510_evb + +Apollo510 EVB is a board by Ambiq featuring their ultra-low power Apollo510 SoC. + +Hardware +******** + +- Apollo510 SoC with up to 250 MHz operating frequency +- ARM® Cortex® M55 core +- 64 kB Instruction Cache and 64 kB Data Cache +- Up to 4 MB of non-volatile memory (NVM) for code/data +- Up to 3 MB of low leakage / low power RAM for code/data +- 256 kB Instruction Tightly Coupled RAM (ITCM) +- 512 kB Data Tightly Coupled RAM (DTCM) + +For more information about the Apollo510 SoC and Apollo510 EVB board: + +- `Apollo510 Website`_ +- `Apollo510 Datasheet`_ +- `Apollo510 EVB Website`_ + +Supported Features +================== + +.. zephyr:board-supported-hw:: + +Programming and Debugging +========================= + +.. zephyr:board-supported-runners:: + +Flashing an application +----------------------- + +Connect your device to your host computer using the JLINK USB port. +The sample application :zephyr:code-sample:`hello_world` is used for this example. +Build the Zephyr kernel and application, then flash it to the device: + +.. zephyr-app-commands:: + :zephyr-app: samples/hello_world + :board: apollo510_evb + :goals: flash + +.. note:: + ``west flash`` requires `SEGGER J-Link software`_ and `pylink`_ Python module + to be installed on you host computer. + +Open a serial terminal (minicom, putty, etc.) with the following settings: + +- Speed: 115200 +- Data: 8 bits +- Parity: None +- Stop bits: 1 + +Reset the board and you should be able to see on the corresponding Serial Port +the following message: + +.. code-block:: console + + Hello World! apollo510_evb + +.. _Apollo510 Website: + https://ambiq.com/apollo510/ + +.. _Apollo510 Datasheet: + https://contentportal.ambiq.com/documents/20123/2877485/Apollo510-SoC-Datasheet.pdf + +.. _Apollo510 EVB Website: + For more information, please reach out to Sales and FAE. + +.. _SEGGER J-Link software: + https://www.segger.com/downloads/jlink + +.. _pylink: + https://github.com/Square/pylink