|
( }; p U* L/ x4 a& R# i6 j
在 ARM 端 StarterWare 例程中 CMD 文件比 DSP 端多了这样一句/ c" c, r% j+ Y/ T
/* 重新配置程序入口点 *// ^5 W- k7 }5 n# L, c( F. f. i
-e Entry- /****************************************************************************/9 S# v% X. v g, A
- /* */7 K& p; g. l0 m" @6 ^0 U+ ?5 e% r* N
- /* OMAPL138 及 DSP C6748 内存空间分配定义 */
$ d+ l: J' W7 R: G - /* */
& }, T( N4 Q" e& t- B: O - /* 2015年04月20日 */
' x0 \" v* K6 x - /* */1 \: M% I) {7 G3 x
- /****************************************************************************/
: Y, U5 j ]! a" {: ~8 h- h2 Y - /* 堆栈 */* r* a3 s3 S t
- -stack 0x8000" X( W3 ^+ r( r+ R5 N G& E
- -heap 0x20000 m! U0 ~) ]/ I1 S, W) S
! N) _7 |) k Z, P2 J- /* 重新配置程序入口点 */* T; d5 @. |# A0 n- i
- -e Entry
% ~- ?) q* r% X! e* x - ( a: P. r7 b- l' B1 J
- MEMORY" h4 c8 G5 U% B% v" Z7 q* M
- {
, S1 J' V. w1 Y - #ifdef DSP_CORE/ y0 ]5 X: q3 T
- /****************************************************************************/' W& H N' P) t+ c
- /* */$ ~8 k, x" ?' `* o' G
- /* DSP 专有内存区域 */
" x( z. o' C' e5 U( B* _ - /* */3 R2 t3 F; M' v% k
- /****************************************************************************/" N6 Q* P. b$ g4 l1 Y: H6 D
- DSPL2ROM o = 0x00700000 l = 0x00100000 /* 1MB L2 DSP 本地 ROM (DSP ROM Bootloader) */
: ?" d. |. |( \# _ - DSPL2RAM o = 0x00800000 l = 0x00040000 /* 256kB L2 DSP 本地 RAM */4 w+ R: X/ S! p
- DSPL1PRAM o = 0x00E00000 l = 0x00008000 /* 32kB L1 DSP 本地程序 RAM */
* Z) C+ `' N, j9 B6 _# }0 D - DSPL1DRAM o = 0x00F00000 l = 0x00008000 /* 32kB L1 DSP 本地数据 RAM */6 W2 _0 C" ^) X; I. |2 W
- #endif
复制代码 这是一段汇编代码用于切换到特权模式9 j% n5 l9 M3 z0 i
) C, J' S" x5 h. k- C- j- J% I
OMAPL138_StarterWare_1_10_04_01\system_config\armv5\cgt\init.asm% Z& h* X' T' Q7 n0 s: J
- ;******************************************************************************0 F, ~3 m% k% L; }
- ;
. R! Z; b: i$ ?0 \2 Q+ } - ; init.asm - Init code routines$ G% }( H! P( G: [3 \4 X$ r
- ;
: Q. R, q- G# B7 `% }1 C - ; Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com/( I4 B1 o* y( s3 G8 ]
- ; All rights reserved.& Q" j" L2 C9 t9 c* x
- ;
; R* C7 s+ s, A: `- x - ;******************************************************************************
) R3 A. z* z# b$ v; \- B - ;****************************** Global Symbols*******************************
$ o- F( g7 v% t# w$ K) E6 Q - .global Entry
0 w5 i& E0 X# y2 P0 y - .global start_boot
7 r- N+ ?" q7 P - .global __TI_auto_init
/ T, }, c5 m$ F* G0 y3 v
# j) f. W0 Y( ~) W. S- .ref __stack
! E: I, ]' t( N) K6 J* u - .ref __STACK_END
2 U7 [) z* |% Q+ O - .ref bss_start
7 ]7 a( y# q& q& l) ?( `% y - .ref bss_end
! @ }5 p* R" r5 q0 |9 X% b - .ref start_boot/ |; D# k6 ~% Q4 h2 [
- - V* G$ U: w! W
- ;************************ Internal Definitions ******************************
: O6 m5 L+ A' `: {8 v; n - ;
& M8 g. t, S7 \/ J$ O: y - ; Define the stack sizes for different modes. The user/system mode will use3 a/ D/ j/ I n8 j5 h0 s& @
- ; the rest of the total stack size/ w( e; k- E& k8 ?! ~
- ;+ {6 r8 S5 A" L/ o( ?
- 9 ]- X e' e" _1 }$ c, I" @
- UND_STACK_SIZE .set 0x8
; _- u+ `7 |+ G* {, {5 t$ L& D5 N - ABT_STACK_SIZE .set 0x82 j# p% H/ `+ J; E& l0 s6 l
- FIQ_STACK_SIZE .set 0x8
; T( {' Y p- O8 d0 N- U$ P - IRQ_STACK_SIZE .set 0x500
* s( L& H( o) h# K3 @: a8 Z1 j - SVC_STACK_SIZE .set 0x8
7 ?* i$ { I; k" _ K1 \- ]
4 S( c# e# b) r. X- ;
. U# \/ f0 e3 \' E2 I; y9 a- I - ; to set the mode bits in CPSR for different modes% W; O; i0 M# C$ z
- ;- L. C0 i. f$ ?- B
- , A4 M! V4 Y; d# b
- MODE_USR .set 0x10+ v' y4 P3 l1 _" A, y
- MODE_FIQ .set 0x11
3 \# C/ E- f. H$ r& Z$ H- z7 A - MODE_IRQ .set 0x12
/ K( R) m' W8 p7 S4 h, a9 t# n" F& ~ - MODE_SVC .set 0x13( Z* p" [3 Y' k- `
- MODE_ABT .set 0x17) C& p! J/ Q* D1 t. ]' L" a
- MODE_UND .set 0x1B; U& D8 v: Z* g' R& n: t
- MODE_SYS .set 0x1F
) b( t; A$ t- x; ^ - ' Q3 O3 U$ C2 ?* Q8 t7 [
- I_F_BIT .set 0xC08 j+ r1 A- u8 X. ? H0 w
7 i9 |. d' }# q. e7 y1 c- ;**************************** Code Seection ***********************************
' ]$ y8 e! X% B1 Z' {# e3 b+ m: U2 M - .text3 s+ l: P/ g% E, J
- # a% C6 p: @; J9 g7 k
- ;- \1 @, N. m+ I5 z; I7 ]* Q9 p
- ; This code is assembled for ARM instructions5 {+ G1 l9 \- B8 ?
- ;! f1 ] y$ E M4 @: [
- .state32
2 J: c6 x! e+ V7 P3 N5 k, H, B - " e" E: ^6 {0 Z9 a
- ;******************************************************************************1 v* S) V" n, u/ v( u
- ; G4 H5 s, j: K$ B! w. S. U
- ;******************************************************************************
! r, P: p; ^; J4 t8 ~- W - ;
( t0 \( ~* N0 k+ O, q - ; The reset handler sets up the stack pointers for all the modes. The FIQ and9 J* _1 _; X; Y3 m
- ; IRQ shall be disabled during this. Then, clearthe BSS sections, switch to the0 H) S( \6 y2 s6 z+ F) _
- ; main() function.4 X; ]9 U5 E" m+ i+ Z
- ;
: I7 r% o% ?5 t& X% T - Entry:
7 w/ r5 F7 \& e' {8 b. [ - ;
' U9 o. Q( Y5 P: H- V - ; Set up the Stack for Undefined mode$ p# o8 I4 V0 k, i; i" y0 C7 o: s! C
- ;! y# M8 H6 H# z i4 p
- LDR r0, _stackptr ; Read and align the stack pointer
3 _) `2 }2 F& r: z/ P% z - SUB r0, r0, #8
- q; V, J4 g! B; P7 S U* k. m - BIC r0, r0, #7
! s W e5 X. H% m- D. t - MSR cpsr_c, #MODE_UND|I_F_BIT ; switch to undef mode5 D7 }, R- C: B7 t" I' F
- MOV sp,r0 ; write the stack pointer
`% d. y; n& f0 W8 H. I7 `. Z - SUB r0, r0, #UND_STACK_SIZE ; give stack space: K. Y8 P( b% P" G4 B( q# ]# a# T
- ;, F7 D ~; b9 U5 X
- ; Set up the Stack for abort mode
0 h8 v( U; `) t2 ?' R - ;
! }+ x; D4 z" E3 |* U" h( z - MSR cpsr_c, #MODE_ABT|I_F_BIT ; Change to abort mode
2 C5 J6 F% g7 e8 l - MOV sp, r0 ; write the stack pointer
* D6 e+ m/ O& { - SUB r0,r0, #ABT_STACK_SIZE ; give stack space, ]; o! A s. Y
- ;" I8 C7 p6 y" C2 @2 Y1 B1 f- Q7 ~
- ; Set up the Stack for FIQ mode
- b# Y2 k. _1 v- x" P ? - ;
- ^$ C% @: T9 |9 O: ? - MSR cpsr_c, #MODE_FIQ|I_F_BIT ; change to FIQ mode
$ Z% ]4 A2 W l6 {- F( D - MOV sp,r0 ; write the stack pointer
, w( R1 u& X* R, q% }- Z - SUB r0,r0, #FIQ_STACK_SIZE ; give stack space
' x* V2 {. s" n/ X; b# n; }2 D - ;. z6 s5 x) j$ W5 `0 t7 [' L* E
- ; Set up the Stack for IRQ mode
0 y& R4 Z5 x) P" v# \0 m - ;
' w* [9 e0 W. s8 I; x' ]1 d6 \ - MSR cpsr_c, #MODE_IRQ|I_F_BIT ; change to IRQ mode
' `/ p' k7 ^5 _6 @ - MOV sp,r0 ; write the stack pointer$ ]9 p& y w7 J. s5 m2 E0 h
- SUB r0,r0, #IRQ_STACK_SIZE ; give stack space
1 u: R3 `4 R' E- G3 W* E - ;- g' H- y* B H
- ; Set up the Stack for SVC mode
4 S+ [/ e% F/ p# M - ;8 u6 B0 ~. o1 T# L$ d; H
- MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode, a) q0 ^" H+ d/ ~
- MOV sp,r0 ; write the stack pointer
+ ~1 a3 f5 U7 c0 s) \ - SUB r0,r0, #SVC_STACK_SIZE ; give stack space
$ D7 A# D9 a% U' ` - ;
5 v3 g- t. I; b, Q' U - ; Set up the Stack for USer/System mode
1 Y# E4 M- f5 v+ l& ~ - ;
# r+ h% ^& m- _2 G3 U - MSR cpsr_c, #MODE_SYS|I_F_BIT ; change to system mode( a& G# V \+ r h1 R( A0 D
- MOV sp,r0 ; write the stack pointer
' Y9 ]( j; V. g; f8 t# Y+ J& y - 2 f ^# m; J* v. ?4 v' ^
- ;
# N/ [$ e5 Y' Y0 h& v- K( V - ; Clear the BSS section here9 `6 z8 g, Z/ v9 x" v" c2 E
- ;
) S D) d; d$ \ - Clear_Bss_Section:
* G' T, `0 J1 A8 u2 ^3 z. M& O( A
: Z( r6 Y- U* j- LDR r0, _bss_start ; Start address of BSS
o. l# c; t! l/ E$ A - LDR r1, _bss_end ; End address of BSS
8 U$ z8 x( C- S$ D5 N [ - SUB r1,r1,#4
( U( [; j* P- F: B* _3 u& K+ v - MOV r2, #0
' f( l; p7 @- A - Loop:
2 X( U, X( R& S* U8 g - STR r2, [r0], #4 ; Clear one word in BSS8 d- _4 _9 y0 f# {7 H, g
- CMP r0, r1+ w$ h+ A) ]$ g
- BLE Loop ; Clear till BSS end0 u O S8 O3 Y' Z( r' N6 S
- 7 f; ^+ X& H% ~: @9 f" [! D
- BL __TI_auto_init ; Call TI auto init
% W4 [0 g( [9 E7 K, i - 7 X# g5 V3 C: ^& W t
- ;. C. e7 g5 d8 S
- ; Enter the start_boot function. The execution still happens in system mode
, m8 P# S* \! r+ v1 ]2 [ - ;$ m z; D$ [4 r3 E
- LDR r10, _start_boot ; Get the address of start_boot: g# i6 N$ Y: ]( z: }: h$ L5 Q
- MOV lr,pc ; Dummy return
. s' {1 W. a" g, m9 V4 s - BX r10 ; Branch to start_boot
$ `: j* J0 L% U/ H$ ~$ [ - SUB pc, pc, #0x08 ; looping
( X% ~% A& g- y
1 y7 M# S! g/ K3 Z7 N% K5 X; h- ; MSR cpsr_c, #MODE_SVC|I_F_BIT ; change to SVC mode
2 d+ i8 U3 y2 m* k$ F w2 P - ; BX lr
* ]! p7 {* Q* \7 j6 O; K - ;% ]$ k) n. _# G- d" c1 y1 O# q& ?% s
- ; End of the file
8 q/ P y+ Z! W - ;2 e& `8 m/ K" A6 j, M. N
- . c+ L( s9 q# i. ^2 w
- _stackptr:
1 o* D4 M& W8 ~% k: F - .word __STACK_END% @0 p0 P( J' V' f3 l
- _bss_start:
/ U. |! y1 \% m2 M9 D; l - .word bss_start/ K- e5 \# o; e' V( p
- _bss_end:. ]7 N1 ]/ G* U1 [' H
- .word bss_end0 Z6 f9 O! s9 ^1 J6 @
- _start_boot:
7 A; W% Z) `5 S9 F6 p - .word start_boot
% d) C- o- Z; l Z* H/ N - _data_auto_init:/ s) o1 X8 o7 E6 _' Y
- .word __TI_auto_init9 O' j. h7 B; K% z! L6 N
- .end* \& a5 M/ u6 m5 K
- 4 k( I6 d# u8 K; X; a) a( e# x
- 0 V$ h) o1 z0 |) R+ S. L' V9 N( h5 y
( u7 C& S" r. o
复制代码 $ G* e/ g7 ^" |- `
$ D; T& R( v Z$ j9 W
8 G+ V W; l) k6 f& Y
+ a l$ y! f$ l* w7 |' P% i+ U' b) t4 r$ _+ x7 Q0 S! O/ ]: V6 d
|
|