EDA365电子论坛网

标题: linux学习之路_or1200移植linux [打印本页]

作者: mutougeda    时间: 2021-7-8 11:18
标题: linux学习之路_or1200移植linux
* H6 t' y7 F: W% T- [, t
上节我们修改了适合自己开发板的 u-boot 代码,调试成功后我们就要固化我们的代码到 flash 上,我板子上的是 nor flash 在 u-boot 上的信息是:
  @+ k; |7 `6 ~
  e8 l, I4 y' M/ q6 | 2 W3 c3 s* a) n
( p( V% N* M: I' D! p
        这表明基本上flash是调通了,然后按照下载代码的流程将u-boot下载到SDRAM中先,然后再把SDRAM中u-boot程序代码复制到flash中,其中用到几个命令,flinfo,erase,cp,protect······
  C) I& a: ^1 _, D# ~9 t9 B& k0 m' w
  A- m* n7 P2 q. \" g% z$ F        首先,我们将整片flash擦除干净,看看u-boot的erase命令如何用:# ~; D: b. _7 u9 N; |

7 }* U; p; V8 _5 g0 C4 a5 f" h
+ U9 s! ]0 X3 L: d
  c9 k8 F) E/ X        直接地,erase all即可
8 j  @3 w+ e  \4 T4 M1 Q
; R- I' F; o2 a        然后,我们下载u-boot主程序时的地址是0x100开始执行的,看看0x100处的代码都是什么。, g! _( b4 ?* p, m7 d  F
: P( P. X+ `! n" l3 I' k

4 A: U3 [" p) k/ O
5 M% ^. h: m5 G" y! u& N9 R% k        这些就是复位向量的二进制启动代码$ C; [! Q# Y9 Q- D: g0 r; d

( u: g" l& O) r* {        好,接下去2 z  u' H: c3 b* i1 O

' t9 }0 i. Q  K( e        我们要把flash芯片的写保护给去掉
* Z# J+ |9 C$ Q) V! t& w
$ }5 c( z, p0 N! {$ Z& T / W& n) W1 d' T6 s3 C, n& X

- \7 d, U) ~& w/ m( D9 [* w        也是直接地,protect off all 即可% u7 r* e- c& |6 m0 ^3 X& W

0 i3 u9 f% s( @        再然后,就是要把在SDRAM的u-boot主程序给copy到flash上面了,现在回到之前一节我们修改的u-boot代码,可以把关于flash有关的选项打开了。  ^0 i4 T' O5 Y: t+ L6 V" v3 D9 p
3 r; A! ]8 K/ S$ n3 |# D+ y$ C
        首先是异常向量的relocate
7 {: W. R6 Z4 i: t6 ?# `; I' u" x8 L8 W% d' _
# F: U1 u, U0 C( c* `

: E9 }$ Z# [/ V6 V1 n, {        然后就是u-boot环境变量的存放位置,由之前的SDRAM换成flash5 E9 \1 r2 B/ \, h
$ ], k& `, y8 z; e1 W- n# w
; [! l& X( x- g- S6 c6 k
+ ~# E( U5 I7 B2 u2 Q
        好,妥妥的,重新编译,下载到板子的SDRAM
/ v/ _  Q0 R: N% V
3 F; A  h- d6 c; \        然后,解除flash的写保护,protect off all) J( n% K5 a$ A, W6 w
$ h" Q: a* I- }- N" N; c- p  |6 i- I
        接着,擦除flash的所有数据,erase all
- m! D) ?: O1 B& y$ M+ G+ x9 s7 j' Z' z9 S3 K$ W
        再来,看看flash的信息,flinfo,得到应该是所有的sections都没有RO标志' I0 b: n$ H7 M' m
+ ]; `4 S: N( y9 K$ v
        再再然后,就是复制SDRAM的代码到flash上面了,用的是cp命令,这里注意一下了,由于我的板子的nor flash是16bits的,所以使用cp命令的时候要以half-word的形式复制,如果flash的8bits的话就要以byte的形式复制,32bits就word的形式啦。
" \- M0 e. s& t& F3 r  j2 _  g7 n5 }. o4 v) N  E) _2 \6 A' m5 F
        然后在编译u-boot的源码目录下打开u-boot.lds、System.map、u-boot.map' Q! R0 R' R% ]7 Y. u) I

" O5 Z! \- V( i, F2 p  d' |# E 1 g& z/ C& N. i) {4 Q, r' K2 T7 H
* E; u: ?9 w7 k- J$ M2 y! u
        看看u-boot是如何存放段信息的,然后编译出来的u-boot.bin) x+ b  ?- D# c2 r2 a
: {7 f9 {8 k2 B$ g' i% O; g

6 ^7 ~; Y7 D& c/ @
# [7 B  o1 V' ]0 W, J        只有186K,按照我板子的芯片来说
2 Z2 S) V4 g1 a0 N2 D' ]4 ]& V, y& m! k

* o* S9 k* l6 ^: z7 x1 b" T$ J2 O) m( o  p
        8M,64sections的话前4个sections存放足够了,然后第5个存放环境变量,这也是在编写/include/configs/******.h自身开发板时头文件定义的环境变量位置。
4 J' j$ e% ~1 N2 d/ }+ {8 Y* Y: S2 z1 ?+ O: d6 s
4 u5 C- y' V& o0 J& L) B

8 H) k) J: b! U* i7 h        165行定义的是环境变量偏移量,170行就是用4个sections存放u-boot代码。
0 Z, ~8 G' ~2 |) s. g2 F) {0 U, L0 y& l0 ~$ B
        OK,现在就用u-boot的cp命令copy从SDRAM到flash复制代码了,u-boot的cp命令如下:- k& G8 Z4 K' Y4 _+ j, x' |

3 ?  O, V" O& N
/ S/ G; c% c1 u' _$ Y
( r$ w6 w* q& Q9 u6 Y        由于我的flash位宽是16bits,所以用cp.w每half-word地复制,然后是4个sections,起始地址0xf0000000,结束地址0xf007ffff,范围是0x7ffff
5 _4 g2 i- o5 g) j0 c* P9 e3 n0 R* A7 W# k9 y1 h

: [# q! X% b& d+ R$ b: Q
7 b7 E& t3 y3 L& J& Z2 j: N        所以,命令是cp.w 0x0 0xf0000000 0x7ffff
' r- c  t  z8 t5 ?7 T' Q0 W$ l& Z

* E6 s4 g1 a" a8 o: ?& N% D& f0 o- s8 A' k
        完了之后reset开发板就可以看到u-boot启动信息了。/ P9 A  H! R( {+ k, U! T; T
) |' {: w* C& j
        上次移植u-boot的后半段就码到这里了。改天把在u-boot起来之后将download linux image的步骤贴上来
作者: younicp    时间: 2021-7-8 13:30
or1200移植linux
作者: NingW    时间: 2021-7-8 13:54
linux学习之路_or1200移植linux
作者: uerriup    时间: 2021-7-8 13:55
_or1200移植linux




欢迎光临 EDA365电子论坛网 (https://bbs.eda365.com/) Powered by Discuz! X3.2