Skip to content

Commit

Permalink
Nuvoton: Refine external RAM config (#436)
Browse files Browse the repository at this point in the history
* NUC472: Fix no XRAM build failure

This fixes linker script is missing on no XRAM build.

* NUC472: Refine config to support EBI RAM

This refines config to support EBI RAM:
1. Use memory bank information to describe EBI RAM
2. Drop target labels NU_XRAM_SUPPORTED/NU_XRAM_UNSUPPORTED and add target
   config "target.ebi-enable" to enable EBI RAM

* M467: Refine config to support HyperRAM

This uses memory bank information to describe HyperRAM.
  • Loading branch information
ccli8 authored Feb 21, 2025
1 parent ed468ce commit 0553c11
Show file tree
Hide file tree
Showing 9 changed files with 104 additions and 283 deletions.
21 changes: 9 additions & 12 deletions targets/TARGET_NUVOTON/TARGET_M460/device/M460_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,20 +57,17 @@
#define MBED_CONFIGURED_RAM_BANK_IRAM1_SIZE MBED_RAM_BANK_IRAM1_SIZE
#endif

/* Physical HYPERRAM1 start/size */
#if !defined(MBED_RAM_BANK_HYPERRAM1_START)
#define MBED_RAM_BANK_HYPERRAM1_START 0x80000000
#endif
#if !defined(MBED_RAM_BANK_HYPERRAM1_SIZE)
#define MBED_RAM_BANK_HYPERRAM1_SIZE 0x800000
#if defined(MBED_CONFIGURED_RAM_BANK_HYPERRAM1_START) && \
(MBED_CONFIGURED_RAM_BANK_HYPERRAM1_SIZE != 0x0)
#define NU_HAVE_HYPERRAM1 1
#else
#define NU_HAVE_HYPERRAM1 0
#endif

/* Configured HYPERRAM1 start/size */
#if !defined(MBED_CONFIGURED_RAM_BANK_HYPERRAM1_START)
#define MBED_CONFIGURED_RAM_BANK_HYPERRAM1_START MBED_RAM_BANK_HYPERRAM1_START
#endif
#if !defined(MBED_CONFIGURED_RAM_BANK_HYPERRAM1_SIZE)
#define MBED_CONFIGURED_RAM_BANK_HYPERRAM1_SIZE MBED_RAM_BANK_HYPERRAM1_SIZE
#if NU_HAVE_HYPERRAM1 && MBED_CONF_TARGET_HBI_ENABLE
#define NU_ENABLE_HYPERRAM1 1
#else
#define NU_ENABLE_HYPERRAM1 0
#endif

#endif /* __M460_MEM_H__ */
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,9 @@ MEMORY
VECTORS (rx) : ORIGIN = MBED_CONFIGURED_ROM_BANK_IROM1_START, LENGTH = 0x00000400
FLASH (rx) : ORIGIN = MBED_CONFIGURED_ROM_BANK_IROM1_START + 0x400, LENGTH = MBED_CONFIGURED_ROM_BANK_IROM1_SIZE - 0x00000400
RAM_INTERN (rwx) : ORIGIN = MBED_CONFIGURED_RAM_BANK_IRAM1_START, LENGTH = MBED_CONFIGURED_RAM_BANK_IRAM1_SIZE
#if NU_ENABLE_HYPERRAM1
HYPERRAM (rwx) : ORIGIN = MBED_CONFIGURED_RAM_BANK_HYPERRAM1_START, LENGTH = MBED_CONFIGURED_RAM_BANK_HYPERRAM1_SIZE
#endif
}

/**
Expand Down Expand Up @@ -93,6 +95,7 @@ SECTIONS
LONG (ADDR(.data))
LONG (SIZEOF(.data))

#if NU_ENABLE_HYPERRAM1
/* .text.nu.hyperram located at HyperRAM */
LONG (LOADADDR(.text.nu.hyperram))
LONG (ADDR(.text.nu.hyperram))
Expand All @@ -102,6 +105,7 @@ SECTIONS
LONG (LOADADDR(.data.nu.hyperram))
LONG (ADDR(.data.nu.hyperram))
LONG (SIZEOF(.data.nu.hyperram))
#endif

