TA的每日心情 | 怒 2019-11-20 15:22 |
|---|
签到天数: 2 天 [LV.1]初来乍到
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
5 k: C6 ]2 r1 t x3 P3 n
现在搭建好 SOC ,可以的话可以先练习编写一下“裸机”代码测试一下 ipcores ,就当做是提高操作 C 的能力咯,那这次我们来根据自己的 SOC 移植 u-boot 上去。
; M7 N' U* }: @' `/ t
" c' |( V ] h9 i1 j 至于移植比较详细的解释,我google下《ARM79出品-u-boot移植手册.pdf》这个手册,虽说里面讲的是关于ARM架构的移植,不要紧,我们只是借鉴一下,但重点关注的是openrisc结构的移植。
& X% T: Y# q* j9 h$ O3 X
- o* k3 g# {9 ~, W+ F
9 ?: E, M% Q" @, D: M
1 K7 L& \8 l- f( U; {6 {1 F
( @( n4 n3 ~7 S7 }7 R 将u-boot-master.tar.gz下载下来。
. j4 ?3 l! f: p- C
( G/ ]/ n2 Z( s A) j/ k5 T
) i, ?7 X* i5 w: Y
4 }1 `+ S# ?) j" G" H7 l; y j! Y' z 打开opencores关于u-boot移植的步骤。5 O' B h& Y2 ^% R9 C- V
7 z4 h& @5 h7 L/ ^2 a
3 D5 W/ e w6 G5 d$ T B: \1 K/ n* r- \* f+ o
2 }& R7 |/ _& C) S
并且u-boot源码目录下的RENAME文件中也有关于编译u-boot的步骤,主要是根据自己的板子添加必要源码文件和开启所需要的u-boot命令的宏定义。
2 D8 E! ^0 l# M4 k* j9 L7 o8 g# z' y! ], ^8 s' V- T: u
# E0 O* {( l C1 F/ B1 M
" B1 V, L, z w! d
( l% J& g& E e' V& n
解压u-boot源码,目录arch/openrisc、include、common先导入sourceinsight中,然后打开根目录的boards.cfg文件,可以看到该u-boot下有几个关于现成的板子的移植工程。! P/ A* ]9 B6 Q" @
+ Y) M& V6 |! j6 o7 K: v
- a( J4 _: U1 U- }
7 R/ f4 L. U8 [. i( { 在board目录下可以找到,都导入到sourceinsight中,这样可以作为自己的板子的移植参考。
5 G+ l3 o+ r1 y# o' M- ~. W
, Y2 N% x$ t. E( _2 O# m; q- j! }- Z, h- T6 _/ _7 R
3 U' b4 ?8 u5 K6 x$ Q% [ 好,准备妥当之后就开始根据u-boot的RENAME文件中介绍的流程走。/ w/ {- \$ u" l- C: ^% }8 k
2 f! t6 O) l/ a" |& H( @# l5 i
1.在源码目录中的boards.cfg文件中加入自己开发板的名字,比如我自己增加的是EP2C20F484C8。
, J" }& b: r @" y3 ^9 i8 u1 ?* D+ e' K3 K" M2 x/ v! L1 s
; p( P% D% q, ~1 r
5 T. A6 z% t9 ~* X) l/ E: k# A! Y X4 Y. ^+ c: k1 {3 k& l: h' b
2.在/board目录下增加刚才在boards.cfg新建板子名称对应的文件夹,比如我在/board目录下增加EP2C20F484C8。; I5 ]* p+ W) z- N: i4 x& Y& n
3 i8 u0 Q! K6 {, F' v) g0 @7 b
( q; N# B; q1 W- Y& @
6 M& E1 w1 ]2 h1 A$ T* G \& m) o. E
8 C/ V/ `$ Y9 T/ D& x$ B 参考在/board目录下的openrisc文件夹,我们把原有通用的openrisc架构的复制到自己刚才新建的文件夹,我复制到的是EP2C20F484C8。 u* j& w1 E5 B- K0 ^/ c9 Z
8 R U3 v4 ]% G5 I- H) e
* N! @/ {8 l) k6 Y0 T
0 W" l# e5 E i: x) r' H$ L0 s
& h( E3 Y) v; u/ c 修改成自己所选择的开发板的名称. y3 g4 s/ H& U, H
. h$ J3 h2 V# r# j
$ ` E* F7 G+ x! {1 G
. G G5 E+ l$ ?$ y
( j; S; s y/ r* l. a2 O
然后,打开u-boot.lds,这是u-boot的连接脚本文件,对比一下/board/openrisc中的u-boot.lds,修改如下:
! `6 V0 p; N9 k9 \( `& M* P. O
" i8 _ ]6 _3 y4 M* k8 `& ~
% ?; n& d0 P5 {0 H; Y8 u2 I, N3 U3 O- @. u8 c7 b/ u
2 @5 Y3 j5 D' S$ a; b9 d; J: \" M
与前一篇中的连接文件link.lds很相似,至于u-boot.lds中的vectors和ram段的起始地址和长度都在第3步中的******.h头文件中定义,这个头文件稍后再分析。; @% ?2 ~# w" H+ ?! c t) H
. ]* ?1 j5 S2 G" M5 [1 A 打开ep2c20f484c8.c,因为我板子上的网卡是dm9000,所以对这个文件中修改如下:
$ D0 D2 g2 l) w2 o$ ~
. r2 N+ s1 v% } L) t7 t! x: _% ^# ^
" S& @6 ]# s$ ^
& H1 ?+ o; \1 T 用u-boot自带的dm9000驱动增加对网卡的支持
* M ^ l. t7 O5 V4 b( y3 m3 y
7 }, s% D. g" Y: w; @( C9 V$ H, X
- b% L/ A. l% {/ b# V j$ |
8 G# @9 @) i5 ~, l 3.在include/configs/添加板子名称的******.h头文件,比如我自己添加的是EP2C20F484C8.h: y) v. `8 r% w$ _" Z+ n! V! V0 p
4 n' o% \) R5 p- V* j4 ]
/ I0 \# s' G$ e0 O- D6 {- |8 [% A
4 H2 b" x6 F6 L4 C' Z. m' D
8 }$ b% q4 c& w) } 然后,在\include\configs打开所有关于openrisc架构开发板的******.h头文件,在第1步中的board.cfg文件中关于openrisc结构对应的相同名称的******.h头文件都可以在\include\configs找到,参考现有的工程配置来得到我自己开发板的ep2c20f484c8.h的配置内容。1 |; U9 }- x' c
; b- v" b" v0 J+ u( f5 d" {
一步步看
) E$ z9 H' _, L+ c G# r' T* `' c F- D$ T) p1 O% x, i2 t z
! T% b9 `( H$ u' J8 H
4 Z" k j$ m! P- | 看定义名称就知道了,定义工作频率CLK_FREQ是40M,板子速度问题,上不去了,然后是复位地址RESET_ADDR是0x100,SDRAM在wishbone中定义的地址,具体参考《or1200硬件环境搭建》一章,大小就是自己RAM的大小了。
2 n; x, }2 h7 t& P6 a4 t: U( o8 x6 B
然后就是关于UART的描述,地址0x9000000,频率40M,波特率38400,有牛B的板子可以自行设置高的波特率115200什么的,小弟的小板38400在linux用z-modem模式才无错传输,伤不起。
2 f3 c' j* L9 m! ], g4 `8 W- M- W8 T r( H; I$ M: e( W
接下来板子名字,随意啦。+ E4 A; T+ P9 m2 I/ R
K6 Q% S: ~3 t, l9 \- Z @2 l2 C, f& t3 A" q) Q
接着看就是关于FLASH的宏定义选项
3 f' u, j5 r) z* p4 Y/ X& Q: b. S! R) J2 O. n/ ~- Y$ r: |
' p/ n: y0 g6 m6 _% \: T7 V/ m
% j/ y2 O% t, W, V 我板子的芯片是型号JS28F640J3D75,1片64sections的nor flash,所以宏定义,有啦,下面53、54行是用u-boot自带的CFI驱动来驱动flash,然后,位宽根据板子设置,我的nor flash是16bits的,再往下就是读、写、擦除flash操作的时序,差不多就可以了,根据自己板子的速度,可以自行设大或小点。2 U4 Y- T# n& K& g
0 ^5 s* T _5 S
* Y& h3 U$ I1 j
8 L! z' U1 u( [" B! g: h 往下看
/ k! d, T0 y+ U7 e! ~; G I9 _2 C* {1 R# \. `
3 N3 v \7 J4 F6 W/ L0 O$ H
6 F z3 m" A: d% q* p% R 在刚开始调试u-boot的时候先把65行注释掉,因为刚开始跳我们直接把u-boot下载到RAM中去跑,待在硬件上调试成功后在把此选项打开,因为我们烧写flash的地址是0x90000000,而CPU复位地址是0x100,所以在板子上电的时候要把固化的0x90000000中的搬移到地址是0x0的SDRAM中,上图的选项是选择把异常向量表复制到SDRAM的0x0~0x2000。
) f) P1 j1 q) D& h1 F
# X0 ^, S) _! e0 l
9 r2 g1 ^: t D; ~$ Y
6 `! e5 W f/ P) z9 B6 m 再接下去就是关于UART的描述+ P) F" l' ?2 F) [1 b) v) ]
+ l6 c {: x3 ?! [1 M
& W" q3 h7 S4 @) Q; T* Z" Z; [
1 s- N( n' p+ P 照抄通用openrisc文件夹中的头文件定义的,很简单,不解释了~
: @; u J; j& P+ K/ k: U$ A n: i' O5 r8 z
' ?9 ^3 b7 ~( s* u
9 I8 Z) j3 T* e1 R1 _0 W+ Z4 G
接下去就是关于Ethernet的定义了. _% [4 }8 W& g9 [( E: j$ b6 ~3 n
, D1 C6 R: a7 m$ H+ F8 w- Q+ [
; C: H, l1 k) z2 O
?- R. W% t9 |: O& Z9 N1 Q% W: p$ f4 \
88~92行,关于使用DM9000驱动的定义,在使用s3c2440芯片的板子上直接copy过来的,网卡不带e2prom,地址0x92000000,CMD端口0x92000000,数据端口,0x92000004,关于DM9000网卡的使用参考一下别人的博客或者DM900x的芯片资料,这里不细说了。
7 ]3 q' t9 G2 ~7 `- p0 O, t/ J9 j* I. _% Z
94~101行,这里是关于网卡IP,掩码,网关······的定义
3 e1 I* j, d5 T
1 v- L! ?; X0 t P% Z
' f! k0 S" F* `$ J 打开opencores社区关于or1200的u-boot移植教程,略读略读一下,就可以搞明白这些怎么定义了。, u6 |5 x$ R5 O+ p5 q+ w
, _' P9 t& K' _/ _1 `, Z
8 c9 a7 @) p3 ~3 G O+ R: o! W7 j) X( X0 H) C# m8 ]! h5 C
再往下3 T, N2 v/ I B% B. [5 f/ X' y0 [
0 o6 ]& O; E& [% }. E0 f
/ @& V. c6 T: R) U- r! b
+ y2 {) K' a, ~ Timer的定义,照抄openrisc通用架构的
- C' K9 |8 L) j1 Y7 W! D5 x2 w2 G6 o* U: U. Z9 v! g
/ _* K' C$ S# |
; D& Z+ \; j! e$ X4 a 往下,关于u-boot环境变量的存放位置。% |% c4 n8 M X
: m3 v3 l" O ?9 z V- Q& d
& Q( W" h& r+ y& O) W( v
3 q' A% z8 Y& B+ h
刚开始下载到板子硬件调试的时候先把162行注释掉* }6 V% X: U. `4 G7 ^
, ^1 s9 v6 s2 Y0 I% E
+ e4 ~, K! j) |! a) l
% k; u( q5 W% d5 q, h
( v5 J8 ^1 E# `6 U- `. F% k
I7 V2 i/ r9 ]+ w: r0 D 刚开始调试不需要flash,所以关于u-boot的环境变量不需要放在flash中,直接在SDRAM先调试完成再打开此选项
" w) Y- Q. `* ~; ^: j0 \. c8 M- Q3 @. z9 n; q( _0 G
8 P3 O* Z9 o. g6 j( c3 |
/ q) B# [2 I, h! P+ a! U& Z
) @* g/ Z7 |) Z& v8 N) U
* N" c* c1 o. M0 Y- V$ t& N: q) S0 |, s2 [: P9 ?( @9 i& }! Y7 r
这些是关于u-boot使用的堆栈、全局数据、主程序的代码存放地址和范围的定义,都是从openrisc通用架构copy过来的+ C: j% P% {, e! y( G
9 P) h8 E2 w9 s" P, c
0 f3 H$ f; Y# X# U
, H" l) \, r5 T& K. [0 p 上面为调试u-boot时所选取的存放规则 |
|