uboot 模拟 pc BIOS的 跑码诊断

/*
 *  armboot - Startup Code for ARM920 CPU-core
 *
 *  Copyright (c) 2001    Marius Gr鰃er <mag@sysgo.de>
 *  Copyright (c) 2002    Alex Z黳ke <azu@sysgo.de>
 *  Copyright (c) 2002    Gary Jennejohn <garyj@denx.de>
 *
 * See file CREDITS for list of people who contributed to this
 * project.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <common.h>
#include <config.h>

/*
 *************************************************************************
 *
 * Jump vector table as in table 3.1 in [1]
 *
 *************************************************************************
 */


.globl _start
_start:    b    start_code
    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

_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


/*
 *************************************************************************
 *
 * Startup Code (called from the ARM reset exception vector)
 *
 * do important init only if we don''t start from memory!
 * relocate armboot to ram
 * setup stack
 * jump to second stage
 *
 *************************************************************************
 */

_TEXT_BASE:
    .word    TEXT_BASE

.globl _armboot_start
_armboot_start:
    .word _start

/*
 * These are defined in the board-specific linker script.
 */
.globl _bss_start
_bss_start:
    .word __bss_start

.globl _bss_end
_bss_end:
    .word _end

#ifdef CONFIG_USE_IRQ
/* IRQ stack memory (calculated at run-time) */
.globl IRQ_STACK_START
IRQ_STACK_START:
    .word    0x0badc0de

/* IRQ stack memory (calculated at run-time) */
.globl FIQ_STACK_START
FIQ_STACK_START:
    .word 0x0badc0de
#endif

;//    R0  a1   工作寄存器
;//    R1  a2  
;//    R2  a3
;//    R3  a4        
;//    R4  v1   必须保护
;//    R5  v2  
;//    R6  v3 
;//    R7  v4 
;//    R8  v5   
;//    R9  v6
;//    R10 sl  栈限制
;//    R11 fp  桢指针
;//    R12 ip  内部过程调用寄存器
;//    R13 sp  栈指针
;//    R14 lr  连接寄存器
;//    R15 pc  程序计数器


#define rULCON0 0x50000000

uart0_out_char:    
    STMFD    SP!, {r0-r12, lr}  
    //;mov r1, #0x39 