__copy_table_end__ = .;
} > FLASH
Expand All @@ -114,13 +118,16 @@ SECTIONS
LONG (ADDR(.bss))
LONG (SIZEOF(.bss))

#if NU_ENABLE_HYPERRAM1
/* .bss.nu.hyperram located at HyperRAM */
LONG (ADDR(.bss.nu.hyperram))
LONG (SIZEOF(.bss.nu.hyperram))
#endif

__zero_table_end__ = .;
} > FLASH

#if NU_ENABLE_HYPERRAM1
/* First match used, so place in front of .text */
.text.nu.hyperram :
{
Expand All @@ -130,6 +137,7 @@ SECTIONS
Image$$NU_HYPERRAM$$RO$$Base = ADDR(.text.nu.hyperram);
Image$$NU_HYPERRAM$$RO$$Limit = ADDR(.text.nu.hyperram) + SIZEOF(.text.nu.hyperram);
Image$$NU_HYPERRAM$$RO$$Length = SIZEOF(.text.nu.hyperram);
#endif

.text :
{
Expand Down Expand Up @@ -208,6 +216,7 @@ SECTIONS
__CRASH_DATA_RAM_END__ = .; /* Define a global symbol at data end */
} > RAM_INTERN

#if NU_ENABLE_HYPERRAM1
/* First match used, so place in front of .data */
.data.nu.hyperram :
{
Expand All @@ -217,6 +226,7 @@ SECTIONS
Image$$NU_HYPERRAM$$RW$$Base = ADDR(.data.nu.hyperram);
Image$$NU_HYPERRAM$$RW$$Limit = ADDR(.data.nu.hyperram) + SIZEOF(.data.nu.hyperram);
Image$$NU_HYPERRAM$$RW$$Length = SIZEOF(.data.nu.hyperram);
#endif

.data :
{
Expand Down Expand Up @@ -266,6 +276,7 @@ SECTIONS
__uninitialized_end = .;
} > RAM_INTERN

#if NU_ENABLE_HYPERRAM1
/* First match used, so place in front of .bss */
/* If a variable defined with __attribute__((section())) keyword the
* variable is treated like an initialized variable. To not waste memory
Expand All @@ -279,6 +290,7 @@ SECTIONS
Image$$NU_HYPERRAM$$ZI$$Base = ADDR(.bss.nu.hyperram);
Image$$NU_HYPERRAM$$ZI$$Limit = ADDR(.bss.nu.hyperram) + SIZEOF(.bss.nu.hyperram);
Image$$NU_HYPERRAM$$ZI$$Length = SIZEOF(.bss.nu.hyperram);
#endif

.bss (NOLOAD):
{
Expand Down
8 changes: 4 additions & 4 deletions targets/TARGET_NUVOTON/TARGET_M460/device/system_M460.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
*****************************************************************************/

#include "NuMicro.h"

#include "M460_mem.h"

/*----------------------------------------------------------------------------
DEFINES
Expand Down Expand Up @@ -93,7 +93,7 @@ void SystemInit (void)
/* Lock protected registers */
SYS_LockReg();

#if defined(MBED_CONF_TARGET_HBI_ENABLE) && MBED_CONF_TARGET_HBI_ENABLE
#if MBED_CONF_TARGET_HBI_ENABLE
/* Initialize HBI for HyperRAM */
void nu_hbi_init(void);
nu_hbi_init();
Expand Down Expand Up @@ -138,7 +138,7 @@ int32_t nu_hyperram_used(void)
return NU_HYPERRAM_USED;
}

#if defined(MBED_CONF_TARGET_HBI_ENABLE) && MBED_CONF_TARGET_HBI_ENABLE
#if MBED_CONF_TARGET_HBI_ENABLE

/* Simple array size macro without type check */
#define _NU_ARRAY_SIZE(arr) (sizeof(arr)/sizeof(arr[0]))
Expand Down Expand Up @@ -187,4 +187,4 @@ void nu_hbi_init(void)
SYS_LockReg();
}

