📄 boot.asm
字号:
;******************************************************************************
;* BOOT v2.17 *
;* Copyright (c) 1996-2001 Texas Instruments Incorporated *
;******************************************************************************
;****************************************************************************
;* BOOT.ASM
;*
;* THIS IS THE INITAL BOOT ROUTINE FOR TMS470 C++ PROGRAMS.
;* IT MUST BE LINKED AND LOADED WITH ALL C++ PROGRAMS.
;*
;* THIS MODULE PERFORMS THE FOLLOWING ACTIONS:
;* 1) ALLOCATES THE STACK AND INITIALIZES THE STACK POINTER
;* 2) PERFORMS AUTO-INITIALIZATION
;* 3) CALLS INITALIZATION ROUTINES FOR FILE SCOPE CONSTRUCTION
;* 4) CALLS THE FUNCTION MAIN TO START THE C++ PROGRAM
;* 5) CALLS THE STANDARD EXIT ROUTINE
;*
;* THIS MODULE DEFINES THE FOLLOWING GLOBAL SYMBOLS:
;* 1) __stack STACK MEMORY AREA
;* 2) _c_int00 BOOT ROUTINE
;*
;****************************************************************************
.state32
.global __stack
;***************************************************************
;* DEFINE THE USER MODE STACK (DEFAULT SIZE IS 512)
;***************************************************************
__stack:.usect ".stack", 0, 4
.global _CLKCInit
.global _SDRAMInit
.global _c_int00
;***************************************************************
;* FUNCTION DEF: _c_int00
;***************************************************************
_c_int00:
;*------------------------------------------------------
;* SYSTEM STACK INITIALIZE
;*------------------------------------------------------
BL _StackInit
BL _CLKCInit ; defined in armuser270.lib
BL _SDRAMInit ; defined in armuser270.lib
;*------------------------------------------------------
;* SET TO USER MODE
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x10 ; SET USER MODE
MSR cpsr, r0
;*------------------------------------------------------
;* INITIALIZE THE USER MODE STACK
;*------------------------------------------------------
LDR sp, c_stack
LDR r0, c_STACK_SIZE
ADD sp, sp, r0
;*------------------------------------------------------
;* download to IRAM
;*------------------------------------------------------
BL _download
.if .TMS470_16BIS
;****************************************************************************
;* 16 BIT STATE BOOT ROUTINE *
;****************************************************************************
;*------------------------------------------------------
;* CHANGE TO 16 BIT STATE
;*------------------------------------------------------
ADD r0, pc, #1
BX r0
.state16
;*------------------------------------------------------
;* PERFORM AUTO-INITIALIZATION. IF CINIT IS -1, THEN
;* THERE IS NONE.
;*------------------------------------------------------
LDR r0, c_cinit
MOV r7, #1
CMN r0, r7
BEQ _c1_
BL auto_init
;*------------------------------------------------------
;* CALL INITIALIZATION ROUTINES FOR CONSTRUCTORS. IF
;* PINIT IS -1, THEN THERE ARE NONE.
;* NOTE THAT r7 IS PRESERVED ACROSS AUTO-INITIALIZATION.
;*------------------------------------------------------
_c1_:
LDR r5, c_pinit
CMN r5, r7
BEQ _c3_
B _c2_
_loop_:
BL IND$CALL
_c2_:
LDMIA r5!, {r4}
CMP r4, #0
BNE _loop_
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
_c3_:
BL $main
;*------------------------------------------------------
;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
;*------------------------------------------------------
; MOV r0, #1
; BL $exit
;*------------------------------------------------------
;* DONE, LOOP FOREVER
;*------------------------------------------------------
L1:
B L1
;***************************************************************************
;* PROCESS INITIALIZATION TABLE.
;*
;* THE TABLE CONSISTS OF A SEQUENCE OF RECORDS OF THE FOLLOWING FORMAT:
;*
;* .word <length of data (bytes)>
;* .word <address of variable to initialize>
;* .word <data>
;*
;* THE INITIALIZATION TABLE IS TERMINATED WITH A ZERO LENGTH RECORD.
;*
;***************************************************************************
tbl_addr .set r0
var_addr .set r1
tmp .set r2
length: .set r3
data: .set r4
three: .set r5
auto_init:
MOV three, #3 ;
B rec_chk ;
;*------------------------------------------------------
;* PROCESS AN INITIALIZATION RECORD
;*------------------------------------------------------
record:
LDR var_addr, [tbl_addr, #4] ;
ADD tbl_addr, #8 ;
;*------------------------------------------------------
;* COPY THE INITIALIZATION DATA
;*------------------------------------------------------
MOV tmp, var_addr ; DETERMINE ALIGNMENT
AND tmp, three ; AND COPY BYTE BY BYTE
BNE _bcopy ; IF NOT WORD ALIGNED
MOV tmp, length ; FOR WORD COPY, STRIP
AND tmp, three ; OUT THE NONWORD PART
BIC length, three ; OF THE LENGTH
BEQ _wcont ;
_wcopy:
LDR data, [tbl_addr] ;
ADD tbl_addr, #4 ;
STR data, [var_addr] ; COPY A WORD OF DATA
ADD var_addr, #4 ;
SUB length, #4 ;
BNE _wcopy ;
_wcont:
MOV length, tmp ;
BEQ _cont ;
_bcopy:
LDRB data, [tbl_addr] ;
ADD tbl_addr, #1 ;
STRB data, [var_addr] ; COPY A BYTE OF DATA
ADD var_addr, #1 ;
SUB length, #1 ;
BNE _bcopy ;
_cont:
MOV tmp, tbl_addr ;
AND tmp, three ; MAKE SURE THE ADDRESS
BEQ rec_chk ; IS WORD ALIGNED
BIC tbl_addr, three ;
ADD tbl_addr, #0x4 ;
rec_chk:
LDR length, [tbl_addr] ; PROCESS NEXT
CMP length, #0 ; RECORD IF LENGTH IS
BNE record ; NONZERO
MOV pc, lr
;***************************************************************
;* CONSTANTS USED BY THIS MODULE
;***************************************************************
c_stack .long __stack
c_STACK_SIZE .long __STACK_SIZE
c_cinit .long cinit
c_pinit .long pinit
;******************************************************
;* UNDEFINED REFERENCES *
;******************************************************
.global IND$CALL
.global $exit
.global $main
.global cinit
.global pinit
.global __STACK_SIZE
.else
;****************************************************************************
;* 32 BIT STATE BOOT ROUTINE *
;****************************************************************************
;*------------------------------------------------------
;* PERFORM AUTO-INITIALIZATION. IF CINIT IS -1, THEN
;* THERE IS NONE.
;*------------------------------------------------------
LDR r0, c_cinit
CMN r0, #1
BLNE auto_init
;*------------------------------------------------------
;* CALL INITIALIZATION ROUTINES FOR CONSTRUCTORS. IF
;* PINIT IS -1, THEN THERE ARE NONE.
;*------------------------------------------------------
LDR r5, c_pinit
CMN r5, #1
BEQ _c2_
B _c1_
_loop_:
BL IND_CALL
_c1_:
LDR r4, [r5], #4
CMP r4, #0
BNE _loop_
;*------------------------------------------------------
;* CALL APPLICATION
;*------------------------------------------------------
_c2_:
BL _main
;*------------------------------------------------------
;* IF APPLICATION DIDN'T CALL EXIT, CALL EXIT(1)
;*------------------------------------------------------
MOV R0, #1
BL _exit
;*------------------------------------------------------
;* DONE, LOOP FOREVER
;*------------------------------------------------------
L1:
B L1
;***************************************************************************
;* PROCESS INITIALIZATION TABLE.
;*
;* THE TABLE CONSISTS OF A SEQUENCE OF RECORDS OF THE FOLLOWING FORMAT:
;*
;* .word <length of data (bytes)>
;* .word <address of variable to initialize>
;* .word <data>
;*
;* THE INITIALIZATION TABLE IS TERMINATED WITH A ZERO LENGTH RECORD.
;*
;***************************************************************************
tbl_addr: .set R0
var_addr: .set R1
length: .set R2
data: .set R3
auto_init:
B rec_chk
;*------------------------------------------------------
;* PROCESS AN INITIALIZATION RECORD
;*------------------------------------------------------
record:
LDR var_addr, [tbl_addr], #4 ;
;*------------------------------------------------------
;* COPY THE INITIALIZATION DATA
;*------------------------------------------------------
TST var_addr, #3 ; SEE IF DEST IS ALIGNED
BNE _bcopy ; IF NOT, COPY BYTES
SUBS length, length, #4 ; IF length <= 3, ALSO
BMI _bcont ; COPY BYTES
_wcopy:
LDR data, [tbl_addr], #4 ;
STR data, [var_addr], #4 ; COPY A WORD OF DATA
SUBS length, length, #4 ;
BPL _wcopy ;
_bcont:
ADDS length, length, #4 ;
BEQ _cont ;
_bcopy:
LDRB data, [tbl_addr], #1 ;
STRB data, [var_addr], #1 ; COPY A BYTE OF DATA
SUBS length, length, #1 ;
BNE _bcopy ;
_cont:
ANDS length, tbl_addr, #0x3 ; MAKE SURE THE ADDRESS
RSBNE length, length, #0x4 ; IS WORD ALIGNED
ADDNE tbl_addr, tbl_addr, length ;
rec_chk:
LDR length, [tbl_addr], #4 ; PROCESS NEXT
CMP length, #0 ; RECORD IF LENGTH IS
BNE record ; NONZERO
MOV PC, LR
;***************************************************************
;* CONSTANTS USED BY THIS MODULE
;***************************************************************
c_stack .long __stack
c_STACK_SIZE .long __STACK_SIZE
c_cinit .long cinit
c_pinit .long pinit
;******************************************************
;* UNDEFINED REFERENCES *
;******************************************************
.global IND_CALL
.global _exit
.global _main
.global cinit
.global pinit
.global __STACK_SIZE
.endif
;*------------------------------------------------------
;* SYSTEM STACK INITIALIZE (see .CMD file)
;*------------------------------------------------------
.global __IRQ_STACK
.global __FIQ_STACK
.global __UNDEF_STACK
.global __SWI_STACK
.state32
_StackInit:
;*------------------------------------------------------
;* INITIALIZE THE UNDEF MODE STACK
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x1B ; SET UNDEF mode
MSR cpsr, r0
LDR r0, c_UNDEF_STACK
MOV sp, r0
;*------------------------------------------------------
;* INITIALIZE THE FIQ MODE STACK
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x11 ; SET FIQ mode
MSR cpsr, r0
LDR r0, c_FIQ_STACK
MOV sp, r0
;*------------------------------------------------------
;* INITIALIZE THE IRQ MODE STACK
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x12 ; SET IRQ mode
MSR cpsr, r0
LDR r0, c_IRQ_STACK
MOV sp, r0
;*------------------------------------------------------
;* INITIALIZE THE SWI MODE STACK
;*------------------------------------------------------
MRS r0, cpsr
BIC r0, r0, #0x1F ; CLEAR MODES
ORR r0, r0, #0x13 ; SET SWI (SUPERVISOR) mode
MSR cpsr, r0
LDR r0, c_SWI_STACK
MOV sp, r0
MOV pc, lr
c_IRQ_STACK .long __IRQ_STACK
c_FIQ_STACK .long __FIQ_STACK
c_UNDEF_STACK .long __UNDEF_STACK
c_SWI_STACK .long __SWI_STACK
;******************************************************
;* DSC related reference *
;******************************************************
.global _SetPLL
.global _EnablePLL
.global _CLOCKCInit
.global _EMIFInit
.global _dlstadd
.global _dlsize
.global _CacheInit
;*------------------------------------------------------
;* download to IRAM
;*------------------------------------------------------
_download:
LDR r0, dlstadd ; source address
LDR r2, dlsize ; number of bytes
CMP r2, #0 ; compare download size
BEQ loadcomp ; branch if no download
MOV r1, #4 ; dest. add (skip reset vector)
loop: ; do {
LDR r3, [r0], #4 ; R3= *R0++
STR r3, [r1], #4 ; *R1++= R3
SUBS r2, r2, #4 ; R2 -= 4
BNE loop ; } while (R2 > 0);
loadcomp:
MOV pc, lr
;******************************************************
;* For IRAM download *
;******************************************************
dlstadd .long _dlstadd
dlsize .long _dlsize
.end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -