This is an automated email from the ASF dual-hosted git repository. sjanc pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/mynewt-core.git
commit 8b40b6abbe6d2464cbc76f4e79fe62678d7f7351 Author: Wiktor Kwiatkowski <[email protected]> AuthorDate: Mon Aug 31 11:12:39 2026 +0200 mcu/apollo3: Add autogenerated linker config and SBL SRAM layout syscfg Add linker include fragments for the generic boot/startup autogenerated linker. APOLLO3_SRAM_RESV must match INFO0 SECURITY.SRAM_RESV (programmable via AmbiqSuite tools/apollo3_scripts/create_info0.py). --- hw/mcu/ambiq/apollo3/apollo3.ld | 154 --------------------- hw/mcu/ambiq/apollo3/include/mcu/cmsis_nvic.h | 8 +- hw/mcu/ambiq/apollo3/include/mcu/mcu_vectors.h | 20 +++ .../apollo3/include/mcu/vectors/apollo3_vectors.h | 83 +++++++++++ hw/mcu/ambiq/apollo3/link/include/mcu_config.ld.h | 31 +++++ .../ambiq/apollo3/link/include/memory_regions.ld.h | 26 ++++ hw/mcu/ambiq/apollo3/syscfg.yml | 14 ++ 7 files changed, 180 insertions(+), 156 deletions(-) diff --git a/hw/mcu/ambiq/apollo3/apollo3.ld b/hw/mcu/ambiq/apollo3/apollo3.ld deleted file mode 100644 index 3aa2098ee..000000000 --- a/hw/mcu/ambiq/apollo3/apollo3.ld +++ /dev/null @@ -1,154 +0,0 @@ -/* stack: dynamic */ -/* heap: dynamic */ - -ENTRY(Reset_Handler) - -SECTIONS -{ - .imghdr (NOLOAD): - { - . = . + _imghdr_size; - } > FLASH - - __text = .; - - /* text: executable code */ - /* located in _flash_ */ - .text : - { - . = ALIGN(4); - __isr_vector_start = .; - KEEP(*(.isr_vector)) - KEEP(*(.ble_patch)) - __isr_vector_end = .; - *(.text) - *(.text*) - - KEEP(*(.init)) - KEEP(*(.fini)) - - /* .ctors */ - *crtbegin.o(.ctors) - *crtbegin?.o(.ctors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors) - *(SORT(.ctors.*)) - *(.ctors) - - /* .dtors */ - *crtbegin.o(.dtors) - *crtbegin?.o(.dtors) - *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors) - *(SORT(.dtors.*)) - *(.dtors) - - /* .rodata */ - . = ALIGN(4); -INCLUDE "link_tables.ld.h" - *(.rodata) - *(.rodata*) - - PROVIDE(mynewt_main = main); - . = ALIGN(4); - } > FLASH - - .ARM.extab : - { - *(.ARM.extab* .gnu.linkonce.armextab.*) - . = ALIGN(4); - } > FLASH - - __exidx_start = .; - .ARM.exidx : - { - *(.ARM.exidx* .gnu.linkonce.armexidx.*) - . = ALIGN(4); - } > FLASH - __exidx_end = .; - - __etext = .; - - .vector_relocation : - { - . = ALIGN(4); - __vector_tbl_reloc__ = .; - . = . + (__isr_vector_end - __isr_vector_start); - . = ALIGN(4); - } > RAM - - /* data: uniquely initialized symbols */ - /* loaded into flash region, copied to sram region at startup */ - /* VMA appears in sram region, LMA is in flash region for initialization */ - /* _init_data used by startup to locate flash region copy of data */ - .data : - { - __data_start__ = .; - *(vtable) - *(.data) - *(.data*) - - . = ALIGN(4); - /* preinit data */ - PROVIDE_HIDDEN (__preinit_array_start = .); - *(.preinit_array) - PROVIDE_HIDDEN (__preinit_array_end = .); - - . = ALIGN(4); - /* init data */ - PROVIDE_HIDDEN (__init_array_start = .); - *(SORT(.init_array.*)) - *(.init_array) - PROVIDE_HIDDEN (__init_array_end = .); - - - . = ALIGN(4); - /* finit data */ - PROVIDE_HIDDEN (__fini_array_start = .); - *(SORT(.fini_array.*)) - *(.fini_array) - PROVIDE_HIDDEN (__fini_array_end = .); - - *(.jcr) - . = ALIGN(4); - __data_end__ = .; - } > RAM AT>FLASH - _init_data = LOADADDR(.data); /* used by startup to initialize data */ - - /* bss: zero-initialized symbols */ - /* don't require flash memory to remember their value */ - .bss : - { - . = ALIGN(4); - __bss_start__ = .; - *(.bss) - *(.bss*) - *(COMMON) - . = ALIGN(4); - __bss_end__ = .; - } > RAM - - /* Heap starts after BSS */ - . = ALIGN(8); - __HeapBase = .; - - /* .stack_dummy section doesn't contains any symbols. It is only - * used for linker to calculate size of stack sections, and assign - * values to stack symbols later */ - .stack_dummy (COPY): - { - *(.stack*) - } > RAM - - _ram_start = ORIGIN(RAM); - - /* Set stack top to end of RAM, and stack limit move down by - * size of stack_dummy section */ - __StackTop = ORIGIN(RAM) + LENGTH(RAM); - __StackLimit = __StackTop - SIZEOF(.stack_dummy); - PROVIDE(__stack = __StackTop); - - /* Top of head is the bottom of the stack */ - __HeapLimit = __StackLimit; - - /* Check if data + heap + stack exceeds RAM limit */ - ASSERT(__HeapBase <= __HeapLimit, "region RAM overflowed with stack") -} diff --git a/hw/mcu/ambiq/apollo3/include/mcu/cmsis_nvic.h b/hw/mcu/ambiq/apollo3/include/mcu/cmsis_nvic.h index f1d4bd71c..571edacf8 100644 --- a/hw/mcu/ambiq/apollo3/include/mcu/cmsis_nvic.h +++ b/hw/mcu/ambiq/apollo3/include/mcu/cmsis_nvic.h @@ -9,8 +9,12 @@ #include <stdint.h> -#define NVIC_NUM_VECTORS (16 + 26) // CORE + MCU Peripherals -#define NVIC_USER_IRQ_OFFSET 16 +extern uint32_t __isr_vector_start[]; +extern uint32_t __isr_vector_end[]; + +/* Extract number of vectors from .interrupt section size */ +#define NVIC_NUM_VECTORS (__isr_vector_end - __isr_vector_start) +#define NVIC_USER_IRQ_OFFSET 16 #include "mcu/apollo3.h" diff --git a/hw/mcu/ambiq/apollo3/include/mcu/mcu_vectors.h b/hw/mcu/ambiq/apollo3/include/mcu/mcu_vectors.h new file mode 100644 index 000000000..b952eb68a --- /dev/null +++ b/hw/mcu/ambiq/apollo3/include/mcu/mcu_vectors.h @@ -0,0 +1,20 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include "vectors/apollo3_vectors.h" diff --git a/hw/mcu/ambiq/apollo3/include/mcu/vectors/apollo3_vectors.h b/hw/mcu/ambiq/apollo3/include/mcu/vectors/apollo3_vectors.h new file mode 100644 index 000000000..4c790a17d --- /dev/null +++ b/hw/mcu/ambiq/apollo3/include/mcu/vectors/apollo3_vectors.h @@ -0,0 +1,83 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +INT_VECTOR_STACK_TOP(__StackTop) +INT_VECTOR_RESET_HANDLER(Reset_Handler) +INT_VECTOR_NMI_HANDLER(NMI_Handler) +INT_VECTOR_HARDFAULT_HANDLER(HardFault_Handler) +INT_VECTOR_MEMMANAGE_HANDLER(MemManage_Handler) +INT_VECTOR_BUSFAULT_HANDLER(BusFault_Handler) +INT_VECTOR_USAGEFAULT_HANDLER(UsageFault_Handler) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_SVC_HANDLER(SVC_Handler) +INT_VECTOR_DEBUGMON_HANDLER(DebugMon_Handler) +INT_VECTOR_UNUSED(0) +INT_VECTOR_PENDSV_HANDLER(PendSV_Handler) +INT_VECTOR_SYSTICK_HANDLER(SysTick_Handler) +INT_VECTOR(BROWNOUT_IRQHandler) +INT_VECTOR(WATCHDOG_IRQHandler) +INT_VECTOR(RTC_IRQHandler) +INT_VECTOR(VCOMP_IRQHandler) +INT_VECTOR(IOSLAVE_IOS_IRQHandler) +INT_VECTOR(IOSLAVE_ACC_IRQHandler) +INT_VECTOR(IOMASTER0_IRQHandler) +INT_VECTOR(IOMASTER1_IRQHandler) +INT_VECTOR(IOMASTER2_IRQHandler) +INT_VECTOR(IOMASTER3_IRQHandler) +INT_VECTOR(IOMASTER4_IRQHandler) +INT_VECTOR(IOMASTER5_IRQHandler) +INT_VECTOR(BLE_IRQHandler) +INT_VECTOR(GPIO_IRQHandler) +INT_VECTOR(CTIMER_IRQHandler) +INT_VECTOR(UART0_IRQHandler) +INT_VECTOR(UART1_IRQHandler) +INT_VECTOR(SCARD_IRQHandler) +INT_VECTOR(ADC_IRQHandler) +INT_VECTOR(PDM_IRQHandler) +INT_VECTOR(MSPI_IRQHandler) +INT_VECTOR(SOFTWARE0_IRQHandler) +INT_VECTOR(STIMER_IRQHandler) +INT_VECTOR(STIMER_CMPR0_IRQHandler) +INT_VECTOR(STIMER_CMPR1_IRQHandler) +INT_VECTOR(STIMER_CMPR2_IRQHandler) +INT_VECTOR(STIMER_CMPR3_IRQHandler) +INT_VECTOR(STIMER_CMPR4_IRQHandler) +INT_VECTOR(STIMER_CMPR5_IRQHandler) +INT_VECTOR(STIMER_CMPR6_IRQHandler) +INT_VECTOR(STIMER_CMPR7_IRQHandler) +INT_VECTOR(CLKGEN_IRQHandler) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) +INT_VECTOR_UNUSED(0) diff --git a/hw/mcu/ambiq/apollo3/link/include/mcu_config.ld.h b/hw/mcu/ambiq/apollo3/link/include/mcu_config.ld.h new file mode 100644 index 000000000..b13e3adad --- /dev/null +++ b/hw/mcu/ambiq/apollo3/link/include/mcu_config.ld.h @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <syscfg/syscfg.h> + +#if MYNEWT_VAL_APOLLO3_SRAM_RESV > 0 +#define RAM_SIZE \ + (MYNEWT_VAL_MCU_RAM_SIZE - MYNEWT_VAL_APOLLO3_SRAM_RESV - \ + MYNEWT_VAL_APOLLO3_SBL_STACK_MARGIN) +#define NOINIT_RAM NOINIT_REGION +#else +#define RAM_SIZE \ + (MYNEWT_VAL_MCU_RAM_SIZE - MYNEWT_VAL_APOLLO3_SBL_STACK_MARGIN) +#define NOINIT_RAM RAM +#endif diff --git a/hw/mcu/ambiq/apollo3/link/include/memory_regions.ld.h b/hw/mcu/ambiq/apollo3/link/include/memory_regions.ld.h new file mode 100644 index 000000000..2b3eddb25 --- /dev/null +++ b/hw/mcu/ambiq/apollo3/link/include/memory_regions.ld.h @@ -0,0 +1,26 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +#include <syscfg/syscfg.h> + +#if MYNEWT_VAL_APOLLO3_SRAM_RESV > 0 +NOINIT_REGION(rwx) + : ORIGIN = RAM_START + MYNEWT_VAL_MCU_RAM_SIZE - MYNEWT_VAL_APOLLO3_SRAM_RESV, + LENGTH = MYNEWT_VAL_APOLLO3_SRAM_RESV +#endif diff --git a/hw/mcu/ambiq/apollo3/syscfg.yml b/hw/mcu/ambiq/apollo3/syscfg.yml index 361b2f8d1..d77ad8409 100644 --- a/hw/mcu/ambiq/apollo3/syscfg.yml +++ b/hw/mcu/ambiq/apollo3/syscfg.yml @@ -34,6 +34,18 @@ syscfg.defs: chunks of this size. Buffer is created on stack. value: 128 + MCU_PATH: + value: '"repos/apache-mynewt-core/hw/mcu/ambiq/apollo3"' + + APOLLO3_SRAM_RESV: + description: Must match INFO0 SECURITY.SRAM_RESV (top SRAM not cleared by SBL) + value: 0 + + APOLLO3_SBL_STACK_MARGIN: + description: > + Extra bytes below usable top SRAM (prevents SBL crash) + value: 8 + UART_0: description: 'Whether to enable UART0' value: 1 @@ -479,4 +491,6 @@ syscfg.defs: value: APOLLO3_TIMER_SOURCE_HFRC syscfg.vals: + MCU_RAM_START: 0x10000000 + MCU_RAM_SIZE: 0x60000 OS_TICKS_PER_SEC: 128