#endif /* #if defined(MBED_CONF_TARGET_HBI_ENABLE) && MBED_CONF_TARGET_HBI_ENABLE */
#endif /* #if MBED_CONF_TARGET_HBI_ENABLE */
26 changes: 5 additions & 21 deletions targets/TARGET_NUVOTON/TARGET_NUC472/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,27 +2,9 @@
# SPDX-License-Identifier: Apache-2.0

if(${MBED_TOOLCHAIN} STREQUAL "GCC_ARM")
if("NU_XRAM_SUPPORTED" IN_LIST MBED_TARGET_LABELS)
set(LINKER_FILE_NU_XRAM_SUPPORTED device/TOOLCHAIN_GCC_ARM/TARGET_NU_XRAM_SUPPORTED/NUC472.ld)
elseif("NU_XRAM_UNSUPPORTED" IN_LIST MBED_TARGET_LABELS)
set(LINKER_FILE_NU_XRAM_UNSUPPORTED device/TOOLCHAIN_GCC_ARM/TARGET_NU_XRAM_UNSUPPORTED/NUC472.ld)
endif()
elseif(${MBED_TOOLCHAIN} STREQUAL "ARM")
if("NU_XRAM_SUPPORTED" IN_LIST MBED_TARGET_LABELS)
set(LINKER_FILE_NU_XRAM_SUPPORTED device/TOOLCHAIN_ARM_STD/TARGET_NU_XRAM_SUPPORTED/NUC472.sct)
elseif("NU_XRAM_UNSUPPORTED" IN_LIST MBED_TARGET_LABELS)
set(LINKER_FILE_NU_XRAM_UNSUPPORTED device/TOOLCHAIN_ARM_STD/TARGET_NU_XRAM_UNSUPPORTED/NUC472.sct)
endif()
set(LINKER_FILE device/TOOLCHAIN_GCC_ARM/NUC472.ld)
endif()

add_library(mbed-nu-xram-supported INTERFACE)
mbed_set_linker_script(mbed-nu-xram-supported ${CMAKE_CURRENT_SOURCE_DIR}/${LINKER_FILE_NU_XRAM_SUPPORTED})

add_library(mbed-nu-xram-unsupported INTERFACE)
mbed_set_linker_script(mbed-nu-xram-unsupported ${CMAKE_CURRENT_SOURCE_DIR}/${LINKER_FILE_NU_XRAM_UNSUPPORTED})



add_library(mbed-nuc472 INTERFACE)

