📄 cstartup_flash.s
字号:
#------------------------------------------------------------------------------
#- ATMEL Microcontroller Software Support - ROUSSET -
#------------------------------------------------------------------------------
# The software is delivered "AS IS" without warranty or condition of any
# kind, either express, implied or statutory. This includes without
# limitation any warranty or condition with respect to merchantability or
# fitness for any particular purpose, or against the infringements of
# intellectual property rights of others.
#-----------------------------------------------------------------------------
#- File source : cstartup_flash.s
#- Object : Boot for Final Application version to be programmed
#- : in flash or ROMed.
#- Compilation flag : None
#-
#- 1.0 06/04/00 JPP : Creation
#- 1.1 18/08/00 JCZ : Over-comment and optimize
#- 1.2 25/10/00 JPP : Global for including
#------------------------------------------------------------------------------
#------------------------------------------------------------------------------
#- Area Definition
#-----------------
#- Must be defined as function to put first in the code as it must be mapped
#- at offset 0 of the flash EBI_CSR0, ie. at address 0 before remap.
#------------------------------------------------------------------------------
# AREA reset, CODE, READONLY, INTERWORK
#------------------------------------------------------------------------------
#- Remove any semihosting support
#--------------------------------
#- The C runtime library is the IO functions provided by the semihosting.
#- They are generally costly in code and unused as the debugger is not
#- connected to the target.
#- Must be removed if using the embedded C library is used.
#------------------------------------------------------------------------------
#- Define "__main" to ensure that C runtime system is not linked
.global __main
__main:
#------------------------------------------------------------------------------
#- Define the entry point
#------------------------
#- Note on the link address and the Remap command.
#- In order to guarantee that the non position-independant code (the ARM linker
#- armlink doesn't generate position-independant code) can work on the ARM,
#- it must be linked at address at which it expects to run.
#- So the -ro-base must be used to define the link address as the base
#- address of the flash.
#- In this startup example, we use 0x100 0000 as base address. That's flash
#- address for all AT91 Evaluation Boards.
#------------------------------------------------------------------------------
# ENTRY
__entry:
#------------------------------------------------------------------------------
#- Exception vectors ( before Remap )
#------------------------------------
#- These vectors are read at address 0 before remap.
#- They absolutely requires to be in relative addresssing mode in order to
#- guarantee a valid jump. For the moment, all are just looping (what may be
#- dangerous in a final system). If an exception occurs before remap, this
#- would result in an infinite loop.
#- After Remap, these vectors are mapped at address 0x100 0000 and only a
#- reset (internal or external) can make of them the actual ARM vectors.
#- Note that the infinite loop has advantage that a debugger can to show up
#- very quickly an hardware issue during the boot sequence.
#------------------------------------------------------------------------------
B InitReset /* reset */
undefvec:
B undefvec /* Undefined Instruction */
swivec:
B swivec /* Software Interrupt */
pabtvec:
B pabtvec /* Prefetch Abort */
dabtvec:
B dabtvec /* Data Abort */
rsvdvec:
B rsvdvec /* reserved */
irqvec:
B irqvec /* reserved */
fiqvec:
B fiqvec /* reserved */
#------------------------------------------------------------------------------
#- Exception vectors ( after Remap )
#------------------------------------
#- These vectors are read at address 0 after the remap command is performed in
#- the EBI. As they will be relocated at address 0x0 to be effective, a
#- relative addressing is forbidden. The only possibility to get an absolute
#- addressing for an ARM vector is to read a PC relative value at a defined
#- offset. It is easy to reserve the locations 0x20 to 0x3C (the 8 next
#- vectors) for storing the absolute exception handler address.
#- The AIC vectoring access vectors are saved in the interrupt and fast
#- interrupt ARM vectors. So, only 5 offsets are required ( reserved vector
#- offset is never used).
#- The provisory handler addresses are defined on infinite loop and can be
#- modified at any time.
#- Note also that the reset is only accessible by a jump from the application
#- to 0. It is an actual software reset.
#- As the 13 first location are used by the vectors, the read/write link
#- address must be defined from 0x34 if internal data mapping is required.
#- (use for that the option -rw- base=0x34
#------------------------------------------------------------------------------
VectorTable:
ldr pc, [pc, #+0x18] /* SoftReset */
ldr pc, [pc, #+0x18] /* UndefHandler */
ldr pc, [pc, #+0x18] /* SWIHandler */
ldr pc, [pc, #+0x18] /* PrefetchAbortHandler */
ldr pc, [pc, #+0x18] /* DataAbortHandler */
nop /* Reserved */
ldr pc, [pc,#-0xF20] /* IRQ : read the AIC */
ldr pc, [pc,#-0xF20] /* FIQ : read the AIC */
#- There are only 5 offsets as the vectoring is used.
.long SoftReset
.long UndefHandler
.long SWIHandler
.long PrefetchAbortHandler
.long DataAbortHandler
#- Vectoring Execution function run at absolut addresss
SoftReset:
b SoftReset
UndefHandler:
b UndefHandler
SWIHandler:
b SWIHandler
PrefetchAbortHandler:
b PrefetchAbortHandler
DataAbortHandler:
b DataAbortHandler
#------------------------------------------------------------------------------
#- EBI Initialization Data
#-------------------------
#- The EBI values depend to target choice , Clock, and memories access time.
#- Yous must be define these values in include file
#- The EBI User Interface Image which is copied by the boot.
#- The EBI_CSR_x are defined in the target and hardware depend.
#- That's hardware! Details in the Electrical Datasheet of the AT91 device.
#- EBI Base Address is added at the end for commodity in copy code.
#------------------------------------------------------------------------------
InitTableEBI:
.long EBI_CSR_0
.long EBI_CSR_1
.long EBI_CSR_2
.long EBI_CSR_3
.long EBI_CSR_4
.long EBI_CSR_5
.long EBI_CSR_6
.long EBI_CSR_7
.long 0x00000001 /* REMAP command */
.long 0x00000006 /* 6 memory regions, standard read */
PtEBIBase:
.long EBI_BASE /* EBI Base Address */
#------------------------------------------------------------------------------
#- The reset handler before Remap
#--------------------------------
#- From here, the code is executed from address 0. Take care, as it is linked
#- in 0x100 0000.
#------------------------------------------------------------------------------
InitReset:
# b InitReset
#------------------------------------------------------------------------------
#- Speed up the Boot sequence
#----------------------------
#- After reset, the number os wait states on chip select 0 is 8. All AT91
#- Evaluation Boards fits fast flash memories, so that the number of wait
#- states can be optimized to fast up the boot sequence.
#------------------------------------------------------------------------------
#- Load System EBI Base address and CSR0 Init Value
ldr r0, PtEBIBase
ldr r1, [pc,#-(8+.-InitTableEBI)] /* values (relative) */
#- Speed up code execution by disabling wait state on Chip Select 0
str r1, [r0]
#------------------------------------------------------------------------------
#- low level init
#--------------------------------
# Call __low_level_init to perform initialization before initializing
# AIC and calling main.
#----------------------------------------------------------------------
bl __low_level_init
#------------------------------------------------------------------------------
#- Reset the Interrupt Controller
#--------------------------------
#- Normally, the code is executed only if a reset has been actually performed.
#- So, the AIC initialization resumes at setting up the default vectors.
#------------------------------------------------------------------------------
#- Load the AIC Base Address and the default handler addresses
add r0, pc,#-(8+.-AicData) /* @ where to read values (relative) */
ldmia r0, {r1-r4}
#- Setup the Spurious Vector
str r4, [r1, #AIC_SPU] /* r4 = spurious handler */
#- Set up the default interrupt handler vectors
str r2, [r1, #AIC_SVR] /* SVR[0] for FIQ */
add r1, r1, #AIC_SVR
mov r0, #31 /* counter */
LoopAic1:
str r3, [r1, r0, LSL #2] /* SVRs for IRQs */
subs r0, r0, #1 /* do not save FIQ */
bhi LoopAic1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -