找回密码
 注册
关于网站域名变更的通知
查看: 296|回复: 1
打印 上一主题 下一主题

Uboot详解

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-2 14:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
@CPU初始化
# z+ X8 C- Q) h4 l4 w! N& J
5 b9 l, B; r7 _8 a9 t/ n$ w7 V) j; j/ Y7 i@在“relocate: ”之前被调用
  f- J/ {* W% F% ?7 X, y" ~
& h, ~! D& L& T$ F( @#ifndef CONFIG_SKIP_LOWLEVEL_INIT' a$ j. ~, J- D: c$ C# H
cpu_init_crit: " K( ^. ]- t+ P2 R6 n5 w
6 \: Z0 J( y" J& t& M" M' v
@初始化CACHES) n1 C) n; Z. ?5 l  Q" c
mov r0, #0
( Z; t0 T: x* o" b3 Xmcr p15, 0, r0, c7, c7, 0 ) e" u4 |, K: ?/ z& _. _. ?* u
mcr p15, 0, r0, c8, c7, 0
) g" y( N0 d4 ~' J$ u5 E/ F8 y. l+ Z  Q% v8 P& X

" Q; y6 {  {9 s5 Q
) o3 p9 F' I+ a. w
& D, [0 Q# q  _' j. N@关闭MMU和CACHES( L" s: G; k# O- k0 H6 I
mrc p15, 0, r0, c1, c0, 0
, e+ L% b/ R, ibic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)3 o, Z) ^# |1 f
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
0 e: s- `9 U$ O  k( p  L7 Iorr r0, r0, #0x00000002 @ set bit 2 (A) Align
2 r. m- T. H" E0 V, n" ?: M: |orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
$ j% i, V7 ^, G2 L" O/ jmcr p15, 0, r0, c1, c0, 0
2 E" Q8 }! p3 @' O- }3 F@对协处理器的操作还是看不懂,暂时先不管吧,有时间研究一下ARM技术手册的协处理器部分。
* ~+ e  U! H7 \' O- B- z
5 Z- q; k7 N2 L: h9 T' p( u& w 1 f; k" @& \9 ]
) S6 ?* B( i, {& B  S2 i7 H

3 i; C& P" S: Z/ {, k# \6 B2 p2 t@初始化RAM时钟,因为内存是跟开发板密切相关的,所以这部分在/开发板目录/lowlevel_init.S中实现 " y! S) H; F9 j9 I6 G
mov ip, lr6 J- M2 O6 n/ G' E0 R# J2 j. l
@保存LR,以便正常返回,注意前面是通过BL跳到cpu_init_crit来的。
, X9 U+ f; I2 R@(ARM9有37个寄存器,ARM7有27个)% U0 w; o/ K0 J5 i6 W9 s
37个寄存器=7个未分组寄存器(R0~R7)+ 2×(5个分组寄存器R8~R12)+6×2(R13=SP,R14=lr 分组寄存器) + 1(R15=PC) +1(CPSR) + 5(SPSR)
( `7 @* @0 ]$ Y" a+ E7 r9 f  _7 e用途和访问权限:1 }& c' _0 J( w5 t
R0~R7:USR(用户模式)、fiq(快速中断模式)、irq(中断模式)、svc(超级用法模式)、abt、und
. T, D+ ~+ C" L; P. \) r: {1 UR8~R12:R8_usr~R12_usr(usr,irq,svc,abt,und)* S$ E7 V1 {# L! X6 ]
R8_fiq~R12_fiq(fiq)
# [$ J9 S5 K0 g5 n( H6 wR11=fp  m" W# G/ O8 ?9 U
R12=IP(从反汇编上看,fp和ip一般用于存放SP的值)0 T5 r0 j5 r% B
R13~R14:R13_usr R14_usr(每种模式都有自己的寄存器)
# K+ ?) v6 b0 ^SP ~lr :R13_fiq R14_fiq
  X1 x2 w. T7 q5 Z- nR13_irq R14_irq7 j1 ^" ^4 E8 I  U