wait_send:       
    ldr r0, =rULCON0    
    ldrb  r3, [r0, #0x10]    
    tst   r3, #0x02    
    beq  wait_send    
    strb  r1, [r0, #0x20]    
    LDMFD     SP!, {R0-R12, LR} 
    MOV     PC, LR
    ;pop  {r0, r1, r2, r3, r4, r5, r6, r7, r9, sl, fp, ip, pc}


;//打印一个字符串
printascii:    
    STMFD    SP!, {r0-r12, lr}      ;//保存现场 
    b    F2    ;//向后跳到第一个标号为2的地方
B1:                     
    bl uart0_out_char    ;//串口0输出一个字符   
    teq   r1,   #'\n'    ;//判断当前已输出字符是否为换行符      
    moveq r1,   #'\r'    ;//如果是换行符的话,再自动追加回车符      
    beq B1    ;//如果是换行符的话,继续打印    
    ;//否则,处理下一个字符-->
F2:     
    teq      r0, #0    ;//测试字符串指针是否为空    
    ldrneb  r1, [r0], #1    ;//字符串指针不为空时加载一个字符,并且字符串指针后移一个字符位置    
    ;//字符串指针为空时不执行此条命令   
    teqne r1, #0    ;//字符串指针不为空时测试加载的字符是否为串结束字符    
   ; //字符串指针为空时不执行此条命令    
    bne B1     ;//不是串结束字符,继续打印下一字符 
    ;//是结束字符,执行下一条指令    
    ;//字符串指针为空时执行下一条指令    
    LDMFD     SP!, {R0-R12, PC} 
    ;//恢复现场,并返回                                

printch:     ;//打印一个字符  
    STMFD    SP!, {r0-r12, lr}   
    mov   r1, r0    ;//欲打印之字符  
    mov   r0, #0    ;//进入就打印一个字符,然后判断是否继续打印     
    b     B1                                                             


//test_stringtest_string      
  //  DCB "\n", "\0"
    nop

;/* * Useful debugging routines */
printhex8:
    STMFD    SP!, {r0-r12, lr} 
    mov  r1, #8  
    b printhex

printhex4:
    STMFD    SP!, {r0-r12, lr}
    mov  r1, #4
    b  printhex


printhex2:
    STMFD    SP!, {r0-r12, lr}
    mov  r1, #2
printhex: 
   //; adr   r2, hexbuf
    ldr r2, =ASMDATA
    add  r3, r2, r1
    mov  r1, #0
    strb  r1, [r3]
BB1:  
    and   r1, r0, #15
    mov  r0, r0, lsr #4
    cmp  r1, #10
    addlt  r1, r1, #'0'
    addge  r1, r1, #'A' - 10
    strb  r1, [r3, #-1]!
    teq  r3, r2
    bne  BB1
    mov  r0, r2
    bl  printascii
    LDMFD     SP!, {R0-R12, PC} 
    
//;hexbuf:  .space 16.ltorg

/*
 * the actual start code
 */

start_code:
    /*
     * set the cpu to SVC32 mode
     */
    mrs    r0, cpsr
    bic    r0, r0, #0x1f
    orr    r0, r0, #0xd3
    msr    cpsr, r0

@    bl    coloured_LED_init
@    bl    red_LED_on

#if    defined(CONFIG_AT91RM9200DK) || defined(CONFIG_AT91RM9200EK)
    /*
     * relocate exception table
     */
    ldr    r0, =_start
    ldr    r1, =0x0
    mov    r2, #16
copyex:
    subs    r2cc, r2, #1
    ldr    r3, [r0], #4
    str    r3, [r1], #4
    bne    copyex
#endif

#ifdef CONFIG_S3C24X0
    /* turn off the watchdog */

# if defined(CONFIG_S3C2400)
#  define pWTCON    0x15300000
#  define INTMSK    0x14400008    /* Interupt-Controller base addresses */
#  define CLKDIVN    0x14800014    /* clock divisor register */
#else
#  define pWTCON    0x53000000
#  define INTMSK    0x4A000008    /* Interupt-Controller base addresses */
#  define INTSUBMSK    0x4A00001C
#  define CLKDIVN    0x4C000014    /* clock divisor register */
# endif
#define CLK_CTL_BASE    0x4C000000    /* tekkaman */
#define MDIV_405    0x7f << 12    /* tekkaman */
#define PSDIV_405    0x21        /* tekkaman */
#define MDIV_200    0xa1 << 12    /* tekkaman */
#define PSDIV_200    0x31        /* tekkaman */
#  define GPBCON 0x56000010
#  define GPBDAT 0x56000014
    ldr    r0,=GPBCON
    ldr    r1,=0x00555555
    str    r1,[r0]
    ldr    r0,=GPBDAT
    ldr    r1,=0x07fe
    str    r1,[r0]
    
    //ldr    r1,=0x071e //;LED4 off
    //str    r1,[r0]    
    
    //ldr    r1,=0x069e //;LED3 off
    //str    r1,[r0]
    
    //ldr    r1,=0x065e //;LED2 off
    //str    r1,[r0]
    
    //ldr    r1,=0x063e //;LED1 off
    //str    r1,[r0]
    
    
    


    ldr    r0, =pWTCON
    mov    r1, #0x0
    str    r1, [r0]
    
      
    
    
   //; b .
    /*
     * mask all IRQs by setting all bits in the INTMR - default
     */
    mov    r1, #0xffffffff
    ldr    r0, =INTMSK
    str    r1, [r0]
# if defined(CONFIG_S3C2410)
    ldr    r1, =0x7ff
    ldr    r0, =INTSUBMSK
    str    r1, [r0]xxx
# endif

#if defined(CONFIG_S3C2440)
    ldr    r1, =0x7fff    
    ldr    r0, =INTSUBMSK
    str    r1, [r0]
#endif


#if defined(CONFIG_S3C2440)
    /* FCLK:HCLK:PCLK = 1:4:8 */
    ldr    r0, =CLKDIVN
    mov    r1, #5
    str    r1, [r0]
    
    mrc    p15, 0, r1, c1, c0, 0    
    orr    r1, r1, #0xc0000000        
    mcr    p15, 0, r1, c1, c0, 0    
    
    
    mov    r1, #CLK_CTL_BASE    
    mov    r2, #MDIV_405    
    add    r2, r2, #PSDIV_405    
    str    r2, [r1, #0x04]        /* MPLLCON tekkaman */

#else
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]

    
    mrc    p15, 0, r1, c1, c0, 0    
    orr    r1, r1, #0xc0000000    
    mcr    p15, 0, r1, c1, c0, 0    /*write ctrl register tekkaman*/
    
    
    mov    r1, #CLK_CTL_BASE    /* tekkaman*/
    mov    r2, #MDIV_200    
    add    r2, r2, #PSDIV_200    
    str    r2, [r1, #0x04]
#endif
#endif    /* CONFIG_S3C24X0 */

   // ldr    r0,=GPBCON
    //ldr    r1,=0x00555555
    //str    r1,[r0]
    
    ldr    r0,=GPBDAT
    ldr    r1,=0x063e //;LED4 off
    str    r1,[r0]  
//    b .

    /*
     * we do sys-critical inits only at reboot,
     * not when booting from ram!
     */
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
    bl    cpu_init_crit
#endif

/***************** CHECK_CODE_POSITION ******************************************/
    adr    r0, _start        /* r0 <- current position of code   */

    mov r0, #0x50
    bl printhex8
    mov   r0,    #'\n'
    bl printch
        
    adr    r0, _start
    bl printhex8
    mov   r0,    #'\n'
    bl printch
    ldr r1, _TEXT_BASE
    mov r0, r1
    bl printhex8
    mov   r0,    #'\n'
    bl printch


    adr    r0, _start
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    cmp    r0, r1                /* do not reloc during debug         */
    beq    stack_setup
/***************** CHECK_CODE_POSITION ******************************************/

/***************** CHECK_BOOT_FLASH ******************************************/
    ldr    r1, =( (4<<28)|(3<<4)|(3<<2) )        /* address of Internal SRAM  0x4000003C*/
    mov    r0, #0        /* r0 = 0 */
    str    r0, [r1]

    mov r0, #0x51
    bl printhex8
    mov   r0,    #'\n'
    bl printch
    
    mov    r1, #0x3c        /* address of men  0x0000003C*/
    ldr    r0, [r1]
    bl printhex8
    mov   r0,    #'\n'
    bl printch

    ldr    r0, [r1]
    cmp    r0, #0
    bne    relocate

    /* recovery  */
    ldr    r0, =(0xdeadbeef)
    ldr    r1, =( (4<<28)|(3<<4)|(3<<2) )
    str    r0, [r1]
/***************** CHECK_BOOT_FLASH ******************************************/

/***************** NAND_BOOT *************************************************/

#define LENGTH_UBOOT 0x60000
#define NAND_CTL_BASE 0x4E000000

#ifdef CONFIG_S3C2440
/* Offset */
#define oNFCONF 0x00
#define oNFCONT 0x04
#define oNFCMD 0x08
#define oNFSTAT 0x20

    @ reset NAND
    mov    r1, #NAND_CTL_BASE
    ldr    r2, =( (7<<12)|(7<<8)|(7<<4)|(0<<0) )
    str    r2, [r1, #oNFCONF]
    ldr    r2, [r1, #oNFCONF]
    
    ldr    r2, =( (1<<4)|(0<<1)|(1<<0) )    @ Active low CE Control 
    str    r2, [r1, #oNFCONT]
    ldr    r2, [r1, #oNFCONT]
    
    ldr    r2, =(0x6)    @ RnB Clear
    str    r2, [r1, #oNFSTAT]
    ldr    r2, [r1, #oNFSTAT]
    
    mov    r2, #0xff    @ RESET command
    strb    r2, [r1, #oNFCMD]
    
    mov    r3, #0    @ wait
nand1: 
    add    r3, r3, #0x1
    cmp    r3, #0xa
    blt    nand1

nand2:
    ldr    r2, [r1, #oNFSTAT]    @ wait ready
    tst    r2, #0x4
    beq    nand2
    
    
    ldr    r2, [r1, #oNFCONT]
    orr    r2, r2, #0x2    @ Flash Memory Chip Disable
    str    r2, [r1, #oNFCONT]
    
    @ get read to call C functions (for nand_read())
    ldr    sp, DW_STACK_START    @ setup stack pointer
    mov    fp, #0    @ no previous frame, so fp=0

    @ copy U-Boot to RAM
    ldr    r0, =TEXT_BASE
    mov    r1, #0x0
    mov    r2, #LENGTH_UBOOT
    bl    nand_read_ll
    tst    r0, #0x0
    beq    ok_nand_read

bad_nand_read:
loop2:
    b    loop2    @ infinite loop
ok_nand_read:
    @ verify
    mov    r0, #0
    ldr    r1, =TEXT_BASE
    mov    r2, #0x400    @ 4 bytes * 1024 = 4K-bytes
go_next:
    ldr    r3, [r0], #4
    ldr    r4, [r1], #4
    teq    r3, r4
    bne    notmatch
    subs    r2, r2, #4
    beq    stack_setup
    bne    go_next

notmatch:
loop3:
    b    loop3    @ infinite loop
#endif

#ifdef    CONFIG_S3C2410

/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFSTAT 0x10

    @ reset NAND
    mov    r1, #NAND_CTL_BASE
    ldr    r2, =0xf830    @ initial value
    str    r2, [r1, #oNFCONF]
    ldr    r2, [r1, #oNFCONF]
    bic    r2, r2, #0x800    @ enable chip
    str    r2, [r1, #oNFCONF]
    mov    r2, #0xff        @ RESET command
    strb    r2, [r1, #oNFCMD]
    
    
    mov    r3, #0    @ wait
nand1:
    add    r3, r3, #0x1
    cmp    r3, #0xa
    blt    nand1

nand2:
    ldr    r2, [r1, #oNFSTAT]    @ wait ready
    tst    r2, #0x1
    beq    nand2
    
    ldr    r2, [r1, #oNFCONF]
    orr    r2, r2, #0x800    @ disable chip
    str    r2, [r1, #oNFCONF]
    
    @ get read to call C functions (for nand_read())
    ldr    sp, DW_STACK_START    @ setup stack pointer
    mov    fp, #0    @ no previous frame, so fp=0
    
    @ copy U-Boot to RAM
    ldr    r0, =TEXT_BASE
    mov    r1, #0x0
    mov    r2, #LENGTH_UBOOT
    bl    nand_read_ll
    tst    r0, #0x0
    beq    ok_nand_read

bad_nand_read:
loop2:
    b    loop2    @ infinite loop


ok_nand_read:
    @ verify
    mov    r0, #0
    ldr    r1, =TEXT_BASE
    mov    r2, #0x400    @ 4 bytes * 1024 = 4K-bytes
go_next:
    ldr    r3, [r0], #4
    ldr    r4, [r1], #4
    teq    r3, r4
    bne    notmatch
    subs    r2, r2, #4
    beq    stack_setup
    bne    go_next

notmatch:
loop3:
    b    loop3    @ infinite loop

#endif
/***************** NAND_BOOT *************************************************/

/***************** NOR_BOOT *************************************************/
relocate:                /* relocate U-Boot to RAM        */
      /*********** CHECK_FOR_MAGIC_NUMBER***************/
    ldr    r1, =(0xdeadbeef)
    cmp    r0, r1
    bne    loop3

    mov r0, #0x52
    bl printhex8
    mov   r0,    #'\n'
    bl printch
    
      /*********** CHECK_FOR_MAGIC_NUMBER***************/
    adr    r0, _start        /* r0 <- current position of code   */
    ldr    r1, _TEXT_BASE        /* test if we run from flash or RAM */
    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        /* r2 <- size of armboot            */
    add    r2, r0, r2        /* r2 <- source end address         */

copy_loop:
    ldmia    r0!, {r3-r10}        /* copy from source address [r0]    */
    stmia    r1!, {r3-r10}        /* copy to   target address [r1]    */
    cmp    r0, r2                    /* until source end address [r2]    */
    ble    copy_loop

    
/***************** NOR_BOOT *************************************************/

    /* Set up the stack                            */
stack_setup:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
    sub    r0, r0, #CONFIG_SYS_MALLOC_LEN    /* malloc area              */
    sub    r0, r0, #CONFIG_SYS_GBL_DATA_SIZE /* bdinfo                 */
#ifdef CONFIG_USE_IRQ
    sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
    sub    sp, r0, #12        /* leave 3 words for abort-stack    */

    mov r0, #0x53
    bl printhex8
    mov   r0,    #'\n'
    bl printch


clear_bss:
    ldr    r0, _bss_start        /* find start of bss segment        */
    ldr    r1, _bss_end        /* stop here                        */
    mov    r2, #0x00000000        /* clear                            */

clbss_l:
    str    r2, [r0]        /* clear loop...                    */
    add    r0, r0, #4
    cmp    r0, r1
    ble    clbss_l

    mov r0, #0x54
    bl printhex8
    mov   r0,    #0x3A
    bl printch
    mov   r0,    #0x20
    bl printch
    ldr    r0, _start_armboot
    bl printhex8
    mov   r0,    #'\n'
    bl printch

    mov r0, #0x55
    bl printhex8
    mov   r0,    #'\n'
    bl printch
    bl printch
    

    mov   r0,    #'\n'
    bl printch
    bl printch
    bl printch
    bl printch
    
    
    
    
    //b .

    
    ldr    r1, _start_armboot
    movs r15, r1 
    ldr    pc, _start_armboot

#if defined(CONFIG_MINI2440_LED)
#define GPIO_CTL_BASE 0x56000000
#define oGPIO_B 0x10
#define oGPIO_CON 0x0
/* R/W, Configures the pins of the port */
#define oGPIO_DAT 0x4
#define oGPIO_UP 0x8
/* R/W, Pull-up disable register */
    mov    r1, #GPIO_CTL_BASE
    add    r1, r1, #oGPIO_B
    ldr    r2, =0x295551
    str    r2, [r1, #oGPIO_CON]
    mov    r2, #0xff
    str    r2, [r1, #oGPIO_UP]
    ldr    r2, =0x1c1
    str    r2, [r1, #oGPIO_DAT]
#endif

_start_armboot:    .word start_armboot
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x10000
    .align    2
DW_STACK_START:    .word    STACK_BASE+STACK_SIZE-4 

/*
 *************************************************************************
 *
 * CPU_init_critical registers
 *
 * setup important registers
 * setup memory timing
 *
 *************************************************************************
 */


#ifndef CONFIG_SKIP_LOWLEVEL_INIT
cpu_init_crit:
    /*
     * flush v4 I/D caches
     */
    mov    r0, #0
    mcr    p15, 0, r0, c7, c7, 0    /* flush v3/v4 cache */
    mcr    p15, 0, r0, c8, c7, 0    /* flush v4 TLB */

    /*
     * disable MMU stuff and caches
     */
    mrc    p15, 0, r0, c1, c0, 0
    bic    r0, r0, #0x00002300    @ clear bits 13, 9:8 (--V- --RS)
    bic    r0, r0, #0x00000087    @ clear bits 7, 2:0 (B--- -CAM)
    orr    r0, r0, #0x00000002    @ set bit 2 (A) Align
    orr    r0, r0, #0x00001000    @ set bit 12 (I) I-Cache
    mcr    p15, 0, r0, c1, c0, 0

    /*
     * before relocating, we have to setup RAM timing
     * because memory timing is board-dependend, you will
     * find a lowlevel_init.S in your board directory.
     */
    mov    ip, lr

    bl    lowlevel_init

    mov    lr, ip
    mov    pc, lr
#endif /* CONFIG_SKIP_LOWLEVEL_INIT */

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

@
@ 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
    sub    sp, sp, #S_FRAME_SIZE
    stmia    sp, {r0 - r12}            @ Calling r0-r12
    ldr    r2, _armboot_start
    sub    r2, r2, #(CONFIG_STACKSIZE)
    sub    r2, r2, #(CONFIG_SYS_MALLOC_LEN)
    /* set base 2 words into abort stack */
    sub    r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8)
    ldmia    r2, {r2 - r3}            @ get pc, cpsr
    add    r0, sp, #S_FRAME_SIZE        @ restore sp_SVC

    add    r5, sp, #S_SP
    mov    r1, lr
    stmia    r5, {r0 - r3}            @ save sp_SVC, lr_SVC, pc, cpsr
    mov    r0, sp
    .endm

    .macro    irq_save_user_regs
    sub    sp, sp, #S_FRAME_SIZE
    stmia    sp, {r0 - r12}            @ Calling r0-r12
    add    r7, sp, #S_PC
    stmdb    r7, {sp, lr}^            @ Calling SP, LR
    str    lr, [r7, #0]            @ Save calling PC
    mrs    r6, spsr
    str    r6, [r7, #4]            @ Save CPSR
    str    r0, [r7, #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
    /* return & move spsr_svc into cpsr */
    subs    pc, lr, #4
    .endm

    .macro get_bad_stack
    ldr    r13, _armboot_start        @ setup our mode stack
    sub    r13, r13, #(CONFIG_STACKSIZE)
    sub    r13, r13, #(CONFIG_SYS_MALLOC_LEN)
    /* reserve a couple spots in abort stack */
    sub    r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE+8)

    str    lr, [r13]            @ save caller lr / spsr
    mrs    lr, spsr
    str    lr, [r13, #4]

    mov    r13, #MODE_SVC            @ prepare SVC-Mode
    @ msr    spsr_c, r13
    msr    spsr, r13
    mov    lr, pc
    movs    pc, lr
    .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

#ifdef CONFIG_USE_IRQ

    .align    5
irq:
//Apollo +
/*
    get_irq_stack
    irq_save_user_regs
    bl    do_irq
    irq_restore_user_regs
*/
    /* use IRQ for USB and DMA */
        sub    lr, lr, #4             @ the return address
        ldr    sp, IRQ_STACK_START     @ the stack for irq
       stmdb   sp!,  { r0-r12,lr }     @ save registers
        
        ldr    lr, =int_return         @ set the return addr
        ldr    pc, =IRQ_Handle         @ call the isr
int_return:
        ldmia  sp!, { r0-r12,pc }^    @ return from interrupt
//Apollo -

    .align    5
fiq:
    get_fiq_stack
    /* someone ought to write a more effiction fiq_save_user_regs */
    irq_save_user_regs
    bl    do_fiq
    irq_restore_user_regs

#else

    .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

//https://blog.csdn.net/zhoujiaxq/article/details/24345353

.ltorg 
.align 4
/* the literal pools origin */

ASMDATA:
    .word 0x11
    .word 0x22
    .word 0x33
    .word 0x44
    .word 0x55
    .word 0x66
    .word 0x77
    .word 0x88
    .word 0x99
    .word 0xaa
    .word 0xbb
    .word 0xcc
    .word 0xdd
    .word 0xee
    .word 0xff
    .word 0x00
    .space 256, 0x55

    //.space <number_of_bytes> {,<fill_byte>}
    

    运行日志:

[u-boot@MINI2440]# usbslave 
USB host is connected. Waiting a download.
get downloadFileSize = 258206 !!

Now, Downloading [ADDRESS:30000000h,TOTAL:258206]
RECEIVED FILE SIZE:  258206 (252KB/S, 1S)
[u-boot@MINI2440]# go 0x30000000 
## Starting application at 0x30000000 ...
00000050
30000000
32F80000
00000051
DEADBEEF
00000052
00000053
00000054: 32F80CDC
00000055


U-Boot 2010.03 (Feb 03 2024 - 02:29:50)

 modified by tekkamanninja (1tekkamanninja@163.com)
 Love Linux forever!!

U-Boot code: 32F80000 -> 32FBF094  BSS: -> 33001F4C
IRQ Stack: 32f3ff7c
FIQ Stack: 32f3ef7c
I2Cx:   readyxxx
DRAM:  64 MB
Flash:  2 MB
NAND:  256 MiB
Video: 240x320x16 20kHz 62Hz
In:    serial
Out:   serial
Err:   serial
USB slave is enable!
Net:   dm9000
U-Boot 2010.03 (Feb 03 2024 - 02:29:50)
modified by tekkamanninja
(cctekkamanninja@163.com)
Love Linux forever!!
Hit any key to stop autoboot:  0 
[u-boot@MINI2440]# 
[u-boot@MINI2440]# 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

禁止 ios H5 中 bounces 滑动回弹效果

在开发面向 iOS 设备的 HTML5 应用时&#xff0c;控制页面的滚动行为至关重要&#xff0c;特别是禁用在 Safari 中默认的滑动回弹效果。本文旨在提供一个简洁明了的解决方案&#xff0c;帮助开发者在特定的 Web 应用中禁用这一效果。 1. 什么是滑动回弹效果&#xff1f; 在 iO…

C++输出地址

下面是一段输出地址的程序。 #include <bits/stdc.h> using namespace std;int main() {int s;cout << &s;//原地址return 0; }假如有一个人&#xff08;的朋友&#xff09;后来了&#xff0c;他也想住进的房间&#xff0c;我们可以这样&#xff1a; #includ…

从ORA-00283 ORA-16433报错开始恢复---惜分飞

接手一个客户无法正常启动的故障数据库&#xff0c;尝试recover 报ORA-00283 ORA-16433错误 [oraclexff trace]$ sqlplus / as sysdba SQL*Plus: Release 12.1.0.2.0 Production on Sat Jan 27 04:46:23 2024 Copyright (c) 1982, 2014, Oracle. All rights reserved. ??…

docker 运行jar包

要在Docker中运行JAR包&#xff0c;你可以使用以下步骤&#xff1a; 创建一个Dockerfile&#xff0c;指定基础镜像和设置工作目录。例如&#xff1a; # 使用官方Java镜像作为基础镜像 FROM openjdk:8-jdk-alpine# 设置工作目录 WORKDIR /app 将JAR包复制到容器中的/app目录。…

【数据结构】链表OJ面试题2(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 休息一天&#xff0c;今天继续刷题&#xff01; 2.OJ题目训练 1. 编写代码&#xff0c;以给定值x为基准将链表分割成两部分&#xff0c;所有小于x的结点排在大于或等于x的结点之前 。链表分割_牛客题霸_牛客网 思路 既然涉及…

gif动图的裁剪实现思路

项目需求(对app的轮播,以及banner和咨询的图片进行裁剪):前期实现使用用vue-cropper插件对图片进行插件,----后续需求需要裁剪gif动图(vue-cropper、微信自带的截图工具,以及fastStone截图工具,都只能截取静态图片,打开动图时只显示某一帧的静态图片),所以需要研究为什么vue-cr…

JAVASE进阶:函数式编程——lambda表达式替代匿名内部类

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;JAVASE进阶&#xff1a;强推&#xff01;源码分析——字符串拼接底层原理、StringBuilder底层原理 &#x1f4da;订阅专栏&#…

机器学习——集成学习

&#x1f4d5;参考&#xff1a;ysu老师课件西瓜书 期末复习笔记 1.集成学习的基本概念 集成学习&#xff08;ensemble learing&#xff09;通过构建并结合多个学习器来完成学习任务。 有时也被称为多分类器系统&#xff08;multi-classifier system&#xff09;、基于委员会的…

Spring Cloud Stream解密:流式数据在微服务中的魔力

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 Spring Cloud Stream解密&#xff1a;流式数据在微服务中的魔力 前言Spring Cloud Stream基础&#xff1a;微服务中的数据流动Binder概念与使用&#xff1a;连接流的音符消息序列化与反序列化&#xf…

开源社区的力量:共同构建数字时代的未来(AI)

开源社区的力量&#xff1a;共同构建数字时代的未来 引言开源社区的定义与发展历程 1. 开源社区的定义2. 发展历程 开源社区的核心价值 1. 技术共享与创新2. 协作与社区建设3. 自由开放的精神 开源社区对数字时代的贡献 1. 技术创新的推动者2. 开放式标准的制定者3. 教育和培训…

【消息队列】kafka整理

kafka整理 整理kafka基本知识供回顾。

Leetcode刷题笔记题解(C++):99. 恢复二叉搜索树

思路&#xff1a; 二叉搜索树的中序遍历是递增序列&#xff0c;可以在中序遍历中记录两个需要交换的节点&#xff0c;直到遍历完毕之后&#xff0c;对两个节点的值进行交换即可得到正确的二叉搜索树 比如中序序列为 1 2 3 7 5 6 4&#xff08;7比5大记录7为x&#xf…

每日OJ题_算法_模拟③_力扣6. Z 字形变换

目录 力扣6. Z 字形变换 解析代码 力扣6. Z 字形变换 6. Z 字形变换 难度 中等 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 "PAYPALISHIRING" 行数为 3 时&#xff0c;排列如下&#xff…

以太网帧格式及ARP协议简介

在以太网中&#xff0c;一个主机和另一个主机进行通信&#xff0c;必须要知道目的主机的MAC地址&#xff08;物理地址&#xff09;&#xff0c;只要知道目的主机的IP地址&#xff0c;就可以通过ARP协议获取目的主机的MAC地址。 1、ARP协议简介 ARP&#xff08;Address Resolut…

处理安装uni-ui依赖一直安装不上

根据官方的文档去安装&#xff0c;我这边把npm换成了pnpm。 搞了一个小时没搞明白为什么下载不下来依赖&#xff0c;原因是镜像的问题。 处理方式&#xff1a;安装了cnpm&#xff0c;去访问国内镜像 安装cnpm&#xff0c;使用国内镜像 npm install -g cnpm --registryhttps…

react 之 useCallback

简单讲述下useCallback的使用方法&#xff0c;useCallback也是用来缓存的&#xff0c;只不过是用于做函数缓存 // useCallbackimport { memo, useCallback, useState } from "react"const Input memo(function Input ({ onChange }) {console.log(子组件重新渲染了…

Ubuntu上开启FTP服务教程

在Ubuntu服务器上配置FTP服务是一个常见的需求&#xff0c;无论是用于文件分享、网站管理还是数据备份。FTP&#xff08;文件传输协议&#xff09;是一种用于在网络上传输文件的协议&#xff0c;它可以让用户通过身份验证下载或上传文件。本文将指导您如何在Ubuntu系统上安装和…

【第二十二课】最短路:多源最短路floyd算法(acwing-852 spfa判断是否存在负环 / acwing-854 / c++代码)

目录 acwing-852 代码如下 一些解释 acwing-854 foyld算法思想 代码如下 一些解释 acwing-852 在spfa求最短路的算法基础上进行修改。 代码如下 #include<iostream> #include<cstring> #include<algorithm> #include<queue> using names…

百分点科技:《数据科学技术: 文本分析和知识图谱》

科技进步带来的便利已经渗透到工作生活的方方面面&#xff0c;ChatGPT的出现更是掀起了新一波的智能化浪潮&#xff0c;推动更多智能应用的涌现。这背后离不开一个朴素的逻辑&#xff0c;即对数据的收集、治理、建模、分析和应用&#xff0c;这便是数据科学所重点研究的对象——…

Python itertools模块:生成迭代器(实例分析)

itertools 模块中主要包含了一些用于生成迭代器的函数。在 Python 的交互式解释器中先导入 itertools 模块&#xff0c;然后输入 [e for e in dir(itertools) if not e.startswith(_)] 命令&#xff0c;即可看到该模块所包含的全部属性和函数&#xff1a; >>> [e for …