你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

u-boot 启动问题

[复制链接]
HiPP 提问时间:2024-7-28 22:37 / 未解决

背景

近期开始学习嵌入式开发,选择的是STM32MP157-D开发板,根据网上的教程,在学习ST官方u-boot 2022.10时发现启动流程与网上的教程不一致。

u-boot.lds

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * Copyright (c) 2004-2008 Texas Instruments
 *
 * (C) Copyright 2002
 * Gary Jennejohn, DENX Software Engineering, <[email]garyj@denx.de[/email]>
 */

#include <config.h>
#include <asm/psci.h>

OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
#ifndef CONFIG_CMDLINE
    /DISCARD/ : { *(__u_boot_list_2_cmd_*) }
#endif
#if defined(CONFIG_ARMV7_SECURE_BASE) && defined(CONFIG_ARMV7_NONSEC)
    /*
     * If CONFIG_ARMV7_SECURE_BASE is true, secure code will not
     * bundle with u-boot, and code offsets are fixed. Secure zone
     * only needs to be copied from the loading address to
     * CONFIG_ARMV7_SECURE_BASE, which is the linking and running
     * address for secure code.
     *
     * If CONFIG_ARMV7_SECURE_BASE is undefined, the secure zone will
     * be included in u-boot address space, and some absolute address
     * were used in secure code. The absolute addresses of the secure
     * code also needs to be relocated along with the accompanying u-boot
     * code.
     *
     * So DISCARD is only for CONFIG_ARMV7_SECURE_BASE.
     */
    /DISCARD/ : { *(.rel._secure*) }
#endif
    . = 0x00000000;

    . = ALIGN(4);
    .text :
    {
        *(.__image_copy_start)
        *(.vectors)
        CPUDIR/start.o (.text*)
    }

    /* This needs to come before *(.text*) */
    .__efi_runtime_start : {
        *(.__efi_runtime_start)
    }

    .efi_runtime : {
        *(.text.efi_runtime*)
        *(.rodata.efi_runtime*)
        *(.data.efi_runtime*)
    }

    .__efi_runtime_stop : {
        *(.__efi_runtime_stop)
    }

    .text_rest :
    {
        *(.text*)
    }

#ifdef CONFIG_ARMV7_NONSEC

    /* Align the secure section only if we're going to use it in situ */
    .__secure_start
#ifndef CONFIG_ARMV7_SECURE_BASE
        ALIGN(CONSTANT(COMMONPAGESIZE))
#endif
    : {
        KEEP(*(.__secure_start))
    }

#ifndef CONFIG_ARMV7_SECURE_BASE
#define CONFIG_ARMV7_SECURE_BASE
#define __ARMV7_PSCI_STACK_IN_RAM
#endif

    .secure_text CONFIG_ARMV7_SECURE_BASE :
        AT(ADDR(.__secure_start) + SIZEOF(.__secure_start))
    {
        *(._secure.text)
    }

    .secure_data : AT(LOADADDR(.secure_text) + SIZEOF(.secure_text))
    {
        *(._secure.data)
    }

#ifdef CONFIG_ARMV7_PSCI
    .secure_stack ALIGN(ADDR(.secure_data) + SIZEOF(.secure_data),
                CONSTANT(COMMONPAGESIZE)) (NOLOAD) :
#ifdef __ARMV7_PSCI_STACK_IN_RAM
        AT(ADDR(.secure_stack))
#else
        AT(LOADADDR(.secure_data) + SIZEOF(.secure_data))
