|
9 \# V* V# Z. Q% x在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句
/ g% b( j/ X, q r8 w6 }/* 重新配置程序入口点 */4 Z) i" f( \) z
-e Entry- /****************************************************************************/
* N/ v7 R1 _9 ` - /* */
u% m/ z1 v) i6 j* S - /* OMAPL138 及 DSP C6748 内存空间分配定义 */
. I5 }, i5 `; ` - /* */: `7 N6 [0 @" N! l. j
- /* 2015年04月20日 */
, }6 ~' g7 c) U+ B - /* */
5 E; P* k: I2 t# L0 w* G, ~ - /****************************************************************************/3 u6 D X! z( @+ w7 q$ i
- /* 堆栈 */
?" L3 o9 s- T, x2 ?) z - -stack 0x80008 w% d1 e% ]% ]# K
- -heap 0x2000
, g& N6 V! E4 }/ d
* s/ [1 i/ K6 W3 V% H, @- /* 重新配置程序入口点 */
6 D" i& i9 f1 I& u - -e Entry
2 N/ t2 \) V* a% d% I# S+ S! x5 Q
% i4 F1 H; O I$ @% v- MEMORY
) y" Q* ~2 i' ~5 E: q - {- z0 v$ i* G( C( c0 U' R
- #ifdef DSP_CORE/ _/ x6 O& H6 c t1 Y
- /****************************************************************************/0 b' }4 {" }! K
- /* */
- W, e# p( N& Q - /* DSP 专有内存区域 */& B/ i9 Y$ E6 P. H6 r' G
- /* */& v b1 n$ h8 i& \
- /****************************************************************************/
8 l6 [/ {9 m! f/ _5 E/ { - DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */" K* ^1 u3 V T( a3 P% X' }
- DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */
0 F/ L9 d4 m# K" X+ }6 q8 u, Y - DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
3 c1 L7 \2 k1 A0 Y+ e' \ { - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */
& H; j; ~; {6 B! ]) Q - #endif
复制代码 这是一段汇编代码用于切换到特权模式/ i- ?8 M; n. o7 |! s8 Q
5 Q& ?$ f9 n" v- ^- u3 S$ C
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm) T! g1 X! b* q
- ;******************************************************************************
* o# Z6 |0 {( X# K- b - ;
0 W7 ~" N0 K" {5 E' }- b, P: D - ; init.asm - Init code routines4 x# s3 Y3 ?7 q5 ?% u
- ;
/ n! x Z9 i6 e; o3 Z$ m - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/" @. ~( G& h. ]& X) Y; O [& w. j
- ; All rights reserved.0 n F1 z5 [; X% O `
- ;
, @7 z d$ B6 L - ;******************************************************************************; k0 z( f. v2 D6 D, W( j$ i
- ;****************************** Global Symbols*******************************! {( f2 W7 S# \& _4 J% W
- .global Entry- q# E+ |7 ?* G: X
- .global start_boot
7 l! p3 ~/ D# L - .global __TI_auto_init
" B# G3 P3 g7 W- _3 v - ; K0 Q! k5 }6 V1 [4 {/ h% S2 p6 @* }
- .ref __stack+ J* Q1 K5 w& G! J# j
- .ref __STACK_END
$ Z* S0 }( E$ g3 [& v - .ref bss_start
* t$ A% a* h( ~6 d3 c - .ref bss_end
0 j* w7 u5 Z, J# k& y) v4 e - .ref start_boot: {/ }% x$ o! g6 f4 L% X" ~" V
- O$ ], ]9 H5 E- ;************************ Internal Definitions ******************************
2 T( x2 |& D( Y3 C& |: d - ;
1 V$ X: T% ~: @ - ; Define the stack sizes for different modes. The user/system mode will use
7 x5 e! ?1 R3 T' a1 X - ; the rest of the total stack size7 J L3 M/ A$ [ @" t
- ;
; ] l: o9 D, K# G - ; p, b F2 U3 [) m+ @. K, }
- UND_STACK_SIZE .set 0x8% `3 Z8 y; D$ s, \" i: z! H
- ABT_STACK_SIZE .set 0x8( m: ?# k0 V7 N: O0 k6 {
- FIQ_STACK_SIZE .set 0x8
- z8 Z3 w" U0 o$ e% M' K - IRQ_STACK_SIZE .set 0x500
) G& n( `4 y8 s - SVC_STACK_SIZE .set 0x8
3 F$ P; w+ n. b - 0 J! s# e. a7 p$ U
- ;
: k. U6 u2 A1 V8 t/ P - ; to set the mode bits in CPSR for different modes
- m9 X C4 c4 S' C2 k9 ] - ;
5 T1 m. a4 Q$ Z! X7 ?/ ]; \
) c- c; q0 Z2 W$ W6 L- MODE_USR .set 0x10
1 _% D7 {9 G; h2 K R0 ]5 Z9 ? - MODE_FIQ .set 0x11* p3 ~ T& X0 M4 e0 G" r7 l j. q
- MODE_IRQ .set 0x12; G* L7 D7 @- H& n, h% m8 `+ c
- MODE_SVC .set 0x13- s9 x/ f- c' E( i1 V) y
- MODE_ABT .set 0x17
' p+ [1 B8 d. V. [9 w- k) R - MODE_UND .set 0x1B
7 b: D& e3 J3 K$ e - MODE_SYS .set 0x1F, W* \4 `5 L) v5 j
$ d- D( N: k9 o X8 }- I_F_BIT .set 0xC0
4 A- O+ {3 K3 M* i
3 Z5 g3 N r0 y! B9 O- ;**************************** Code Seection ***********************************$ |8 c' G. Q5 F8 S5 P% b
- .text
- o7 S: Q4 s8 B3 K - " l5 m2 u% @- P6 C$ H8 @( S
- ;
4 \% z$ n* v3 \+ T+ Z' {+ \ - ; This code is assembled for ARM instructions9 }$ c8 w& [ d" c) }" a2 q1 Q
- ;
6 r% H( w* V# l - .state32* ]/ {1 y& r0 a* x8 k- c0 P
/ D9 _5 r, M* Y$ D2 ^- ;******************************************************************************8 `8 o* q, O& z
- ;
4 N& }7 {7 D! m/ K7 J7 P: ?$ E/ k - ;******************************************************************************
9 B& `! g0 ]) ~* r - ;! N2 N3 H. L0 ~) [
- ; The reset handler sets up the stack pointers for all the modes. The FIQ and
7 B( N! B( B" L' f0 L# E - ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the0 t- D0 \1 C; `5 |" I1 R
- ; main() function.
, Y4 Y& f3 {$ h' Z) O7 n. q - ;- U6 |$ m3 f4 i3 v1 o5 }0 `3 s
- Entry:
' u( f* E& P/ f4 c$ D- ] @ - ;& y% G) G& n* ]3 b2 |5 b
- ; Set up the Stack for Undefined mode
5 V/ T9 ]& e( F7 Z# D - ;
, `+ {! `! h7 Z+ B7 D4 N - LDR r0, _stackptr ; Read and align the stack pointer
3 M( e7 o, u; T7 {$ ? - SUB r0, r0, #8
% _0 b' l3 k+ K - BIC r0, r0, #7
* `9 b F. E: u& P ?- D - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode
( ?5 z+ s# N y! ] - MOV sp,r0 ; write the stack pointer
/ M, n* W# ^& R8 N& C; p q0 K - SUB r0, r0, #UND_STACK_SIZE ; give stack space8 v2 |8 V5 a* S
- ;
" Q) C' p% d5 Y! A - ; Set up the Stack for abort mode
& g8 {4 ]% r/ f! d2 v$ q* } - ;5 F6 W& j6 J9 |
- MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
, z% a3 t# E, |' x4 t1 P# o - MOV sp, r0 ; write the stack pointer3 o( i* ~* q, l3 |0 h& v
- SUB r0,r0, #ABT_STACK_SIZE ; give stack space+ G) \5 R% e, p5 P$ Y9 E
- ;
8 _8 p2 v5 ^. P' S4 Y5 ^' f - ; Set up the Stack for FIQ mode
( p' @( ~: k! E' D$ e - ;2 t( K4 j! C7 u4 ^8 Z. n
- MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
: ]6 ]9 q4 T; [ - MOV sp,r0 ; write the stack pointer
: s7 }( M9 B+ Z! D - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
! }6 Z3 B% u5 z* E - ;/ x# y3 i4 z- y$ N" }
- ; Set up the Stack for IRQ mode% Y& `: ?7 T. j3 M( k8 D7 s
- ;+ v1 @ `; Y% y0 M
- MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode; V% E) j. O' ~0 @
- MOV sp,r0 ; write the stack pointer! B$ _+ b, A7 O/ J
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space1 |, t+ N3 |6 E; A$ i+ i
- ;
) U& r- K- p* [3 G' Q+ Z - ; Set up the Stack for SVC mode
$ k1 J2 n+ |" [" i& b, D - ;
- y% D1 E/ H" w" h# d! o - MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
: h% O( M- J4 u) T3 F - MOV sp,r0 ; write the stack pointer
* M7 f& e B9 y* D - SUB r0,r0, #SVC_STACK_SIZE ; give stack space
$ @. V: q2 z! ?% G - ;/ f+ S& }8 Q9 M& t2 _! Z
- ; Set up the Stack for USer/System mode) t& {* X/ y$ h6 ^5 ]& G+ S
- ;
3 P5 D& A$ A! y - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode3 r& N* j, M; `# M
- MOV sp,r0 ; write the stack pointer1 b1 v8 R! R( Q/ N+ J" G
( e" |8 M( T3 n: H, J8 F- ;
) n2 @) h' G& \6 ^( Z1 H0 v0 f - ; Clear the BSS section here
# \( f; k# @5 ~8 I- { - ;
- _ ]! @* X1 u. v- T" V - Clear_Bss_Section:
6 Z2 { J1 m+ s5 y, z5 P2 [2 w0 ` | - / I: @+ }) }6 W3 G. X! n
- LDR r0, _bss_start ; Start address of BSS
0 u- J, | U3 X- `2 D- u) D; } - LDR r1, _bss_end ; End address of BSS$ m3 T8 U4 B3 t/ M* Q& ]
- SUB r1,r1,#4 m: q0 u7 U9 K9 X6 S
- MOV r2, #0
& `$ f: g. Y- T - Loop:
1 L/ a5 o' m3 K/ J$ Y - STR r2, [r0], #4 ; Clear one word in BSS
* U9 f5 Z9 C3 }+ O% ^ - CMP r0, r11 t& j1 x- }! \, y0 B. R
- BLE Loop ; Clear till BSS end
& [" Z' _, C& I; U! D G$ E$ c& j
, s! x5 f+ G( W$ H; T- BL __TI_auto_init ; Call TI auto init
2 q1 L9 d% i$ T' b1 z* | - 2 w* g. S4 Y% p- i4 c5 _$ L/ p
- ;' S) y3 n! b3 n3 ?
- ; Enter the start_boot function. The execution still happens in system mode
. v% D/ ~0 b( F5 x - ;
& |: w$ o1 R3 C# f - LDR r10, _start_boot ; Get the address of start_boot# f n R u3 _
- MOV lr,pc ; Dummy return
: d) c5 @6 K* A% k+ { - BX r10 ; Branch to start_boot% N4 {# j( U( G1 t
- SUB pc, pc, #0x08 ; looping
. G; J% [4 X$ d4 |7 f# f1 a" L# w0 Q# U - - \) `7 N& i5 ?
- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode/ D* V7 {# D1 w9 T" I% T M0 l3 J
- ; BX lr! d; f$ Q! a% ]
- ;
4 `. B- {+ H4 \3 |3 S: m - ; End of the file! b0 X; g! s) u9 c
- ;
: l( l1 m. y& E5 a" b3 V - 9 W. n" c; j1 A$ s7 k" ?
- _stackptr:0 ^* f. B& A2 T
- .word __STACK_END& ?# v" q9 E3 ^. d" B
- _bss_start:
: t* U& `0 v& L5 I! r% F5 r" j5 H - .word bss_start
( j. o4 ~- s0 D! Q6 Q4 v6 l9 G - _bss_end:
6 S% B j% `7 }# D! W- ^- v - .word bss_end; ]1 k& N6 }% ^$ P; P* y2 X2 v3 r
- _start_boot:( y! W. ?; w9 s, l7 \ t: k3 K
- .word start_boot5 S" M- g; D6 b( I2 L: e( w
- _data_auto_init:6 x7 Y, b: D- M9 D2 w
- .word __TI_auto_init3 y' [- `5 [! _
- .end4 R6 l- d; ?) r) p! `
- ! g# @0 J4 @7 G7 N$ Y) s
- % b6 Y# Z9 n# l+ A: [" f+ C
" N# d+ K4 S6 W9 H+ m1 y
复制代码 0 f4 h0 {" M1 s. Y* y
3 J& h. o& W: @6 t3 V/ {& J* j0 S
* w2 o: G* u/ ^8 {# r5 O: T4 e* x; b' a/ Z" ]
|
|