R13_svc R14_svc
. v) A: L& e1 ~R13_abt R14_abt# L; x9 s4 V! t2 a$ ]. S, m
R13_und R14_und1 ~* Q; x* ^+ G% s; }0 R4 W5 @
R15(PC):都可以访问(即PC的值为当前指令的地址值加8个字节), H8 R5 R8 V1 D) ]) Z: @
R16 :((Current Program Status Register,当前程序状态寄存器))- ^* |$ G; a/ V1 Z2 \
SPSR _fiq,SPSR_irq,SPSR_abt,SPSR_und(USR模式没有)
, d% l7 x  M0 f5 t9 X& p( m# r+ a. q2 V
5 Y  E) {0 W$ J; H

, Q' l: C, e/ w7 w3 k6 o. X#if defined(CONFIG_AT91RM9200EK)
% @0 k: @+ r' M- ~
, A/ Y5 \; `4 B8 V/ c0 G
) L% |% J9 }$ M9 P7 a8 \, i) Y) u& @$ o
#else
& [. w8 D) t3 M5 Wbl lowlevel_init4 t. v' X: F% d
+ ?! N9 B1 Q& t  [
@在重定向代码之前,必须初始化内存时序,因为重定向时需要将@flash中的代码复制到内存中lowlevel_init在@/board/smdk2410/lowlevel_init.S中。  x& Q8 `# ?/ K, {$ y/ b$ W

2 K$ u, {: V& T" R8 ? - B; U' U" v/ S. k4 |+ U) O
/ L1 t) s% S8 [* N# _
#endif) ^6 q, Y* [3 x
mov lr, ip+ ]4 q; @3 b5 Q
mov pc, lr1 M5 u: p: U( r7 o# J( ?& C# r8 |
@返回到主程序- j) x/ e% N  h3 Z$ \; m# t9 v( \/ a

2 b' ]' W+ A+ F/ U) i; r ) a9 g6 l2 l! \4 }0 M) x8 }0 @

5 c: e5 C6 y+ o4 N  Y6 n#endif7 e/ v6 v2 m* w$ `' ]' b* c
4 c; U8 o/ [5 l1 M6 j

2 K7 x" N% ^, |+ n& {
! H" B7 s8 q" v# h) g
0 [1 M2 _1 m; K) ^: ^9 i@这段没有看明白,不过好像跟移植关系不是很大,先放一放。
5 X2 @; e8 Q$ s: U@: ^- N/ g. r2 |) Y% U: \8 ?6 I% K1 \1 J
@ IRQ stack frame.. t  `# m) N& @3 \/ E* I9 |1 |9 m6 B9 d
@8 F2 P: R( d! k  h, b+ r4 ?; x
#define S_FRAME_SIZE 72
; Y& a& {  T7 v7 D1 _/ w( x" M$ r% ?6 E" g2 T

4 ]$ c, g7 g7 X0 p" ?3 i% O
" N& n: f# `: _9 K8 ?#define S_OLD_R0 68
  M1 B+ J, G3 r5 U" j5 L2 r( U#define S_PSR 648 `0 p2 r: A$ k: V: Q$ c
#define S_PC 60
: A7 i$ W: z, n* z6 H% d) E#define S_LR 56
# [; L$ T* O4 _5 N8 G#define S_SP 52( Q3 j) _. B4 ~' {  T* F/ R

3 `% w" K: P$ a9 B/ Y' s ! S6 |6 C4 O# A& D) {2 A4 j
4 P( L1 h. h2 a+ n' f
#define S_IP 48& {' p7 F' A, `% q2 ]8 `/ H
#define S_FP 44
  Q4 F+ I9 s; D4 E9 T" `#define S_R10 40
4 g. E4 }6 N* x( o#define S_R9 36
9 Y, s' T3 D, N: f: d+ |" N; j+ ~#define S_R8 322 C- g7 N" Z8 S; \
#define S_R7 280 f0 Q8 s, a- V1 ]
#define S_R6 242 J; I" X3 u0 k/ P2 B$ N
#define S_R5 20
6 }& A' p+ r! V8 x6 i" m) j9 r#define S_R4 16
, {+ P- g1 e' D* L% C& B#define S_R3 12' A: A0 _8 J; m; T3 M, _- K) @) \$ [
#define S_R2 8
) b: N2 R0 U0 u/ a+ J- o  x4 f#define S_R1 4
, a. S, R/ C1 Z7 Z4 a  T4 \#define S_R0 01 x7 h1 \4 P! h/ s% e1 @! \' C3 K
7 W  j) _$ s; Z* n7 i$ \
% h7 G  X' D- ~& b

+ K; R4 C: M7 X: d$ \. o; b#define MODE_SVC 0x13( q: ?7 _1 ?( s  Z) T" y0 h
#define I_BIT 0x80
# W$ s2 [! M4 p$ u
, d) x, ~9 v) h% n/ Z& U6 \2 r) v
9 V- X4 e/ N% @% L& t4 ~6 A2 `# H: n5 M; W
( |) |; H0 Q4 a- u4 m) i

9 Z7 @9 u3 i# F' T/ u3 b
8 Z$ x' r& F$ _) W# i- J8 V
( A" R. J" B" i" [0 O6 V, a.macro bad_save_user_regs( a* ^; \! i  o" S4 s9 U& E$ H
sub sp, sp, #S_FRAME_SIZE8 C* ]/ _+ _. k- ~
stmia sp, {r0 - r12} @ Calling r0-r126 H  G( f0 C! {) c) d8 `4 J
ldr r2, _armboot_start) }# _# ~/ E  p) P
sub r2, r2, #(CONFIG_STACKSIZE)
# ~; D) \9 r3 w& k# ]6 usub r2, r2, #(CONFIG_SYS_MALLOC_LEN)
7 m" t5 ~5 O8 o+ G; o* ]sub r2, r2, #(CONFIG_SYS_GBL_DATA_SIZE+8) @ set base 2 words into abort stack% I; n( k# }; ~5 y2 w
ldmia r2, {r2 - r3} @ get pc, cpsr. W, |8 y" l- J7 W* P. Q
add r0, sp, #S_FRAME_SIZE @ restore sp_SVC
. P/ @. {2 D: a- T) \) a) I9 d2 t- M( W$ n& g
9 m: M0 V4 R5 j, D7 v2 n1 u) C