#endif
    {
        KEEP(*(.__secure_stack_start))

        /* Skip addreses for stack */
        . = . + CONFIG_ARMV7_PSCI_NR_CPUS * ARM_PSCI_STACK_SIZE;

        /* Align end of stack section to page boundary */
        . = ALIGN(CONSTANT(COMMONPAGESIZE));

        KEEP(*(.__secure_stack_end))

#ifdef CONFIG_ARMV7_SECURE_MAX_SIZE
        /*
         * We are not checking (__secure_end - __secure_start) here,
         * as these are the load addresses, and do not include the
         * stack section. Instead, use the end of the stack section
         * and the start of the text section.
         */
        ASSERT((. - ADDR(.secure_text)) <= CONFIG_ARMV7_SECURE_MAX_SIZE,
               "Error: secure section exceeds secure memory size");
#endif
    }

#ifndef __ARMV7_PSCI_STACK_IN_RAM
    /* Reset VMA but don't allocate space if we have secure SRAM */
    . = LOADADDR(.secure_stack);
#endif

#endif

    .__secure_end : AT(ADDR(.__secure_end)) {
        *(.__secure_end)
        LONG(0x1d1071c);    /* Must output something to reset LMA */
    }
#endif

    . = ALIGN(4);
    .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

    . = ALIGN(4);
    .data : {
        *(.data*)
    }

    . = ALIGN(4);

    . = .;

    . = ALIGN(4);
    __u_boot_list : {
        KEEP(*(SORT(__u_boot_list*)));
    }

    . = ALIGN(4);

    .efi_runtime_rel_start :
    {
        *(.__efi_runtime_rel_start)
    }

    .efi_runtime_rel : {
        *(.rel*.efi_runtime)
        *(.rel*.efi_runtime.*)
    }

    .efi_runtime_rel_stop :
    {
        *(.__efi_runtime_rel_stop)
    }

    . = ALIGN(4);

    .image_copy_end :
    {
        *(.__image_copy_end)
    }

    .rel_dyn_start :
    {
        *(.__rel_dyn_start)
    }

    .rel.dyn : {
        *(.rel*)
    }

    .rel_dyn_end :
    {
        *(.__rel_dyn_end)
    }

    .end :
    {
        *(.__end)
    }

    _image_binary_end = .;

    /*
     * Deprecated: this MMU section is used by pxa at present but
     * should not be used by new boards/CPUs.
     */
    . = ALIGN(4096);
    .mmutable : {
        *(.mmutable)
    }

/*
 * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c
 * __bss_base and __bss_limit are for linker only (overlay ordering)
 */

    .bss_start __rel_dyn_start (OVERLAY) : {
        KEEP(*(.__bss_start));
        __bss_base = .;
    }

    .bss __bss_base (OVERLAY) : {
        *(.bss*)
         . = ALIGN(4);
         __bss_limit = .;
    }

    .bss_end __bss_limit (OVERLAY) : {
        KEEP(*(.__bss_end));
    }

    .dynsym _image_binary_end : { *(.dynsym) }
    .dynbss : { *(.dynbss) }
    .dynstr : { *(.dynstr*) }
    .dynamic : { *(.dynamic*) }
    .plt : { *(.plt*) }
    .interp : { *(.interp*) }
    .gnu.hash : { *(.gnu.hash) }
    .gnu : { *(.gnu*) }
    .ARM.exidx : { *(.ARM.exidx*) }
    .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }
}

通过ENTRY确定入口为_start

vectors.S

根据网上的教程,确认_start在vectors.S文件,文件内容如下:

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 *  vectors - Generic ARM exception table code
 *
 *  Copyright (c) 1998  Dan Malek <[email]dmalek@jlc.net[/email]>
 *  Copyright (c) 1999  Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
 *  Copyright (c) 2000  Wolfgang Denk <[email]wd@denx.de[/email]>
 *  Copyright (c) 2001  Alex Züpke <[email]azu@sysgo.de[/email]>
 *  Copyright (c) 2001  Marius Gröger <[email]mag@sysgo.de[/email]>
 *  Copyright (c) 2002  Alex Züpke <[email]azu@sysgo.de[/email]>
 *  Copyright (c) 2002  Gary Jennejohn <[email]garyj@denx.de[/email]>
 *  Copyright (c) 2002  Kyle Harris <[email]kharris@nexus-tech.net[/email]>
 */

