EDA365电子论坛网

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

作者: mutougeda    时间: 2021-6-1 10:31
标题: linux学习之路_or1200移植u-boot

/ L; b6 G/ v/ p# X, N0 v现在搭建好 SOC ,可以的话可以先练习编写一下“裸机”代码测试一下 ipcores ,就当做是提高操作 C 的能力咯,那这次我们来根据自己的 SOC 移植 u-boot 上去。
6 |- z, _3 E; m
2 r: m' X3 b. |% j        至于移植比较详细的解释,我google下《ARM79出品-u-boot移植手册.pdf》这个手册,虽说里面讲的是关于ARM架构的移植,不要紧,我们只是借鉴一下,但重点关注的是openrisc结构的移植。) B" {/ P( \) }, _" V* S# H
* p6 b1 r& c+ B% T( _. C. o

- H5 W3 w; Q; n4 A/ Z! d / l' G3 ?6 N0 G$ B9 s7 O2 [7 S
4 n* Y  H3 m+ K, o3 U# ?, k/ Q7 ]
        将u-boot-master.tar.gz下载下来。
2 {8 {1 t9 k5 ?' N7 q8 W$ z& B) W9 N  S8 s- c; u
3 a6 y- n4 Y4 M) M  p

7 ]+ n- r( x2 m" e/ o; ?8 r        打开opencores关于u-boot移植的步骤。
7 k; S; Q8 P' o: M# i0 W5 L* S" i; v8 A8 g# S$ K% u6 a

$ {) y$ P7 Q- q% E0 p& ^( i7 p1 ?9 i
6 X- x' m+ d5 T6 O; y
/ k7 X6 ~0 r8 ?# r        并且u-boot源码目录下的RENAME文件中也有关于编译u-boot的步骤,主要是根据自己的板子添加必要源码文件和开启所需要的u-boot命令的宏定义。3 h) }" F4 C7 M* M2 x7 X7 |4 m
& U3 H% _/ j2 R) x8 t! p: u* y
" ]9 h% Q, @. t9 V/ E5 ~

: {7 V/ O; K) c* z( _3 U, Y
- x# M4 }) U4 A        解压u-boot源码,目录arch/openrisc、include、common先导入sourceinsight中,然后打开根目录的boards.cfg文件,可以看到该u-boot下有几个关于现成的板子的移植工程。/ m! {5 ?' f3 z/ f) N/ X7 P: J
9 l; I5 O# G+ x% i+ I4 w& Q

) Y  f* R7 ?) b) T
6 ~3 ?  y: X" m4 c: A9 K        在board目录下可以找到,都导入到sourceinsight中,这样可以作为自己的板子的移植参考。
' E; w. F, S" U- k( s. l# j9 O/ m& C7 l( X

# s3 L8 P  o' D# _( t+ i+ E
4 I7 `% h$ w! D  N& R        好,准备妥当之后就开始根据u-boot的RENAME文件中介绍的流程走。- d) q5 \0 `+ D6 n% r

* I3 S$ z; g4 K7 d        1.在源码目录中的boards.cfg文件中加入自己开发板的名字,比如我自己增加的是EP2C20F484C8。
0 T' V5 _4 g! h+ R. P, X
# \6 }+ B# b9 L& N. _ 6 R3 r0 ~7 ]6 W1 _

7 p; Q2 t9 `' r% Z- b& M  S8 P* H$ V
        2.在/board目录下增加刚才在boards.cfg新建板子名称对应的文件夹,比如我在/board目录下增加EP2C20F484C8。6 {0 e! A! I6 Y  D. N+ x. ^3 S# ~

' S, ]/ H* O7 y$ i2 K# I! e  {- N   z# e1 z5 p) u. @" [" x: j
" D9 i! x! Y3 ?9 \
4 t+ K& M: E) D8 K; e9 r
        参考在/board目录下的openrisc文件夹,我们把原有通用的openrisc架构的复制到自己刚才新建的文件夹,我复制到的是EP2C20F484C8。0 v1 S4 e2 ?" J

$ k! Q8 M; a6 Y 2 a' t" x/ `& I9 L  _- K' e& ^

