TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
* I' m( S/ I2 x% r. q0 H上节我们修改了适合自己开发板的 u-boot 代码,调试成功后我们就要固化我们的代码到 flash 上,我板子上的是 nor flash 在 u-boot 上的信息是:
7 K4 y8 i8 N2 ~
* e6 R! u8 ?; d2 L: O
( E8 r/ ~6 W" W
+ s- q+ n: c4 w6 ^
这表明基本上flash是调通了,然后按照下载代码的流程将u-boot下载到SDRAM中先,然后再把SDRAM中u-boot程序代码复制到flash中,其中用到几个命令,flinfo,erase,cp,protect······
& U$ j" v3 U; V, n& L
8 c, _$ } O$ a* M 首先,我们将整片flash擦除干净,看看u-boot的erase命令如何用:7 U' V8 a. W9 R1 f+ H
, s0 c8 t4 n5 n- A& G
' z. y( S+ O: z/ w
$ H7 h# E. u7 X/ O 直接地,erase all即可
, _" }% _) H* x" H `- Y( w5 S' D# ?5 p( a; \* r8 F
然后,我们下载u-boot主程序时的地址是0x100开始执行的,看看0x100处的代码都是什么。
* L- `7 k: q/ d7 B8 e. M% U& y: B; n; s
1 z8 p# g9 m# b1 b |9 B9 b3 \" r
- R1 [8 m0 ]4 B d2 g6 D; |- c 这些就是复位向量的二进制启动代码( t: U3 H2 E/ M9 d1 g, m
6 b' p" J" F. b1 H 好,接下去- |5 v, H. d9 U. ?9 S; C: E1 v& f
0 K& u/ n$ P( T7 s8 k 我们要把flash芯片的写保护给去掉" c+ e- W+ `$ m, U, t- P7 }
* L/ O$ ~5 g2 }
. u, x( [/ D0 r. q v% t7 h; ~* C: z' u
也是直接地,protect off all 即可
1 N' t2 ~+ ]' p" ?4 u3 V; D, J7 Z2 ]
再然后,就是要把在SDRAM的u-boot主程序给copy到flash上面了,现在回到之前一节我们修改的u-boot代码,可以把关于flash有关的选项打开了。
8 @0 s6 h. v# X+ a: T4 | ^) x, n/ v: B" i3 F+ ?
首先是异常向量的relocate
$ {0 y* {# F) e6 v" R- W; S; k/ Z& ]. N5 u
: G L4 N, F" e6 j3 S5 ^1 a
+ U2 r0 p* `; N 然后就是u-boot环境变量的存放位置,由之前的SDRAM换成flash
x# X& n) b6 o* R+ q$ t- F( [. T+ e" r+ t* \+ d9 E
3 {5 m @) s& ^- s" J9 M2 a- p0 x' n% z D
好,妥妥的,重新编译,下载到板子的SDRAM2 Z2 C5 P" N7 J. z2 i; F2 X
; G+ ]! r2 J9 w8 M( S 然后,解除flash的写保护,protect off all
6 s( N5 w% E1 l2 H2 w9 c, M+ T
6 |+ l' a+ S% v* U 接着,擦除flash的所有数据,erase all# Q$ n( F0 \8 q
& K" _8 a$ }; l& M; R# v 再来,看看flash的信息,flinfo,得到应该是所有的sections都没有RO标志
8 z: p, p) b0 S9 R) F6 D% i
5 X. x7 H) ]+ G* _1 ~1 L n0 ?) N 再再然后,就是复制SDRAM的代码到flash上面了,用的是cp命令,这里注意一下了,由于我的板子的nor flash是16bits的,所以使用cp命令的时候要以half-word的形式复制,如果flash的8bits的话就要以byte的形式复制,32bits就word的形式啦。0 [/ X7 r* K8 O0 M( j% ~0 z- M
4 `. b" _3 |% [2 E+ I) ? 然后在编译u-boot的源码目录下打开u-boot.lds、System.map、u-boot.map5 M. e4 {, u" L2 |: M3 Y
2 B& f# w2 ]0 m \
9 E7 e. @! o R2 E. R( m
/ K2 Q7 {# f _. Q8 S; H2 }
看看u-boot是如何存放段信息的,然后编译出来的u-boot.bin
O! P, {9 @' `$ x9 B. k- ~* y
( D7 i& L# @# N+ i- W* a8 r8 H! ~1 d: r1 Y' u& H' l
只有186K,按照我板子的芯片来说
' f0 ^0 T0 s0 M: g/ Q! ?7 O
4 d, \0 p% C$ o6 u0 b0 x3 x
, F: J6 g0 I* ~7 f3 r( X' v
. T# w) Y/ a" z; g: I( D/ a# d
8M,64sections的话前4个sections存放足够了,然后第5个存放环境变量,这也是在编写/include/configs/******.h自身开发板时头文件定义的环境变量位置。
" X4 Y' L' c! x8 X5 H4 m
' J; g% B- [! C8 g- F8 j
`, I: A7 l0 K( R; L; n6 Q% R6 ?# Z4 g% |& ~" @
165行定义的是环境变量偏移量,170行就是用4个sections存放u-boot代码。
1 M* b' d5 q( y+ D' g2 e3 S3 M+ X8 D4 [
OK,现在就用u-boot的cp命令copy从SDRAM到flash复制代码了,u-boot的cp命令如下:8 v* H F# r7 G4 d1 c
/ n6 @3 ?9 J3 s# [) \; \+ D9 ~$ d
, v2 _! B1 W. z- c& F: |5 X7 h1 T8 A+ ?3 ^
由于我的flash位宽是16bits,所以用cp.w每half-word地复制,然后是4个sections,起始地址0xf0000000,结束地址0xf007ffff,范围是0x7ffff4 O: ?5 E! u2 S3 N8 Q4 ~, b8 S
: [9 v' S- D8 a9 J
2 |3 i2 o/ S% v# t. S; P
0 p2 Z8 j9 O2 u 所以,命令是cp.w 0x0 0xf0000000 0x7ffff
2 j+ c( }! |& g! \6 B$ h/ U: F6 b# `. M, y7 e
- i" i6 T" V9 t6 f* ^
9 o. w( D8 _8 u' t. c' O4 Q
完了之后reset开发板就可以看到u-boot启动信息了。, B9 [2 g& U* r( E( J2 Q4 e
2 u4 ]8 f7 P3 O G 上次移植u-boot的后半段就码到这里了。改天把在u-boot起来之后将download linux image的步骤贴上来 |
|