#include <config.h>

/*
 * A macro to allow insertion of an ARM exception vector either
 * for the non-boot0 case or by a boot0-header.
 */
        .macro ARM_VECTORS
#ifdef CONFIG_ARCH_K3
    ldr     pc, _reset
#else
    b   reset
#endif
#if !CONFIG_IS_ENABLED(SYS_NO_VECTOR_TABLE)
    ldr pc, _undefined_instruction
    ldr pc, _software_interrupt
    ldr pc, _prefetch_abort
    ldr pc, _data_abort
    ldr pc, _not_used
    ldr pc, _irq
    ldr pc, _fiq
#endif
    .endm


/*
 *************************************************************************
 *
 * Symbol _start is referenced elsewhere, so make it global
 *
 *************************************************************************
 */

.globl _start

/*
 *************************************************************************
 *
 * Vectors have their own section so linker script can map them easily
 *
 *************************************************************************
 */

    .section ".vectors", "ax"

#if defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK)
/*
 * Various SoCs need something special and SoC-specific up front in
 * order to boot, allow them to set that in their boot0.h file and then
 * use it here.
 *
 * To allow a boot0 hook to insert a 'special' sequence after the vector
 * table (e.g. for the socfpga), the presence of a boot0 hook supresses
 * the below vector table and assumes that the vector table is filled in
 * by the boot0 hook.  The requirements for a boot0 hook thus are:
 *   (1) defines '_start:' as appropriate
 *   (2) inserts the vector table using ARM_VECTORS as appropriate
 */
#include <asm/arch/boot0.h>
#else

/*
 *************************************************************************
 *
 * Exception vectors as described in ARM reference manuals
 *
 * Uses indirect branch to allow reaching handlers anywhere in memory.
 *
 *************************************************************************
 */

_start:
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
    .word   CONFIG_SYS_DV_NOR_BOOT_CFG
#endif
    ARM_VECTORS
#endif /* !defined(CONFIG_ENABLE_ARM_SOC_BOOT0_HOOK) */

#if !CONFIG_IS_ENABLED(SYS_NO_VECTOR_TABLE)
/*
 *************************************************************************
 *
 * Indirect vectors table
 *
 * Symbols referenced here must be defined somewhere else
 *
 *************************************************************************
 */

    .globl  _reset
    .globl  _undefined_instruction
    .globl  _software_interrupt
    .globl  _prefetch_abort
    .globl  _data_abort
    .globl  _not_used
    .globl  _irq
    .globl  _fiq

#ifdef CONFIG_ARCH_K3
_reset:         .word reset
#endif
_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:    .word prefetch_abort
_data_abort:        .word data_abort
_not_used:      .word not_used
_irq:           .word irq
_fiq:           .word fiq

    .balignl 16,0xdeadbeef
#endif

/*
 *************************************************************************
 *
 * Interrupt handling
 *
 *************************************************************************
 */

/* SPL interrupt handling: just hang */

#ifdef CONFIG_SPL_BUILD

#if !CONFIG_IS_ENABLED(SYS_NO_VECTOR_TABLE)
    .align  5
undefined_instruction:
software_interrupt:
prefetch_abort:
data_abort:
not_used:
irq:
fiq:
1:
    b   1b          /* hang and never return */
#endif

#else   /* !CONFIG_SPL_BUILD */

/* IRQ stack memory (calculated at run-time) + 8 bytes */
.globl IRQ_STACK_START_IN
IRQ_STACK_START_IN:
#ifdef IRAM_BASE_ADDR
    .word   IRAM_BASE_ADDR + 0x20
#else
    .word   0x0badc0de
#endif

@
@ IRQ stack frame.
@
#define S_FRAME_SIZE    72

#define S_OLD_R0    68
#define S_PSR       64
#define S_PC        60
#define S_LR        56
#define S_SP        52