, k) {3 z5 t! j* t0 O3 Z0 H8 r! x/ `. d$ q! V
        修改成自己所选择的开发板的名称
% b1 D6 U0 M$ L5 e2 V4 B$ j: I  z9 b8 r7 g' P+ \( h# s0 |
5 ~; ?3 b, t  g/ l; `8 ?* j

7 ~3 M' M7 x' `7 c( o! Q9 U2 c& A
5 Y* h$ ~1 ^# Z+ P8 Z        然后,打开u-boot.lds,这是u-boot的连接脚本文件,对比一下/board/openrisc中的u-boot.lds,修改如下:
, J& b. G! [! C; G+ q, b
/ K. I! t, F8 F+ r7 V3 I3 z& M
! m5 [+ {& _: n/ f3 @- d  C
5 ?/ T2 j% |3 ?0 ~. s9 A) f5 \/ _0 T. ~$ B/ E/ r. S) {4 `+ X- @% h
        与前一篇中的连接文件link.lds很相似,至于u-boot.lds中的vectors和ram段的起始地址和长度都在第3步中的******.h头文件中定义,这个头文件稍后再分析。
' p% h  U5 M6 f4 Y  {7 i& }$ S. l, O4 Q
        打开ep2c20f484c8.c,因为我板子上的网卡是dm9000,所以对这个文件中修改如下:
8 i6 i4 d% i3 V6 y9 V
# H, l1 K4 z+ z" e2 ^- P 6 F- H' q  Q- i. Z% y. X

6 ^5 Z% P1 B* r3 P9 Y/ T        用u-boot自带的dm9000驱动增加对网卡的支持) P/ f: u; w2 o5 k

2 r, p1 ~+ p9 }; Q3 s
6 ^5 D; f7 V  ~! X) W
# Z$ z% i; i4 N1 i        3.在include/configs/添加板子名称的******.h头文件,比如我自己添加的是EP2C20F484C8.h3 G  k; {3 a. o2 K- Y$ M. c; N
( j  r- x# U( a

$ p) i$ f3 M6 D! Q: u* @+ w  i5 H/ O, r/ T1 W9 P4 d9 }) p- A

: i& u9 o& M6 k1 @8 J        然后,在\include\configs打开所有关于openrisc架构开发板的******.h头文件,在第1步中的board.cfg文件中关于openrisc结构对应的相同名称的******.h头文件都可以在\include\configs找到,参考现有的工程配置来得到我自己开发板的ep2c20f484c8.h的配置内容。1 n" q& p7 ]( X7 `, b& u3 Y

6 Q& K7 B# _2 t( w# V        一步步看: @  B8 S9 K7 E8 i0 ?- ?

% E0 b$ ^: y# G* G6 ^" e" e# j
9 X" g2 @# u1 c# [
0 h- d! c; v. Q! T; r" p1 V        看定义名称就知道了,定义工作频率CLK_FREQ是40M,板子速度问题,上不去了,然后是复位地址RESET_ADDR是0x100,SDRAM在wishbone中定义的地址,具体参考《or1200硬件环境搭建》一章,大小就是自己RAM的大小了。! W' A( m5 ^: u+ p+ I$ O

4 P# L/ j9 |0 m" S* h5 i9 P3 _        然后就是关于UART的描述,地址0x9000000,频率40M,波特率38400,有牛B的板子可以自行设置高的波特率115200什么的,小弟的小板38400在linux用z-modem模式才无错传输,伤不起。% ?9 t, D/ z9 Z/ w- ?5 y9 r' k
; }, s- C% |, r( b7 `+ W
        接下来板子名字,随意啦。
7 p( q# o! v5 S; \8 f; ^5 q. w% I
2 b( Q# T; T9 |7 G; n
$ k( `/ z6 q8 h  m        接着看就是关于FLASH的宏定义选项
) ^. N8 B  d+ f0 j* I
4 U) M5 S  }1 \ 1 b6 l* `0 t& ?  G2 e" N  D
- N! Q) X# k! J9 R
        我板子的芯片是型号JS28F640J3D75,1片64sections的nor flash,所以宏定义,有啦,下面53、54行是用u-boot自带的CFI驱动来驱动flash,然后,位宽根据板子设置,我的nor flash是16bits的,再往下就是读、写、擦除flash操作的时序,差不多就可以了,根据自己板子的速度,可以自行设大或小点。
8 g: @9 h: ^5 h  k' w( `" m" h# D1 H/ I# @5 b1 x2 f

1 }: d* ^, C& Y" h- w, P2 Q( Y& x2 |6 l0 Z
        往下看' d: k1 \  y$ s- `. P6 E

