summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--c/src/lib/libbsp/arm/atsam/README7
-rw-r--r--c/src/lib/libbsp/arm/atsam/configure.ac6
-rw-r--r--c/src/lib/libbsp/arm/atsam/include/atsam-clock-config.h10
-rw-r--r--c/src/lib/libbsp/arm/atsam/libraries/libboard/include/board_memories.h4
-rw-r--r--c/src/lib/libbsp/arm/atsam/libraries/libboard/resources_v71/system_samv71.c4
-rw-r--r--c/src/lib/libbsp/arm/atsam/libraries/libchip/include/same70/system_same70.h7
-rw-r--r--c/src/lib/libbsp/arm/atsam/libraries/libchip/include/sams70/system_sams70.h7
-rw-r--r--c/src/lib/libbsp/arm/atsam/libraries/libchip/include/samv71/system_samv71.h7
-rw-r--r--c/src/lib/libbsp/arm/atsam/startup/bspstarthooks.c65
9 files changed, 95 insertions, 22 deletions
diff --git a/c/src/lib/libbsp/arm/atsam/README b/c/src/lib/libbsp/arm/atsam/README
index e21e7ee405..c374e861c3 100644
--- a/c/src/lib/libbsp/arm/atsam/README
+++ b/c/src/lib/libbsp/arm/atsam/README
@@ -22,8 +22,11 @@ Use ATSAM_MCK=XYZ to set the MCK frequency that should be used. The default case
evaluation kit. Some other configurations (e.g. 150MHz) would be too fast on
that board.
-Your application can also overwrite the clock settings. To overwrite the clock
-settings, define the following structures in your application:
+Your application can also overwrite the clock settings. If you have a
+bootloader with one setting in your internal flash and an application with
+another setting in your external SDRAM, you should also use the
+ATSAM_CHANGE_CLOCK_FROM_SRAM=1 option. To overwrite the clock settings, define
+the following structures in your application:
--------
const struct atsam_clock_config atsam_clock_config = {
diff --git a/c/src/lib/libbsp/arm/atsam/configure.ac b/c/src/lib/libbsp/arm/atsam/configure.ac
index a9f080d66d..8a4a2f2a7f 100644
--- a/c/src/lib/libbsp/arm/atsam/configure.ac
+++ b/c/src/lib/libbsp/arm/atsam/configure.ac
@@ -68,6 +68,12 @@ RTEMS_BSPOPTS_HELP([ATSAM_MCK],
[Frequency of the MCK in Hz. Set to 0 to force application defined speed.
See startup/pmc-config.c for available clock configurations.])
+RTEMS_BSPOPTS_SET([ATSAM_CHANGE_CLOCK_FROM_SRAM],[*],[0])
+RTEMS_BSPOPTS_HELP([ATSAM_CHANGE_CLOCK_FROM_SRAM],
+[Move the functions that set up the clock into the SRAM.
+This allows to change the clock frequency even if the application is started from SDRAM.
+Requires a TCM_SIZE > 0.])
+
RTEMS_BSPOPTS_SET([ATSAM_CONSOLE_BAUD],[*],[115200])
RTEMS_BSPOPTS_HELP([ATSAM_CONSOLE_BAUD],[initial baud for console devices (default 115200)])
diff --git a/c/src/lib/libbsp/arm/atsam/include/atsam-clock-config.h b/c/src/lib/libbsp/arm/atsam/include/atsam-clock-config.h
index acf0d0be75..396986894b 100644
--- a/c/src/lib/libbsp/arm/atsam/include/atsam-clock-config.h
+++ b/c/src/lib/libbsp/arm/atsam/include/atsam-clock-config.h
@@ -23,6 +23,14 @@
extern "C" {
#endif /* __cplusplus */
+#if ATSAM_CHANGE_CLOCK_FROM_SRAM != 0
+/* Note: fast_text is the simplest section to put this code into. Other
+ * possibilities would include creating a new section. */
+#define ATSAM_START_SRAM_SECTION BSP_FAST_TEXT_SECTION
+#else
+#define ATSAM_START_SRAM_SECTION
+#endif
+
struct atsam_clock_config {
/* Initialization value for the PMC_PLLAR. */
uint32_t pllar_init;
@@ -32,6 +40,7 @@ struct atsam_clock_config {
uint32_t mck_freq;
};
+ATSAM_START_SRAM_SECTION
extern const struct atsam_clock_config atsam_clock_config;
#define BOARD_MCK (atsam_clock_config.mck_freq)
@@ -43,6 +52,7 @@ struct BOARD_Sdram_Config {
uint32_t sdramc_cfr1;
};
+ATSAM_START_SRAM_SECTION
extern const struct BOARD_Sdram_Config BOARD_Sdram_Config;
#ifdef __cplusplus
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libboard/include/board_memories.h b/c/src/lib/libbsp/arm/atsam/libraries/libboard/include/board_memories.h
index 30767cd92a..72f8da55c6 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libboard/include/board_memories.h
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libboard/include/board_memories.h
@@ -41,7 +41,11 @@
* Exported functions
*----------------------------------------------------------------------------*/
+#ifndef __rtems__
extern void BOARD_ConfigureSdram(void);
+#else /* __rtems__ */
+extern void BOARD_ConfigureSdram(void) ATSAM_START_SRAM_SECTION;
+#endif /* __rtems__ */
extern uint32_t BOARD_SdramValidation(uint32_t baseAddr, uint32_t size);
#endif /* #ifndef BOARD_MEMORIES_H */
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libboard/resources_v71/system_samv71.c b/c/src/lib/libbsp/arm/atsam/libraries/libboard/resources_v71/system_samv71.c
index 72a4ec06e2..8d7eb8e6a7 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libboard/resources_v71/system_samv71.c
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libboard/resources_v71/system_samv71.c
@@ -78,7 +78,11 @@ extern "C" {
* \brief Setup the microcontroller system.
* Initialize the System and update the SystemFrequency variable.
*/
+#ifndef __rtems__
void SystemInit(void)
+#else /* __rtems__ */
+ void ATSAM_START_SRAM_SECTION SystemInit(void)
+#endif /* __rtems__ */
{
uint32_t read_MOR;
/* Set FWS according to SYS_BOARD_MCKR configuration */
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/same70/system_same70.h b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/same70/system_same70.h
index f4c4d8edd8..fd0428426c 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/same70/system_same70.h
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/same70/system_same70.h
@@ -29,6 +29,9 @@
#ifndef SYSTEM_SAME70_H_INCLUDED
#define SYSTEM_SAME70_H_INCLUDED
+#ifdef __rtems__
+#include <bsp/atsam-clock-config.h>
+#endif /* __rtems__ */
/* @cond 0 */
/**INDENT-OFF**/
@@ -46,7 +49,11 @@ extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */
* @brief Setup the microcontroller system.
* Initialize the System and update the SystemCoreClock variable.
*/
+#ifndef __rtems__
void SystemInit(void);
+#else /* __rtems__ */
+void ATSAM_START_SRAM_SECTION SystemInit(void);
+#endif /* __rtems__ */
/**
* @brief Updates the SystemCoreClock with current core Clock
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/sams70/system_sams70.h b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/sams70/system_sams70.h
index 9ecad30583..3e74f5c900 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/sams70/system_sams70.h
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/sams70/system_sams70.h
@@ -29,6 +29,9 @@
#ifndef SYSTEM_SAMS70_H_INCLUDED
#define SYSTEM_SAMS70_H_INCLUDED
+#ifdef __rtems__
+#include <bsp/atsam-clock-config.h>
+#endif /* __rtems__ */
/* @cond 0 */
/**INDENT-OFF**/
@@ -46,7 +49,11 @@ extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */
* @brief Setup the microcontroller system.
* Initialize the System and update the SystemCoreClock variable.
*/
+#ifndef __rtems__
void SystemInit(void);
+#else /* __rtems__ */
+void ATSAM_START_SRAM_SECTION SystemInit(void);
+#endif /* __rtems__ */
/**
* @brief Updates the SystemCoreClock with current core Clock
diff --git a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/samv71/system_samv71.h b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/samv71/system_samv71.h
index 39b17e8805..f38282d233 100644
--- a/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/samv71/system_samv71.h
+++ b/c/src/lib/libbsp/arm/atsam/libraries/libchip/include/samv71/system_samv71.h
@@ -29,6 +29,9 @@
#ifndef SYSTEM_SAMV71_H_INCLUDED
#define SYSTEM_SAMV71_H_INCLUDED
+#ifdef __rtems__
+#include <bsp/atsam-clock-config.h>
+#endif /* __rtems__ */
/* @cond 0 */
/**INDENT-OFF**/
@@ -46,7 +49,11 @@ extern uint32_t SystemCoreClock; /* System Clock Frequency (Core Clock) */
* @brief Setup the microcontroller system.
* Initialize the System and update the SystemCoreClock variable.
*/
+#ifndef __rtems__
void SystemInit(void);
+#else /* __rtems__ */
+void ATSAM_START_SRAM_SECTION SystemInit(void);
+#endif /* __rtems__ */
/**
* @brief Updates the SystemCoreClock with current core Clock
diff --git a/c/src/lib/libbsp/arm/atsam/startup/bspstarthooks.c b/c/src/lib/libbsp/arm/atsam/startup/bspstarthooks.c
index 8a42fd82bf..697ec88d67 100644
--- a/c/src/lib/libbsp/arm/atsam/startup/bspstarthooks.c
+++ b/c/src/lib/libbsp/arm/atsam/startup/bspstarthooks.c
@@ -70,32 +70,28 @@ static BSP_START_TEXT_SECTION bool tcm_setup_and_check_if_do_efc_config(
}
}
-void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
+static bool ATSAM_START_SRAM_SECTION sdram_settings_unchanged(void)
{
- uintptr_t tcm_size;
- uint32_t itcmcr_sz;
+ return (
+ (SDRAMC->SDRAMC_CR == BOARD_Sdram_Config.sdramc_cr) &&
+ (SDRAMC->SDRAMC_TR == BOARD_Sdram_Config.sdramc_tr) &&
+ (SDRAMC->SDRAMC_MDR == BOARD_Sdram_Config.sdramc_mdr) &&
+ (SDRAMC->SDRAMC_CFR1 == BOARD_Sdram_Config.sdramc_cfr1)
+ );
+}
- system_init_flash(BOARD_MCK);
+static void ATSAM_START_SRAM_SECTION setup_CPU_and_SDRAM(void)
+{
SystemInit();
-
- PIO_Configure(&atsam_pin_config[0], atsam_pin_config_count);
- MATRIX->CCFG_SYSIO = atsam_matrix_ccfg_sysio;
-
- if (!PMC_IsPeriphEnabled(ID_SDRAMC)) {
+ if (!PMC_IsPeriphEnabled(ID_SDRAMC) || !sdram_settings_unchanged()) {
BOARD_ConfigureSdram();
}
+}
- if ((SCB->CCR & SCB_CCR_IC_Msk) == 0) {
- SCB_EnableICache();
- }
-
- if ((SCB->CCR & SCB_CCR_DC_Msk) == 0) {
- SCB_EnableDCache();
- }
-
- _SetupMemoryRegion();
-
- /* Configure tightly coupled memory interfaces */
+static void configure_tcm(void)
+{
+ uintptr_t tcm_size;
+ uint32_t itcmcr_sz;
tcm_size = (uintptr_t) atsam_memory_itcm_size;
itcmcr_sz = (SCB->ITCMCR & SCB_ITCMCR_SZ_Msk) >> SCB_ITCMCR_SZ_Pos;
@@ -121,6 +117,35 @@ void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
}
}
+void BSP_START_TEXT_SECTION bsp_start_hook_0(void)
+{
+ system_init_flash(BOARD_MCK);
+
+ PIO_Configure(&atsam_pin_config[0], atsam_pin_config_count);
+ MATRIX->CCFG_SYSIO = atsam_matrix_ccfg_sysio;
+
+ configure_tcm();
+#if ATSAM_CHANGE_CLOCK_FROM_SRAM != 0
+ /* Early copy of .fast_text section for CPU and SDRAM setup. */
+ bsp_start_memcpy_libc(
+ bsp_section_fast_text_begin,
+ bsp_section_fast_text_load_begin,
+ (size_t) bsp_section_fast_text_size
+ );
+#endif
+ setup_CPU_and_SDRAM();
+
+ if ((SCB->CCR & SCB_CCR_IC_Msk) == 0) {
+ SCB_EnableICache();
+ }
+
+ if ((SCB->CCR & SCB_CCR_DC_Msk) == 0) {
+ SCB_EnableDCache();
+ }
+
+ _SetupMemoryRegion();
+}
+
void BSP_START_TEXT_SECTION bsp_start_hook_1(void)
{
bsp_start_copy_sections_compact();