forked from Imagelibrary/rtems
ARM: Add BSP_START_NEEDS_REGISTER_INITIALIZATION
This patch adds the macro BSP_START_NEEDS_REGISTER_INITIALIZATION and three hooks for BSP-specific register init code to arm/shared/start.S. Said hooks are bsp_start_init_registers_core (intended for initializing the ARM core registers), bsp_start_init_registers_banked_fiq (for the FIQ mode banked registers) and bsp_start_init_registers_vfp (for the FPU registers). BSP_START_NEEDS_REGISTER_INITIALIZATION would be defined in a BSP's configure.ac (so that it appears in its bspopts.h). This patch also adds the register init code required by the TMS570. We've tested it with the tms570ls3137_hdk.cfg config and it works fine.
This commit is contained in:
committed by
Sebastian Huber
parent
63e91fe689
commit
991fdb330b
@@ -48,6 +48,12 @@
|
|||||||
.extern _ARMV4_Exception_fiq_default
|
.extern _ARMV4_Exception_fiq_default
|
||||||
.extern _ARMV7M_Exception_default
|
.extern _ARMV7M_Exception_default
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
.extern bsp_start_init_registers_core
|
||||||
|
.extern bsp_start_init_registers_banked_fiq
|
||||||
|
.extern bsp_start_init_registers_vfp
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Global symbols */
|
/* Global symbols */
|
||||||
.globl _start
|
.globl _start
|
||||||
.globl bsp_start_vector_table_begin
|
.globl bsp_start_vector_table_begin
|
||||||
@@ -127,6 +133,10 @@ _start:
|
|||||||
* loader.
|
* loader.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
bl bsp_start_init_registers_core
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef RTEMS_SMP
|
#ifdef RTEMS_SMP
|
||||||
/* Read MPIDR */
|
/* Read MPIDR */
|
||||||
mrc p15, 0, r0, c0, c0, 5
|
mrc p15, 0, r0, c0, c0, 5
|
||||||
@@ -161,6 +171,10 @@ _start:
|
|||||||
add sp, r1
|
add sp, r1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
bl bsp_start_init_registers_banked_fiq
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Enter ABT mode and set up the ABT stack pointer */
|
/* Enter ABT mode and set up the ABT stack pointer */
|
||||||
mov r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
|
mov r0, #(ARM_PSR_M_ABT | ARM_PSR_I | ARM_PSR_F)
|
||||||
msr cpsr, r0
|
msr cpsr, r0
|
||||||
@@ -207,6 +221,11 @@ _start:
|
|||||||
/* Enable FPU */
|
/* Enable FPU */
|
||||||
mov r0, #(1 << 30)
|
mov r0, #(1 << 30)
|
||||||
vmsr FPEXC, r0
|
vmsr FPEXC, r0
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
bl bsp_start_init_registers_vfp
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* ARM_MULTILIB_VFP */
|
#endif /* ARM_MULTILIB_VFP */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -304,6 +323,10 @@ bsp_start_vector_table_end:
|
|||||||
|
|
||||||
_start:
|
_start:
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
bl bsp_start_init_registers_core
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ARM_MULTILIB_VFP
|
#ifdef ARM_MULTILIB_VFP
|
||||||
/*
|
/*
|
||||||
* Enable CP10 and CP11 coprocessors for privileged and user mode in
|
* Enable CP10 and CP11 coprocessors for privileged and user mode in
|
||||||
@@ -315,8 +338,13 @@ _start:
|
|||||||
str r1, [r0]
|
str r1, [r0]
|
||||||
dsb
|
dsb
|
||||||
isb
|
isb
|
||||||
|
|
||||||
|
#ifdef BSP_START_NEEDS_REGISTER_INITIALIZATION
|
||||||
|
bl bsp_start_init_registers_vfp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_VFP */
|
||||||
|
|
||||||
ldr sp, =bsp_stack_main_end
|
ldr sp, =bsp_stack_main_end
|
||||||
ldr lr, =bsp_start_hook_0_done + 1
|
ldr lr, =bsp_start_hook_0_done + 1
|
||||||
b bsp_start_hook_0
|
b bsp_start_hook_0
|
||||||
|
|||||||
105
c/src/lib/libbsp/arm/shared/startup/bsp-start-init-registers.S
Normal file
105
c/src/lib/libbsp/arm/shared/startup/bsp-start-init-registers.S
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/**
|
||||||
|
* @file bsp-start-init-registers.S
|
||||||
|
*
|
||||||
|
* @brief ARM register initialization routines.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2015 Taller Technologies. All rights reserved.
|
||||||
|
*
|
||||||
|
* @author Martin Galvan <martin.galvan@tallertechnologies.com>
|
||||||
|
*
|
||||||
|
* The license and distribution terms for this file may be
|
||||||
|
* found in the file LICENSE in this distribution or at
|
||||||
|
* http://www.rtems.org/license/LICENSE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These routines initialize the core and VFP registers of ARM CPUs.
|
||||||
|
* This is necessary for boards that operate in a 1oo1D fashion,
|
||||||
|
* such as the TMS570.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <rtems/asm.h>
|
||||||
|
|
||||||
|
.section .text
|
||||||
|
.syntax unified
|
||||||
|
.cpu cortex-r4
|
||||||
|
.arm
|
||||||
|
|
||||||
|
/* Initialization of the ARM core registers. */
|
||||||
|
FUNCTION_ENTRY(bsp_start_init_registers_core)
|
||||||
|
mov r0, #0
|
||||||
|
mov r1, #0
|
||||||
|
mov r2, #0
|
||||||
|
mov r3, #0
|
||||||
|
mov r4, #0
|
||||||
|
mov r5, #0
|
||||||
|
mov r6, #0
|
||||||
|
mov r7, #0
|
||||||
|
mov r8, #0
|
||||||
|
mov r9, #0
|
||||||
|
mov r10, #0
|
||||||
|
mov r11, #0
|
||||||
|
mov r12, #0
|
||||||
|
mov r13, #0
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
FUNCTION_END(bsp_start_init_registers_core)
|
||||||
|
|
||||||
|
/* Initialization of the FIQ mode banked registers. */
|
||||||
|
FUNCTION_ENTRY(bsp_start_init_registers_banked_fiq)
|
||||||
|
mov r8, #0
|
||||||
|
mov r9, #0
|
||||||
|
mov r10, #0
|
||||||
|
mov r11, #0
|
||||||
|
mov r12, #0
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
FUNCTION_END(bsp_start_init_registers_banked_fiq)
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_VFP
|
||||||
|
|
||||||
|
/* Initialization of the FPU registers. */
|
||||||
|
FUNCTION_ENTRY(bsp_start_init_registers_vfp)
|
||||||
|
mov r0, #0
|
||||||
|
vmov d0, r0, r0
|
||||||
|
vmov d1, r0, r0
|
||||||
|
vmov d2, r0, r0
|
||||||
|
vmov d3, r0, r0
|
||||||
|
vmov d4, r0, r0
|
||||||
|
vmov d5, r0, r0
|
||||||
|
vmov d6, r0, r0
|
||||||
|
vmov d7, r0, r0
|
||||||
|
vmov d8, r0, r0
|
||||||
|
vmov d9, r0, r0
|
||||||
|
vmov d10, r0, r0
|
||||||
|
vmov d11, r0, r0
|
||||||
|
vmov d12, r0, r0
|
||||||
|
vmov d13, r0, r0
|
||||||
|
vmov d14, r0, r0
|
||||||
|
vmov d15, r0, r0
|
||||||
|
|
||||||
|
#ifdef ARM_MULTILIB_VFP_D32
|
||||||
|
vmov d16, r0, r0
|
||||||
|
vmov d17, r0, r0
|
||||||
|
vmov d18, r0, r0
|
||||||
|
vmov d19, r0, r0
|
||||||
|
vmov d20, r0, r0
|
||||||
|
vmov d21, r0, r0
|
||||||
|
vmov d22, r0, r0
|
||||||
|
vmov d23, r0, r0
|
||||||
|
vmov d24, r0, r0
|
||||||
|
vmov d25, r0, r0
|
||||||
|
vmov d26, r0, r0
|
||||||
|
vmov d27, r0, r0
|
||||||
|
vmov d28, r0, r0
|
||||||
|
vmov d29, r0, r0
|
||||||
|
vmov d30, r0, r0
|
||||||
|
vmov d31, r0, r0
|
||||||
|
#endif /* ARM_MULTILIB_VFP_D32 */
|
||||||
|
|
||||||
|
bx lr
|
||||||
|
FUNCTION_END(bsp_start_init_registers_vfp)
|
||||||
|
|
||||||
|
#endif /* ARM_MULTILIB_VFP */
|
||||||
@@ -82,6 +82,7 @@ libbsp_a_SOURCES += ../../shared/cpucounterdiff.c
|
|||||||
|
|
||||||
# Startup
|
# Startup
|
||||||
libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
|
libbsp_a_SOURCES += ../shared/startup/bsp-start-memcpy.S
|
||||||
|
libbsp_a_SOURCES += ../shared/startup/bsp-start-init-registers.S
|
||||||
libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c
|
libbsp_a_SOURCES += ../../shared/bsppretaskinghook.c
|
||||||
libbsp_a_SOURCES += startup/bspreset.c
|
libbsp_a_SOURCES += startup/bspreset.c
|
||||||
libbsp_a_SOURCES += startup/bspstart.c
|
libbsp_a_SOURCES += startup/bspstart.c
|
||||||
|
|||||||
@@ -36,6 +36,11 @@ RTEMS_BSPOPTS_SET([BSP_MINIMUM_TASK_STACK_SIZE],[*],[1024])
|
|||||||
RTEMS_BSPOPTS_HELP([BSP_MINIMUM_TASK_STACK_SIZE],[Suggested minimum task stack
|
RTEMS_BSPOPTS_HELP([BSP_MINIMUM_TASK_STACK_SIZE],[Suggested minimum task stack
|
||||||
size in bytes])
|
size in bytes])
|
||||||
|
|
||||||
|
RTEMS_BSPOPTS_SET([BSP_START_NEEDS_REGISTER_INITIALIZATION],[*],[1])
|
||||||
|
RTEMS_BSPOPTS_HELP([BSP_START_NEEDS_REGISTER_INITIALIZATION],
|
||||||
|
[The TMS570 needs to have the registers of its CPU initialized
|
||||||
|
to avoid CCMR4F errors])
|
||||||
|
|
||||||
RTEMS_BSPOPTS_SET([TMS570_OSCILLATOR_MAIN],[*],[12000000U])
|
RTEMS_BSPOPTS_SET([TMS570_OSCILLATOR_MAIN],[*],[12000000U])
|
||||||
RTEMS_BSPOPTS_HELP([TMS570_OSCILLATOR_MAIN],[main oscillator frequency in Hz])
|
RTEMS_BSPOPTS_HELP([TMS570_OSCILLATOR_MAIN],[main oscillator frequency in Hz])
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user