- w- c5 }! [1 J5 Z' v
% K7 p5 \, U$ G4 O% j! B3 T# k. g. d8 a. _
        在刚开始调试u-boot的时候先把65行注释掉,因为刚开始跳我们直接把u-boot下载到RAM中去跑,待在硬件上调试成功后在把此选项打开,因为我们烧写flash的地址是0x90000000,而CPU复位地址是0x100,所以在板子上电的时候要把固化的0x90000000中的搬移到地址是0x0的SDRAM中,上图的选项是选择把异常向量表复制到SDRAM的0x0~0x2000。
' r4 U* z, u2 a3 Y
2 B/ i! b. v& m# _! T2 D) ~
# I; D& D3 r0 q( k5 ]3 X$ I: K6 L6 y$ ]  ]; i$ y% \
        再接下去就是关于UART的描述
8 G6 |4 m1 M  t) W' B
# f' T2 ~; y* {6 D# l# m/ Q0 @& x & q# v0 u9 O$ x8 M$ a
# T/ b% \* O0 N
        照抄通用openrisc文件夹中的头文件定义的,很简单,不解释了~
, K( S+ w" b$ U1 X" d  H( b$ B# ]" c  N# p; A- S

1 F/ t& N5 ?5 f+ y7 Q# K% n* s" G( Z- O8 n4 x8 \$ z# C
        接下去就是关于Ethernet的定义了
$ U1 F6 w, J# V: z/ b8 M) o. C7 W
1 \7 L4 o$ [  f" ?, w, x8 l % T8 z" S! m2 ~  q( g: U

% W9 t/ x$ S8 P2 C, T, L, U        88~92行,关于使用DM9000驱动的定义,在使用s3c2440芯片的板子上直接copy过来的,网卡不带e2prom,地址0x92000000,CMD端口0x92000000,数据端口,0x92000004,关于DM9000网卡的使用参考一下别人的博客或者DM900x的芯片资料,这里不细说了。
* d- z. @  f7 P% N
# `/ N4 {' O/ Y5 ~0 g3 w        94~101行,这里是关于网卡IP,掩码,网关······的定义
. M  G% m4 D0 b" @6 O$ I% E1 V4 |, M/ D  s
/ C6 Z7 [7 S" e" l1 D
        打开opencores社区关于or1200的u-boot移植教程,略读略读一下,就可以搞明白这些怎么定义了。  U4 s$ n. h$ h! ~

* l; f: B8 k4 j$ V7 r9 u8 L' S
# E( U/ s  s# V% g5 q; S- N% I
) r8 F6 `$ h: E1 D6 }3 g/ }        再往下
% b- G1 @5 V# T- }. L
9 J4 C4 k9 @- u+ [& _   z( i! S9 r, R5 O* |8 x
7 C) z7 X4 A$ i6 f0 @) V! ^8 k
        Timer的定义,照抄openrisc通用架构的' k8 L$ n' d3 \$ P/ j2 O% T- j
0 U: ]7 P- z5 N& e2 T/ u, z

. D9 ~/ l. y  ]9 Y' T$ {3 a/ S7 \1 n
  D( t+ u& q8 P" P, ^        往下,关于u-boot环境变量的存放位置。4 O7 b! [1 W, \& B
; m2 `: r# v" b7 ?
6 [4 G) E+ n! Z% x5 A. f  \
" G4 A1 d0 U$ [- [* @
        刚开始下载到板子硬件调试的时候先把162行注释掉7 \1 `& J2 V, N
+ [- V* P! z0 D4 N7 x

7 Q) k& r% p- s, j( i8 {
, |3 X9 E  g  F! I% b$ z; d
) y! w3 i4 U( ~
3 K% M3 M9 X' S/ [% T9 ^        刚开始调试不需要flash,所以关于u-boot的环境变量不需要放在flash中,直接在SDRAM先调试完成再打开此选项" ~% d- M# ^- `* p$ ~0 T8 E

" c( Z2 K) k9 B6 l" u1 _ : S$ R8 \! [. l- m7 y- j

# }  _- x  J: y6 C- h, B# t5 p# L1 f, x6 G2 q% p4 _

& d# K$ [5 ]7 O  K6 v# ]1 k+ l* S
        这些是关于u-boot使用的堆栈、全局数据、主程序的代码存放地址和范围的定义,都是从openrisc通用架构copy过来的  ^; F1 n2 A* m* S

9 A* @. c7 v8 F/ E8 x3 K. n. k5 }
, F" C' S. c- r+ l
! j5 s7 Y& l8 ~$ C        上面为调试u-boot时所选取的存放规则
作者: NNNei256    时间: 2021-6-1 13:10
or1200移植u-boot
作者: CCxiaom    时间: 2021-6-1 13:10
or1200移植u-boot
作者: BarndM7    时间: 2021-6-1 13:10
or1200移植u-boot




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