4 K" h, _. q( v) X4 b6 Badd r5, sp, #S_SP
) d  m. p5 W  p) b7 M2 `9 Xmov r1, lr
5 b: l2 z& H( Z3 a3 m9 @3 H6 zstmia r5, {r0 - r3} @ save sp_SVC, lr_SVC, pc, cpsr
" f0 e1 O% M$ |8 f* P; t- Vmov r0, sp( ?5 s4 J% b; ]/ x) E1 q, d
.endm7 _! ~8 @% _( }5 g% i
9 ^6 K! ~5 D9 v- P/ E

! h+ B3 L  R, N% h6 V/ Q% h: u7 P5 I$ a
.macro irq_save_user_regs
" L- H  U( l5 p! m/ u( n; |- bsub sp, sp, #S_FRAME_SIZE; ], L" T% V$ j) i, b; `5 `7 A( {
stmia sp, {r0 - r12} @ Calling r0-r12
: g8 H- }* x7 N( g7 \7 D! `7 n+ V* eadd r7, sp, #S_PC" R& Y+ L4 G5 p* a1 E% c! p% q4 c
stmdb r7, {sp, lr}^ @ Calling SP, LR
. N8 {/ Z& D+ ^+ Kstr lr, [r7, #0] @ Save calling PC5 K0 |0 V9 A6 h( ~5 P; P* B
mrs r6, spsr- V- l' t% j# Y
str r6, [r7, #4] @ Save CPSR2 E( z! `0 a+ v: y3 P' I4 |$ h
str r0, [r7, #8] @ Save OLD_R0( U0 d5 i" k" \. P
mov r0, sp9 J* b2 X9 R  |2 ?9 @
.endm) u+ }; b# }" ?8 O0 @8 ?
& t; G9 o3 m5 _( L) d. Z0 }- T

, h8 V& f! \$ s* }$ \* K5 V6 a
5 p  e$ Y9 k* d! Y6 f& j+ s8 p( a.macro irq_restore_user_regs' A. X: R% E- S8 F7 }" {; H$ Y9 f
ldmia sp, {r0 - lr}^ @ Calling r0 - lr8 }1 i- C" h. n6 r+ M; B) G4 ?
mov r0, r0
5 o# p: X  r- d3 P4 Z: Aldr lr, [sp, #S_PC] @ Get PC
# t/ X7 M: |) madd sp, sp, #S_FRAME_SIZE
& A8 r) L9 T3 p  c, U, |subs pc, lr, #4 @ return & move spsr_svc into cpsr7 k6 P$ F( o. N- O# b
.endm/ ^6 Z& V& l3 Z- V: x7 z

  y0 q1 |& [+ _5 o- Y 3 I6 w2 k% N4 _' `: l

; s0 r+ W/ N' J.macro get_bad_stack
2 X  f, K; `  m8 l5 z8 ~# Gldr r13, _armboot_start @ setup our mode stack
; g1 A8 i5 C4 {sub r13, r13, #(CONFIG_STACKSIZE), L( L  d; ~! p$ P
sub r13, r13, #(CONFIG_SYS_MALLOC_LEN)
5 K. Y$ Q/ t) \; ^. E, j( zsub r13, r13, #(CONFIG_SYS_GBL_DATA_SIZE+8) @ reserved a couple spots in abort stack5 U7 `7 \% S8 H$ A3 g4 ?9 N# c0 d8 Q

- h- ]' l, _# k- t) Q
" e3 I4 W% r, n% U
1 T3 O! I, q# w3 Gstr lr, [r13] @ save caller lr / spsr
/ H: z  }4 X& F/ Nmrs lr, spsr; k2 h  X3 _% {. i
str lr, [r13, #4]( ^: _$ f1 J5 g0 p& Z
. K1 i) o3 e6 S
! \- h: `# N* @- Y0 a# X

, d  S) _* U( W1 x6 \, ^mov r13, #MODE_SVC @ prepare SVC-Mode
% \) x) i- {6 k- @6 I: o7 F+ u@ msr spsr_c, r13# k5 C' c) f* |6 c3 M1 a
msr spsr, r13
9 d+ p: d5 B- G8 W' Imov lr, pc; _' p# w$ Y7 X# [- J9 l- s
movs pc, lr
7 L. |4 y: V5 O6 L7 w.endm
, D7 H: R1 B1 l" {3 j
  ^2 p/ _& f; v3 B # U# `  v: j! K/ m1 C4 T9 Q1 m

5 s8 L0 w6 \3 G4 T4 h3 z6 ]& M; l.macro get_irq_stack @ setup IRQ stack
) n) B3 Z& Q0 }# cldr sp, IRQ_STACK_START2 `$ u0 r* P2 h1 m3 k
.endm
8 h; M7 l% N( v
# N" w: Q7 K, e
( ]( V& U( J' L* l# u" ~
! F, X- d+ q9 \! S.macro get_fiq_stack @ setup FIQ stack- L4 V7 T0 [. V6 M0 p4 C$ T% p8 L
ldr sp, FIQ_STACK_START
9 O- J5 j9 I  [+ h.endm
* M+ t8 V$ w- ]# B
, ?( X8 S3 `! L& B ' k, j0 E3 b* {4 L8 Z  _

, ~3 Z$ \4 R# u. O! ?1 [' O0 g/ Y
3 W6 v- n2 O$ u! O- k@异常向量处理
# w3 Q% r- g9 C  s@每一个异常向量处其实只放了一条跳转指令(因为每个异常向量只 @有4个字节不能放太多的程序),跳到相应的异常处理程序中。
( B) f6 \, w  C+ Y$ N.align 5
8 @6 }$ g" S" Kundefined_instruction:' h1 m9 f! V$ |. V; m
get_bad_stack
! N) K9 G% V4 \( wbad_save_user_regs/ b0 L, N  p- b% I5 Q/ ~$ V
bl do_undefined_instruction" F; q  y* S- }. Y* K" O

- Q$ ]5 s; E( k; t" S0 V ! v0 H$ S$ ~+ [3 D0 T; i
1 Z" j  `% n% C. O9 q
.align 5! O0 u" T# w) Z% ?% Z
software_interrupt:
1 {2 `, @. `6 h* m: X; t5 Xget_bad_stack
/ Q2 F1 R0 v$ V& Jbad_save_user_regs" \5 B1 U1 q* s3 a/ u
bl do_software_interrupt
8 @( @5 P! H' ?! }5 A3 G7 n0 }0 }  n, ~" i5 v) w! c" D

# O5 E" D9 g# D1 N1 l
8 Z. [3 P6 ]6 B6 r.align 5, m) |4 |/ I% A7 U- n' o
prefetch_abort:
' ]" @: k* V! @% B& `get_bad_stack; e4 R5 P7 Z: q
bad_save_user_regs
" w, p0 s6 K/ d. s% Y( [bl do_prefetch_abort
! E# Z1 q' z7 c- o& V
$ Q/ e' r8 |8 [) u7 F, O   v, @! x% \7 c, e/ ~

5 @! B# A; g$ \9 Z1 j3 K.align 55 a1 r  d- {- o$ |. K9 ~8 b$ M
data_abort:
& h' x7 O6 w5 g4 w, L; W& hget_bad_stack, p/ u- K& y, e
bad_save_user_regs/ D0 `* C8 w3 @  e
bl do_data_abort- l+ ~2 h- p$ ]5 H
- {1 h/ X# H& Z# V

; u, x( l* ^0 d" g) L
; k  W% j+ q8 B/ W4 E.align 5
+ A1 H8 f; M* Y8 onot_used:  u' i# {, `/ l3 j' o7 k' u- o
get_bad_stack- ?6 E5 q9 W% f! B' \" L6 c
bad_save_user_regs
4 a6 ?1 K  n  ibl do_not_used  H4 c, _7 [( N% }6 t+ |
$ ?; M6 j( }5 u
. O8 k7 J3 l$ z: \/ I6 W! J
, M+ O7 W/ w/ W; G0 a. ]
#ifdef CONFIG_USE_IRQ
  c1 Z3 N5 c! t7 T1 m0 k8 S
( r6 Y( J4 t) f( _5 U + h$ u8 |1 t9 M* j
8 @! P! b$ E% _9 [; B+ K2 V6 Y+ I
.align 5
: a. P- {6 I) H) pirq:
: w/ b& b- w+ j4 ]: P2 Wget_irq_stack
" j- c8 ~5 K% u2 Y: Xirq_save_user_regs! t2 G* R' A. \4 m1 n6 I6 ?
bl do_irq$ e' s* o; g: E' U, C. p
irq_restore_user_regs9 }+ }5 s. g+ S4 w+ f7 u+ l, e; q
" R( @$ Z% n8 T# A
( c2 x+ m5 J) T6 R! d( W

' `8 q# h& y. h, W+ X.align 5
& x$ @4 g: a( ^3 G/ m4 Wfiq:
/ R% J1 g9 K  ^5 e$ Iget_fiq_stack
& o& z9 k' F7 [/ S' I' B  \# `4 ?* y- k! `2 [
irq_save_user_regs5 y0 `# p) A2 c2 f, V$ ]( a
bl do_fiq
% \8 G% L; E# a( E2 d! t- f, Wirq_restore_user_regs
5 S% H; E% c( B3 s. Q' a8 C& w/ @2 W6 l! v/ V3 O* q

  q) j8 f, E  n. K5 ?: _) [0 i+ Q, \( V; g# N
#else
( P+ G+ X, u0 I+ U5 o. `2 ~/ G0 {
" {  v; P' q) K7 Q* a
# ?+ r4 y$ o2 O: J! C6 h
.align 5
& z% a) Q- A( S0 }/ i4 cirq:
3 r; i8 r" v3 X3 sget_bad_stack) l4 A9 J7 s& _8 a: ^
bad_save_user_regs; t3 ]9 r, n6 Z
bl do_irq$ x, \0 |6 g' `4 G" o

, n( ~3 h2 ~7 x7 [# O$ Y3 H, @
$ [9 c9 _- U5 P& V# Z- g* y# `7 s, `
.align 5
- E2 O! f* [6 t# W% xfiq:; d/ {+ M( A( S0 \; Q) _
get_bad_stack
2 r# `7 p4 Y$ l) G$ n" sbad_save_user_regs* w# @4 g& [6 S! R
bl do_fiq
4 v3 v5 B; l; D
6 X7 b3 n+ H# U. i) z3 n0 J2 v' B% T
( m; W) y9 L3 [+ G# h* O% X4 ?8 I( ^( m; c6 T  `9 B
#endif   i9 B, ^% t! Q1 j
@可知start.S的流程为:异常向量——上电复位后进入复位异常向量——跳到启动代码处——设置处理器进入管理模式——关闭看门狗——关闭中断——设置时钟分频——关闭MMU和CACHE——进入lowlever_init.S——检查当前代码所处的位置,如果在FLASH中就将代码搬移到RAM中
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 21:21 , Processed in 0.156250 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表