|
W# ?2 D Q6 _( G. a/ Q4 N4 M7 Q
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句$ }: f: O" ~8 R" |9 I I
/* 重新配置程序入口点 */
+ I' Q% f) c" r, |& |5 f$ Z, Y-e Entry- /****************************************************************************/+ v; d% {+ c: y' j% [/ Q* y
- /* */
2 b6 K4 j; D3 {% M5 H4 b; K/ W8 A - /* OMAPL138 及 DSP C6748 内存空间分配定义 */3 a9 T3 }& _9 O) X8 [
- /* */
: O: H" A: U- E6 g - /* 2015年04月20日 */
# W; Q/ t: u' \9 P - /* */
/ }0 Q7 |& O: P: S/ ~- A; R$ ^ - /****************************************************************************/- Q; A1 G/ t/ i7 q/ v" U
- /* 堆栈 */
9 n" R) ^+ J, T - -stack 0x8000
3 P* o1 ~+ k4 O8 X* G - -heap 0x2000) s- J4 k) t3 Q6 g/ r2 q# U
6 F1 H$ [+ i" @% R- /* 重新配置程序入口点 */
3 n+ w7 L! Z& y& } - -e Entry
' O- ~% \, _5 p# i& K7 b1 ~( l/ Z - - P$ r5 g$ m4 o) H" P
- MEMORY
9 O$ S$ u# M7 Z& ?" V4 n! W# | - {
; k$ b; f8 [8 Q: ]4 x% E2 K) N - #ifdef DSP_CORE" Y! V/ K) k2 y
- /****************************************************************************/
7 _5 H& _- w& Z" B1 F - /* */
9 a" H. u! x8 U+ h6 e% C- \ - /* DSP 专有内存区域 */
2 Y; d0 V' U9 f% O) Z; v - /* */
4 C" q2 b4 q: ]7 c- t( u - /****************************************************************************/) h' s# I) A; Q5 G7 F; L V: Z
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
% O' ?5 C+ {- s1 @% o - DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
- B! v5 H, P! {6 ^7 `2 R9 ~/ c - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
; w: P- O& z. z; h& Z - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
5 m9 O2 ~ J4 E, J7 z5 K0 m - #endif
复制代码 这是一段汇编代码用于切换到特权模式
0 u2 ]8 u0 c E* I" p# b4 p
# W, }- C4 N' ]" e5 Y/ {5 S) g3 ?OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm+ f; N) P9 p1 {/ K
- ;******************************************************************************
6 ^6 }& V! W }8 G: v3 d& c - ;
- A7 G! N0 l; W; k" r3 C - ; init.asm - Init code routines6 s) O4 R9 S" N. L. G7 p% N3 A+ L0 P
- ;
1 q, _- B5 c9 h, ?4 a9 W1 E - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/, O0 i4 w+ ~7 p6 W+ U3 }
- ; All rights reserved.& I/ }, K& W% f" W; D8 b6 l9 A
- ;; r$ f- c2 o1 D# X/ K1 \7 [
- ;******************************************************************************
# g+ w2 V( E2 ^2 i1 C6 z - ;****************************** Global Symbols*******************************
8 S% n: @1 [6 u) B+ z3 b8 q6 \ - .global Entry
9 m( ^) q# \1 ~5 c- @. { - .global start_boot3 Q$ g' v+ d' _1 w0 Q! w
- .global __TI_auto_init
, Z% ^: s8 K5 l: G - 5 ~# A: s7 R1 C1 W
- .ref __stack; `% T* V- ^% w H. G! j h
- .ref __STACK_END
8 C% n0 B+ @) w, ^4 J1 q8 u - .ref bss_start
) H B5 b$ j+ u6 ^ - .ref bss_end
/ Z; v# s2 y x - .ref start_boot
* b: R, T/ U! c7 v; b( I5 x
2 {( Q/ I* h* x; V5 a0 E! Y- ;************************ Internal Definitions ******************************4 { |6 D& m% H5 A H! {
- ;
% A8 s( ]) N6 f# {0 E9 o0 |, L% Q - ; Define the stack sizes for different modes. The user/system mode will use
$ G% i# c6 S: H. R) w - ; the rest of the total stack size
: d5 G2 W" S' H2 q4 H5 q - ;# `2 H* E5 r% z
& f% w3 I6 Y5 ~4 k- UND_STACK_SIZE .set 0x8
- h. D1 U& M6 c/ n/ L8 T - ABT_STACK_SIZE .set 0x8! g3 k& h# R o) B+ a& S# [
- FIQ_STACK_SIZE .set 0x8
7 m2 n$ p/ h* z6 k5 O, V - IRQ_STACK_SIZE .set 0x500
1 [1 n: Z. Z6 K) K* v - SVC_STACK_SIZE .set 0x8) M$ \: ~) [. b# r, H
- K3 j+ q) ~1 D
- ;
( m7 f$ Y7 o" |# Y* a# Y5 b8 y# r% M - ; to set the mode bits in CPSR for different modes
3 [. F# Z* v6 @# _# {7 H - ;( o( {8 h3 m7 S1 }3 [
- * I/ D3 {$ I/ a$ O. H/ ?4 Y
- MODE_USR .set 0x10
, u7 f: P) K5 V; G* C - MODE_FIQ .set 0x11
1 H) z) }; v% H9 W - MODE_IRQ .set 0x12
z$ D1 G t8 ?- R. ` x - MODE_SVC .set 0x13
5 r& g. \& k4 M3 N5 l& v - MODE_ABT .set 0x17
9 f) O I. T7 \ - MODE_UND .set 0x1B
7 }4 V) T- |0 T& K - MODE_SYS .set 0x1F
$ X5 C* w9 g. h) y - + @( y6 C4 L m
- I_F_BIT .set 0xC0
4 S1 k( e: k) }; M X5 K
b) W8 i4 P( Z- ^- ;**************************** Code Seection ***********************************
: `# S4 F- M' H - .text
5 L/ V+ \/ R2 J+ O/ i" j8 B0 A
. g0 H6 O1 l, @& b5 A! e0 W- ~- ;6 N" K* l: k) R- |
- ; This code is assembled for ARM instructions
$ r' e- J: l6 x% {6 R$ O - ;. R. G S3 ?( ]6 O
- .state32! X* v/ o# y" N) [: U% y. {# n7 {( k
) o" ?. a- s# }/ I1 _+ e- ;******************************************************************************7 V* S* g5 E+ ^/ I
- ;2 x- b" J& b& @! k% k" c
- ;******************************************************************************; V0 ^! W" n( {2 I- s
- ;
1 [# y4 D) y2 A5 g) o8 k0 W6 o - ; The reset handler sets up the stack pointers for all the modes. The FIQ and
+ e$ _; \7 o% A2 }1 T8 f - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the! Z* n! Z$ N4 s+ H! t
- ; main() function.
+ J" N% e. M" [9 ^* a1 ~/ j2 B Z - ;
, }5 t0 N' i" p& c: s0 A. A/ ^ - Entry:! {4 h: u9 m. P- m5 Z0 Y$ S* g
- ;
; |) H+ P |* P( { Q - ; Set up the Stack for Undefined mode2 w$ L3 c0 ^- ]
- ;
* q/ q& c& t: F* L( L9 s - LDR r0, _stackptr ; Read and align the stack pointer2 I% I. T( q7 l! l( W( {
- SUB r0, r0, #83 {. N5 L* I+ y, e6 y- C+ k5 e6 `
- BIC r0, r0, #79 \% f8 v: L. o) A& R8 |
- MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
: C4 @5 I8 L) \- z1 | - MOV sp,r0 ; write the stack pointer
8 e$ S& U9 b5 X/ e2 E6 B3 y1 u7 V6 F - SUB r0, r0, #UND_STACK_SIZE ; give stack space; {7 j0 u: l, T i- L
- ;
9 M% ?% S& {) V# @ - ; Set up the Stack for abort mode6 c% @; t8 c7 X2 V0 A
- ;9 q2 c3 {& L- a
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
" r8 U* K: H4 K. J5 U- V - MOV sp, r0 ; write the stack pointer" k6 V `7 S( T$ q0 n
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space% h- q: l- I: j; |( o/ {, _- z
- ;* _% t, W5 [8 Q: d4 h( W
- ; Set up the Stack for FIQ mode) H" q7 ] A7 F/ `" z
- ;( h9 b0 C% H1 O! E3 a1 ^7 N& u3 m
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode% L2 ^; C* D% i) H/ @" C
- MOV sp,r0 ; write the stack pointer+ E$ x% X' S1 ^; C$ I, T0 M
- SUB r0,r0, #FIQ_STACK_SIZE ; give stack space6 f: ^% T1 V* N1 r/ n3 X( I; o
- ; g, N" T( e9 Q( a. z7 g8 f
- ; Set up the Stack for IRQ mode
, h8 E$ X9 p" ?! }5 k3 [- M+ _ - ;
+ \ I5 |, V( \ - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode* g5 G; q9 A* G0 W/ @1 W) a7 D4 U6 L
- MOV sp,r0 ; write the stack pointer; A. F# T6 o' c# c" k9 @8 m2 V: C2 I% Y
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
" \+ z6 k/ \- p: m$ d1 r" w+ D - ;3 a& w* T' q' ?8 V( A: J2 ^
- ; Set up the Stack for SVC mode
, l1 b' t1 D6 V) G3 O$ } - ;5 H: ~3 E d8 R, P7 P
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
, s9 A7 [2 X4 X8 r% ^1 ~ - MOV sp,r0 ; write the stack pointer
0 L) v2 I1 k$ l& ~% u8 d - SUB r0,r0, #SVC_STACK_SIZE ; give stack space
4 |5 {) i; J- f- G* [. S5 P - ;% k% Q& U7 L" E9 M) W7 q7 ?
- ; Set up the Stack for USer/System mode
7 F0 p# p* z2 z( [2 a9 T" i - ;
! N w" A' v7 r7 r) F: G8 B$ G - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode: A! a- c1 b5 W3 S( x
- MOV sp,r0 ; write the stack pointer
% u) B, v" a# O3 ?1 M5 V
# H* C0 s0 G( U% W; U9 ?* _- ;
" T5 W' i# O, j$ s' U - ; Clear the BSS section here! `+ e, ]" x# j5 _+ ]
- ;3 x0 H7 D3 f& z6 B1 J
- Clear_Bss_Section:
" m9 Q" a9 j- }/ T Z; B - 2 K$ d8 Q/ S2 P2 `
- LDR r0, _bss_start ; Start address of BSS
( g z9 r- [: W. { \+ K$ r - LDR r1, _bss_end ; End address of BSS! ~) {$ a9 X0 O" R+ P
- SUB r1,r1,#4' C* ]9 i( I, T/ f7 k
- MOV r2, #0
1 ~/ A$ V- m" l6 ~& H - Loop:/ F0 e1 b7 m- q& X1 Y7 a
- STR r2, [r0], #4 ; Clear one word in BSS( L5 m# z$ }" h$ P( Y
- CMP r0, r1- o/ p5 O8 N$ ^6 J; ?4 t8 M
- BLE Loop ; Clear till BSS end; Z8 Y- _9 i' ]8 ~7 g, G# R
, g3 R' |2 [/ |( I! s6 Q$ E2 N- BL __TI_auto_init ; Call TI auto init/ b/ J) k7 q0 M2 }. O& }% G- X
% l0 g0 Y' x( W# j- ;2 R1 F7 Z9 R( G/ N# }+ S
- ; Enter the start_boot function. The execution still happens in system mode/ W/ G4 O w" {- l* F
- ;/ i- t* s+ L+ P- i) X8 J
- LDR r10, _start_boot ; Get the address of start_boot
4 ]# F; Q2 d6 v$ D$ ?1 |' y - MOV lr,pc ; Dummy return
% w4 l# W/ k Q; R$ y - BX r10 ; Branch to start_boot
0 b) ]7 {6 a3 E - SUB pc, pc, #0x08 ; looping
* {0 I! t% Q1 o. p' o7 Q" N& i - : V) B# w* h% C* Z) R6 v
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
; c3 P/ L0 X- o - ; BX lr" q' s' j0 G2 u
- ;; P( w, a3 B! N. ]. a0 m$ c
- ; End of the file7 T8 }2 F; D" M0 U+ w
- ;
k; f# \, t5 x/ F. b$ X - # R+ c' C/ J5 N4 h2 T. `1 p" g
- _stackptr:7 ^/ F3 f) h% ]: i
- .word __STACK_END
: l F2 y& y! j$ O# m& s7 |1 ^9 r - _bss_start:
( t q9 K) ]2 A/ u) l; @6 ? - .word bss_start
^# R0 \7 u1 }0 r9 `4 p - _bss_end:
( O/ `% W, ?+ r% N n+ \, x6 ` - .word bss_end
6 @) A& G7 b$ V9 K3 y0 s& x5 s$ d - _start_boot:
& q: X0 Y7 _8 U* ~+ i% B( x v - .word start_boot4 W4 ^" o2 ]" H2 d; r
- _data_auto_init:% L8 t2 b9 u0 M; c& `
- .word __TI_auto_init
- R0 w; J7 ?8 [9 f, S: p) h - .end1 A8 _3 U& x" [# f
-
, W4 D2 L! V/ D# @ C" p) P$ w$ Q - P) i u* r4 X+ k3 X) x# e
2 s5 L; {8 Z% J# S
复制代码 + S& z) W( |$ g; V4 N& `+ ~
' @( y4 l# \. q) U+ v
( O6 w+ i, N0 }; I; e
' a9 \; r0 w& H+ b) K- d
' N- f" f! x* A4 z |
|