target_sources(mbed-nuc472
Expand Down Expand Up @@ -90,8 +72,10 @@ target_include_directories(mbed-nuc472
device/StdDriver
)

target_link_libraries(mbed-nuc472 INTERFACE mbed-nuvoton)
target_link_libraries(mbed-nuc472 INTERFACE mbed-nuvoton mbed-flash-cmsis-algo)

mbed_set_linker_script(mbed-nuc472 ${CMAKE_CURRENT_SOURCE_DIR}/${LINKER_FILE})

add_library(mbed-numaker-pfm-nuc472 INTERFACE)

target_link_libraries(mbed-numaker-pfm-nuc472 INTERFACE mbed-nuc472 mbed-nu-xram-supported mbed-flash-cmsis-algo)
target_link_libraries(mbed-numaker-pfm-nuc472 INTERFACE mbed-nuc472)
21 changes: 9 additions & 12 deletions targets/TARGET_NUVOTON/TARGET_NUC472/device/NUC472_mem.h
Original file line number Diff line number Diff line change
Expand Up @@ -57,20 +57,17 @@
#define MBED_CONFIGURED_RAM_BANK_IRAM1_SIZE MBED_RAM_BANK_IRAM1_SIZE
#endif

/* Physical XRAM1 start/size */
#if !defined(MBED_RAM_BANK_XRAM1_START)
#define MBED_RAM_BANK_XRAM1_START 0x60000000
#endif
#if !defined(MBED_RAM_BANK_XRAM1_SIZE)
#define MBED_RAM_BANK_XRAM1_SIZE 0x100000
#if defined(MBED_CONFIGURED_RAM_BANK_EBIRAM1_START) && \
(MBED_CONFIGURED_RAM_BANK_EBIRAM1_SIZE != 0x0)
#define NU_HAVE_EBIRAM1 1
#else
#define NU_HAVE_EBIRAM1 0
#endif

/* Configured XRAM1 start/size */
#if !defined(MBED_CONFIGURED_RAM_BANK_XRAM1_START)
#define MBED_CONFIGURED_RAM_BANK_XRAM1_START MBED_RAM_BANK_XRAM1_START
#endif
#if !defined(MBED_CONFIGURED_RAM_BANK_XRAM1_SIZE)
#define MBED_CONFIGURED_RAM_BANK_XRAM1_SIZE MBED_RAM_BANK_XRAM1_SIZE
#if NU_HAVE_EBIRAM1 && MBED_CONF_TARGET_EBI_ENABLE
#define NU_ENABLE_EBIRAM1 1
#else
#define NU_ENABLE_EBIRAM1 0
#endif

#endif /* __NUC472_MEM_H__ */
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
* Nuvoton NUC472 GCC linker script file
*/

#include "../../NUC472_mem.h"
#include "../NUC472_mem.h"

#if !defined(MBED_CONF_TARGET_BOOT_STACK_SIZE)
# if defined(MBED_BOOT_STACK_SIZE)
Expand All @@ -21,6 +21,9 @@ MEMORY
VECTORS (rx) : ORIGIN = MBED_CONFIGURED_ROM_BANK_IROM1_START, LENGTH = 0x00000400
FLASH (rx) : ORIGIN = MBED_CONFIGURED_ROM_BANK_IROM1_START + 0x400, LENGTH = MBED_CONFIGURED_ROM_BANK_IROM1_SIZE - 0x00000400
RAM_INTERN (rwx) : ORIGIN = MBED_CONFIGURED_RAM_BANK_IRAM1_START, LENGTH = MBED_CONFIGURED_RAM_BANK_IRAM1_SIZE
#if NU_ENABLE_EBIRAM1
RAM_EXTERN (rwx) : ORIGIN = MBED_CONFIGURED_RAM_BANK_EBIRAM1_START, LENGTH = MBED_CONFIGURED_RAM_BANK_EBIRAM1_SIZE
#endif
}

/**
Expand Down Expand Up @@ -66,7 +69,6 @@ SECTIONS
} > VECTORS



.text :
{

Expand Down Expand Up @@ -200,8 +202,12 @@ SECTIONS
*lwip_*.o(COMMON)
*mesh_system.o(.bss*)
__bss_extern_end__ = .;
#if NU_ENABLE_EBIRAM1
} > RAM_EXTERN
#else
} > RAM_INTERN

#endif

.bss (NOLOAD):
{
__bss_start__ = .;
Expand All @@ -210,6 +216,16 @@ SECTIONS
__bss_end__ = .;
} > RAM_INTERN

#if NU_ENABLE_EBIRAM1
.heap (NOLOAD):
{
__end__ = .;
end = __end__;
*(.heap*);
. += (ORIGIN(RAM_EXTERN) + LENGTH(RAM_EXTERN) - .);
__HeapLimit = .;
} > RAM_EXTERN
#else
.heap (NOLOAD):
{
__end__ = .;
Expand All @@ -218,6 +234,7 @@ SECTIONS
. += (ORIGIN(RAM_INTERN) + LENGTH(RAM_INTERN) - .);
__HeapLimit = .;
} > RAM_INTERN
#endif
PROVIDE(__heap_size = SIZEOF(.heap));
PROVIDE(__mbed_sbrk_start = ADDR(.heap));
PROVIDE(__mbed_krbs_start = ADDR(.heap) + SIZEOF(.heap));
Expand Down
Loading

0 comments on commit 0553c11

Please # to comment.