#define S_IP        48
#define S_FP        44
#define S_R10       40
#define S_R9        36
#define S_R8        32
#define S_R7        28
#define S_R6        24
#define S_R5        20
#define S_R4        16
#define S_R3        12
#define S_R2        8
#define S_R1        4
#define S_R0        0

#define MODE_SVC 0x13
#define I_BIT    0x80

/*
 * use bad_save_user_regs for abort/prefetch/undef/swi ...
 * use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
 */

    .macro  bad_save_user_regs
    @ carve out a frame on current user stack
    sub sp, sp, #S_FRAME_SIZE
    stmia   sp, {r0 - r12}  @ Save user registers (now in svc mode) r0-r12
    ldr r2, IRQ_STACK_START_IN
    @ get values for "aborted" pc and cpsr (into parm regs)
    ldmia   r2, {r2 - r3}
    add r0, sp, #S_FRAME_SIZE       @ grab pointer to old stack
    add r5, sp, #S_SP
    mov r1, lr
    stmia   r5, {r0 - r3}   @ save sp_SVC, lr_SVC, pc, cpsr
    mov r0, sp      @ save current stack into r0 (param register)
    .endm

    .macro  irq_save_user_regs
    sub sp, sp, #S_FRAME_SIZE
    stmia   sp, {r0 - r12}          @ Calling r0-r12
    @ !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.
    add r8, sp, #S_PC
    stmdb   r8, {sp, lr}^       @ Calling SP, LR
    str lr, [r8, #0]        @ Save calling PC
    mrs r6, spsr
    str r6, [r8, #4]        @ Save CPSR
    str r0, [r8, #8]        @ Save OLD_R0
    mov r0, sp
    .endm

    .macro  irq_restore_user_regs
    ldmia   sp, {r0 - lr}^          @ Calling r0 - lr
    mov r0, r0
    ldr lr, [sp, #S_PC]         @ Get PC
    add sp, sp, #S_FRAME_SIZE
    subs    pc, lr, #4      @ return & move spsr_svc into cpsr
    .endm

    .macro get_bad_stack
    ldr r13, IRQ_STACK_START_IN     @ setup our mode stack

    str lr, [r13]   @ save caller lr in position 0 of saved stack
    mrs lr, spsr    @ get the spsr
    str lr, [r13, #4]   @ save spsr in position 1 of saved stack
    mov r13, #MODE_SVC  @ prepare SVC-Mode
    @ msr   spsr_c, r13
    msr spsr, r13   @ switch modes, make sure moves will execute
    mov lr, pc      @ capture return pc
    movs    pc, lr      @ jump to next instruction & switch modes.
    .endm

    .macro get_irq_stack            @ setup IRQ stack
    ldr sp, IRQ_STACK_START
    .endm

    .macro get_fiq_stack            @ setup FIQ stack
    ldr sp, FIQ_STACK_START
    .endm

/*
 * exception handlers
 */

    .align  5
undefined_instruction:
    get_bad_stack
    bad_save_user_regs
    bl  do_undefined_instruction

    .align  5
software_interrupt:
    get_bad_stack
    bad_save_user_regs
    bl  do_software_interrupt

    .align  5
prefetch_abort:
    get_bad_stack
    bad_save_user_regs
    bl  do_prefetch_abort

    .align  5
data_abort:
    get_bad_stack
    bad_save_user_regs
    bl  do_data_abort

    .align  5
not_used:
    get_bad_stack
    bad_save_user_regs
    bl  do_not_used


    .align  5
irq:
    get_bad_stack
    bad_save_user_regs
    bl  do_irq

    .align  5
fiq:
    get_bad_stack
    bad_save_user_regs
    bl  do_fiq

#endif  /* CONFIG_SPL_BUILD */

根据网上的代码,在_start处缺少了b reset

start.S

xxx

/* SPDX-License-Identifier: GPL-2.0+ */
/*
 * armboot - Startup Code for OMAP3530/ARM Cortex CPU-core
 *
 * Copyright (c) 2004   Texas Instruments <[email]r-woodruff2@ti.com[/email]>
 *
 * Copyright (c) 2001   Marius Gröger <[email]mag@sysgo.de[/email]>
 * Copyright (c) 2002   Alex Züpke <[email]azu@sysgo.de[/email]>
 * Copyright (c) 2002   Gary Jennejohn <[email]garyj@denx.de[/email]>
 * Copyright (c) 2003   Richard Woodruff <[email]r-woodruff2@ti.com[/email]>
 * Copyright (c) 2003   Kshitij <[email]kshitij@ti.com[/email]>
 * Copyright (c) 2006-2008 Syed Mohammed Khasim <[email]x0khasim@ti.com[/email]>
 */

#include <asm-offsets.h>
#include <config.h>
#include <asm/system.h>
#include <linux/linkage.h>
#include <asm/armv7.h>
#include <system-constants.h>

/*************************************************************************
 *
 * Startup Code (reset vector)
 *
 * Do important init only if we don't start from memory!
 * Setup memory and board specific bits prior to relocation.
 * Relocate armboot to ram. Setup stack.
 *
 *************************************************************************/

    .globl  reset
    .globl  save_boot_params_ret
    .type   save_boot_params_ret,%function
#ifdef CONFIG_ARMV7_LPAE
    .global switch_to_hypervisor_ret
#endif

reset:
    /* Allow the board to save important registers */
    b   save_boot_params
save_boot_params_ret:
#ifdef CONFIG_POSITION_INDEPENDENT
    /*
     * Fix .rela.dyn relocations. This allows U-Boot to loaded to and
     * executed at a different address than it was linked at.
     */
pie_fixup:
    adr r0, reset   /* r0 <- Runtime value of reset label */
    ldr r1, =reset  /* r1 <- Linked value of reset label */
    subs    r4, r0, r1  /* r4 <- Runtime-vs-link offset */
    beq pie_fixup_done

    adr r0, pie_fixup
    ldr r1, _rel_dyn_start_ofs
    add r2, r0, r1  /* r2 <- Runtime &__rel_dyn_start */
    ldr r1, _rel_dyn_end_ofs
    add r3, r0, r1  /* r3 <- Runtime &__rel_dyn_end */

pie_fix_loop:
    ldr r0, [r2]    /* r0 <- Link location */
    ldr r1, [r2, #4]    /* r1 <- fixup */
    cmp r1, #23     /* relative fixup? */
    bne pie_skip_reloc

    /* relative fix: increase location by offset */
    add r0, r4
    ldr r1, [r0]
    add r1, r4
    str r1, [r0]
    str r0, [r2]
    add r2, #8
pie_skip_reloc:
    cmp r2, r3
    blo pie_fix_loop
pie_fixup_done:
#endif

#ifdef CONFIG_ARMV7_LPAE
/*
 * check for Hypervisor support
 */
    mrc p15, 0, r0, c0, c1, 1       @ read ID_PFR1
    and r0, r0, #CPUID_ARM_VIRT_MASK    @ mask virtualization bits
    cmp r0, #(1 << CPUID_ARM_VIRT_SHIFT)
    beq switch_to_hypervisor
switch_to_hypervisor_ret:
#endif
    /*
     * disable interrupts (FIQ and IRQ), also set the cpu to SVC32 mode,
     * except if in HYP mode already
     */
    mrs r0, cpsr
    and r1, r0, #0x1f       @ mask mode bits
    teq r1, #0x1a       @ test for HYP mode
    bicne   r0, r0, #0x1f       @ clear all mode bits
    orrne   r0, r0, #0x13       @ set SVC mode
    orr r0, r0, #0xc0       @ disable FIQ and IRQ
    msr cpsr,r0

#if !CONFIG_IS_ENABLED(SYS_NO_VECTOR_TABLE)
/*
 * Setup vector:
 */
    /* Set V=0 in CP15 SCTLR register - for VBAR to point to vector */
    mrc p15, 0, r0, c1, c0, 0   @ Read CP15 SCTLR Register
    bic r0, #CR_V       @ V = 0
    mcr p15, 0, r0, c1, c0, 0   @ Write CP15 SCTLR Register

#ifdef CONFIG_HAS_VBAR
    /* Set vector address in CP15 VBAR register */
    ldr r0, =_start
    mcr p15, 0, r0, c12, c0, 0  @Set VBAR
#endif
#endif

    /* the mask ROM code should have PLL and others stable */
#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT)
#ifdef CONFIG_CPU_V7A
    bl  cpu_init_cp15
#endif
#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT_ONLY)
    bl  cpu_init_crit
#endif
#endif

    bl  _main

/*------------------------------------------------------------------------------*/

ENTRY(c_runtime_cpu_setup)
/*
 * If I-cache is enabled invalidate it
 */
#if !CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
    mcr p15, 0, r0, c7, c5, 0   @ invalidate icache
    mcr     p15, 0, r0, c7, c10, 4  @ DSB
    mcr     p15, 0, r0, c7, c5, 4   @ ISB
#endif

    bx  lr

ENDPROC(c_runtime_cpu_setup)

/*************************************************************************
 *
 * void save_boot_params(u32 r0, u32 r1, u32 r2, u32 r3)
 *  __attribute__((weak));
 *
 * Stack pointer is not yet initialized at this moment
 * Don't save anything to stack even if compiled with -O0
 *
 *************************************************************************/
ENTRY(save_boot_params)
    b   save_boot_params_ret        @ back to my caller
ENDPROC(save_boot_params)
    .weak   save_boot_params

#ifdef CONFIG_ARMV7_LPAE
ENTRY(switch_to_hypervisor)
    b   switch_to_hypervisor_ret
ENDPROC(switch_to_hypervisor)
    .weak   switch_to_hypervisor
#endif

/*************************************************************************
 *
 * cpu_init_cp15
 *
 * Setup CP15 registers (cache, MMU, TLBs). The I-cache is turned on unless
 * CONFIG_SYS_ICACHE_OFF is defined.
 *
 *************************************************************************/
ENTRY(cpu_init_cp15)

#if CONFIG_IS_ENABLED(ARMV7_SET_CORTEX_SMPEN)
    /*
     * The Arm Cortex-A7 TRM says this bit must be enabled before
     * "any cache or TLB maintenance operations are performed".
     */
    mrc p15, 0, r0, c1, c0, 1   @ read auxilary control register
    orr r0, r0, #1 << 6     @ set SMP bit to enable coherency
    mcr p15, 0, r0, c1, c0, 1   @ write auxilary control register
#endif

    /*
     * Invalidate L1 I/D
     */
    mov r0, #0          @ set up for MCR
    mcr p15, 0, r0, c8, c7, 0   @ invalidate TLBs
    mcr p15, 0, r0, c7, c5, 0   @ invalidate icache
    mcr p15, 0, r0, c7, c5, 6   @ invalidate BP array
    mcr     p15, 0, r0, c7, c10, 4  @ DSB
    mcr     p15, 0, r0, c7, c5, 4   @ ISB

    /*
     * disable MMU stuff and caches
     */
    mrc p15, 0, r0, c1, c0, 0
    bic r0, r0, #0x00002000 @ clear bits 13 (--V-)
    bic r0, r0, #0x00000007 @ clear bits 2:0 (-CAM)
    orr r0, r0, #0x00000002 @ set bit 1 (--A-) Align
    orr r0, r0, #0x00000800 @ set bit 11 (Z---) BTB
#if CONFIG_IS_ENABLED(SYS_ICACHE_OFF)
    bic r0, r0, #0x00001000 @ clear bit 12 (I) I-cache
#else
    orr r0, r0, #0x00001000 @ set bit 12 (I) I-cache
#endif
    mcr p15, 0, r0, c1, c0, 0

#ifdef CONFIG_ARM_ERRATA_716044
    mrc p15, 0, r0, c1, c0, 0   @ read system control register
    orr r0, r0, #1 << 11    @ set bit #11
    mcr p15, 0, r0, c1, c0, 0   @ write system control register
#endif

#if (defined(CONFIG_ARM_ERRATA_742230) || defined(CONFIG_ARM_ERRATA_794072))
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 4     @ set bit #4
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

#ifdef CONFIG_ARM_ERRATA_743622
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 6     @ set bit #6
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

#ifdef CONFIG_ARM_ERRATA_751472
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 11    @ set bit #11
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif
#ifdef CONFIG_ARM_ERRATA_761320
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 21    @ set bit #21
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

#ifdef CONFIG_ARM_ERRATA_845369
    mrc     p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr     r0, r0, #1 << 22    @ set bit #22
    mcr     p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

    mov r5, lr          @ Store my Caller
    mrc p15, 0, r1, c0, c0, 0   @ r1 has Read Main ID Register (MIDR)
    mov r3, r1, lsr #20     @ get variant field
    and r3, r3, #0xf        @ r3 has CPU variant
    and r4, r1, #0xf        @ r4 has CPU revision
    mov r2, r3, lsl #4      @ shift variant field for combined value
    orr r2, r4, r2      @ r2 has combined CPU variant + revision

/* Early stack for ERRATA that needs into call C code */
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
    ldr r0, =(CONFIG_SPL_STACK)
#else
    ldr r0, =(SYS_INIT_SP_ADDR)
#endif
    bic r0, r0, #7  /* 8-byte alignment for ABI compliance */
    mov sp, r0

#ifdef CONFIG_ARM_ERRATA_798870
    cmp r2, #0x30       @ Applies to lower than R3p0
    bge skip_errata_798870      @ skip if not affected rev
    cmp r2, #0x20       @ Applies to including and above R2p0
    blt skip_errata_798870      @ skip if not affected rev

    mrc p15, 1, r0, c15, c0, 0  @ read l2 aux ctrl reg
    orr r0, r0, #1 << 7         @ Enable hazard-detect timeout
    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_l2aux_ctrl
    isb             @ Recommended ISB after l2actlr update
    pop {r1-r5}         @ Restore the cpu info - fall through
skip_errata_798870:
#endif

#ifdef CONFIG_ARM_ERRATA_801819
    cmp r2, #0x24       @ Applies to lt including R2p4
    bgt skip_errata_801819      @ skip if not affected rev
    cmp r2, #0x20       @ Applies to including and above R2p0
    blt skip_errata_801819      @ skip if not affected rev
    mrc p15, 0, r0, c0, c0, 6   @ pick up REVIDR reg
    and r0, r0, #1 << 3     @ check REVIDR[3]
    cmp r0, #1 << 3
    beq skip_errata_801819  @ skip erratum if REVIDR[3] is set

    mrc p15, 0, r0, c1, c0, 1   @ read auxilary control register
    orr r0, r0, #3 << 27    @ Disables streaming. All write-allocate
                    @ lines allocate in the L1 or L2 cache.
    orr r0, r0, #3 << 25    @ Disables streaming. All write-allocate
                    @ lines allocate in the L1 cache.
    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_acr
    pop {r1-r5}         @ Restore the cpu info - fall through
skip_errata_801819:
#endif

#ifdef CONFIG_ARM_CORTEX_A15_CVE_2017_5715
    mrc p15, 0, r0, c1, c0, 1   @ read auxilary control register
    orr r0, r0, #1 << 0     @ Enable invalidates of BTB
    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_acr
    pop {r1-r5}         @ Restore the cpu info - fall through
#endif

#ifdef CONFIG_ARM_ERRATA_454179
    mrc p15, 0, r0, c1, c0, 1   @ Read ACR

    cmp r2, #0x21       @ Only on < r2p1
    orrlt   r0, r0, #(0x3 << 6) @ Set DBSM(BIT7) and IBE(BIT6) bits

    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_acr
    pop {r1-r5}         @ Restore the cpu info - fall through
#endif

#if defined(CONFIG_ARM_ERRATA_430973) || defined (CONFIG_ARM_CORTEX_A8_CVE_2017_5715)
    mrc p15, 0, r0, c1, c0, 1   @ Read ACR

#ifdef CONFIG_ARM_CORTEX_A8_CVE_2017_5715
    orr r0, r0, #(0x1 << 6) @ Set IBE bit always to enable OS WA
#else
    cmp r2, #0x21       @ Only on < r2p1
    orrlt   r0, r0, #(0x1 << 6) @ Set IBE bit
#endif
    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_acr
    pop {r1-r5}         @ Restore the cpu info - fall through
#endif

#ifdef CONFIG_ARM_ERRATA_621766
    mrc p15, 0, r0, c1, c0, 1   @ Read ACR

    cmp r2, #0x21       @ Only on < r2p1
    orrlt   r0, r0, #(0x1 << 5) @ Set L1NEON bit

    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_acr
    pop {r1-r5}         @ Restore the cpu info - fall through
#endif

#ifdef CONFIG_ARM_ERRATA_725233
    mrc p15, 1, r0, c9, c0, 2   @ Read L2ACR

    cmp r2, #0x21       @ Only on < r2p1 (Cortex A8)
    orrlt   r0, r0, #(0x1 << 27)    @ L2 PLD data forwarding disable

    push    {r1-r5}         @ Save the cpu info registers
    bl  v7_arch_cp15_set_l2aux_ctrl
    pop {r1-r5}         @ Restore the cpu info - fall through
#endif

#ifdef CONFIG_ARM_ERRATA_852421
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 24    @ set bit #24
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

#ifdef CONFIG_ARM_ERRATA_852423
    mrc p15, 0, r0, c15, c0, 1  @ read diagnostic register
    orr r0, r0, #1 << 12    @ set bit #12
    mcr p15, 0, r0, c15, c0, 1  @ write diagnostic register
#endif

    mov pc, r5          @ back to my caller
ENDPROC(cpu_init_cp15)

#if !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT) && \
    !CONFIG_IS_ENABLED(SKIP_LOWLEVEL_INIT_ONLY)
/*************************************************************************
 *
 * CPU_init_critical registers
 *
 * setup important registers
 * setup memory timing
 *
 *************************************************************************/
ENTRY(cpu_init_crit)
    /*
     * Jump to board specific initialization...
     * The Mask ROM will have already initialized
     * basic memory. Go here to bump up clock rate and handle
     * wake up conditions.
     */
    b   lowlevel_init       @ go setup pll,mux,memory
ENDPROC(cpu_init_crit)
#endif

#if CONFIG_POSITION_INDEPENDENT
_rel_dyn_start_ofs:
    .word   __rel_dyn_start - pie_fixup
_rel_dyn_end_ofs:
    .word   __rel_dyn_end - pie_fixup
#endif

正确启动流程是什么样的,谁能够帮忙梳理下,多谢😄

收藏 评论2 发布时间:2024-7-28 22:37

举报

2个回答
wgzzz 回答时间:2024-7-29 17:42:10

可以使用GDB追踪。 GDB - stm32mpu (stmicroelectronics.cn)

qingbiuci 回答时间:2024-8-7 11:03:27

您好!

不知道下面的链接的内容能不能帮到您!

https://gitee.com/qingbicui/only_scratch_the_surface-stm32mp1-study_notes

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版