|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
7 \$ d5 `% q; A! F+ w
引言
6 W: J1 x' u$ e. b) ~8 Y前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux。 D4 ~3 B" N; W( F
' Q5 @/ n, L! V8 Y0 l采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。
) C9 f/ W3 r& z8 k& V
8 E6 Y; m! D1 b: D9 f: E本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
; P0 H/ D+ r5 {+ j0 k
/ d* A, v$ Q$ i, A- n! [1 q( a( M* c
& M6 ~. H- @# W W+ J
; E' Z ]& @" D% A0 X; q4 `1,基本思想
4 e+ g5 w) L2 V7 q首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。: G1 V7 K d: E* S/ i
% G, j; P" u5 v. W, `) G" \5 I3 S. `7 {& B" z* X
4 m4 `5 @8 u+ x5 I- f% ^
2,操作步骤
r( p: H8 I) p5 q6 d$ N本实验的基础采用的ORPSoC和orpmon以及linux。1 w9 N$ V( I8 C9 m% h
9 L8 i8 H1 k( F9 M+ A, @此外还要注意以下几点:
! E2 J& m" b- ]# L- C4 V2 `$ H* v/ Q, b9 z; \4 p- }( M
检查一下ORPSoC的启动地址是否为从bootrom启动。
) j& l$ ~6 J/ a# `) N& p
7 c" S* y s3 ^or1200_defines.v:& B6 d `, S/ x8 D% n' \
w/ O9 z6 d0 R3 }6 }6 M0 w
1 B2 n- @& F9 A. D! F. E
! p' j- D8 x9 z
// Boot from 0xe0000100
" C! \1 N8 x" C9 \8 H+ c6 G5 f* q- x`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f
, }) c% I& i; u/ J`define OR1200_BOOT_ADR 32'he00001007 Y) X) N3 |! ?; }
0 v( z( ]* {$ {: h8 H3 Z正确生成针对ML501的bootrom.v。
7 U8 q& z4 j- D9 h确认没有问题之后,我们需要对ORPSoC进行以下修改:
3 R; f6 B2 k7 }. X6 A
2 |9 L2 D! O$ D: L' D" p X/ v1>FPGA配置文件的生成
$ C! n. I* J; a+ P* Ea,使能SPI模块6 e0 J S1 U+ |- r% K6 l6 |0 F
2 h. E3 v3 _# T# x; d1 L: C o# H由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。, J1 N. L4 C2 V8 `5 m; o- I; y
9 j' Y# j$ z9 I$ morpsoc-defines.v:
3 W4 O1 ~% C# c7 S8 |" F; q% X( F9 W+ l+ ^- o* g+ r
/ k8 T& }# ]: `& y% X @
0 c+ \1 V" Y3 g6 J
, f, ]3 h( _; e% z0 R# \7 F
/ O7 t; r/ c4 p* V9 L& m( A. }b,修改ucf9 @& ]* t1 o# ^5 j) d
! T7 @6 N9 R6 W7 p) p3 s使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:; ?6 ]- K2 U* M- O9 \ ]1 t
( C5 J2 L1 R3 C w
ml501.ucf: A+ X* L0 H B6 ]: q8 a5 e
' ~# P, \7 ^7 M6 SSPI的引脚分配:
; U B( o5 v" v* ]% k: K( ?0 ~8 H9 k+ d/ F% {
* a' x9 u* l+ ^/ Z0 o, Q8 ~! y
. a! m. I- x* |
CFI 的引脚分配:2 A, y# u/ t8 D" v" L6 H
9 e2 Z' N2 O! _
, v+ @. A2 C% ?0 v- l: w' w6 f% ^# ~
' |; s: b( I( Q( i7 M! S% c7 ]从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:
/ k, \* `9 H; K5 U0 z' q% Z
& k* r( h: H! c5 E$ F
3 t9 b- Y: u3 {- Y& b6 k. g+ a# i" Z8 F
; _5 t4 \8 \3 B4 S6 m; h7 z; @- P) H. Q" O; ^9 U `7 N+ b
c,修改ise生成bit文件时的配置参数
% b7 E) e7 ?" Q
4 V! Q" z# \* q在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。; x0 I" k3 w$ T$ H/ R* e- ?
; [/ U* p4 R a1 y8 s
d,综合生成orpsoc_top.bit文件
7 T! x/ E3 y3 |; K7 S5 Y5 V
2 ]* \7 e, M6 g- c用ise综合生成orpsoc_top.bit。
4 E- L9 x# e0 e; b$ a) i. U* ^+ Y7 H- h
* A- }9 G3 d; O9 W+ @
9 P" V+ h/ e# b9 z
2>orpmon软件文件的生成, P+ S6 F' ]# X
a,修改开发板类型2 |0 ?0 ` W1 z9 x# n% [
" b" b! A9 F+ E. worpmon/include/board.h:4 e7 A% v5 S: C% \. O j0 a
9 [% J3 c( j9 c) |
& B, U3 Y% P; ]5 b! z
# W5 [. M& R3 i$ H- G5 R. R, B1 d( J% U6 a" x' E3 F8 Z. f2 p7 E1 x
* q7 K$ I- H4 a0 W/ U3 v. nb,修改时钟频率9 e) x% F" m$ k7 |4 P5 Y3 v
. t# k+ T+ C+ M0 d" r& rorpmon/include/board.h:
! f! U) s) E- t. w/ D, H
7 t3 ]4 A1 X0 Z- ~ w8 }# H
: [ M/ ~' Y5 O* J z
4 Z; q% O/ d- v: S2 d: G4 g& `c,编译生成orpmon.or32.bin0 S' s' I- }5 T- c3 D, M# ?
2 o* e" U2 l2 C
在orpmon目录下执行make,即可生成orpmon.or32.bin文件:
. f0 V3 U& b1 P2 R2 [' {3 ^" M+ w% k9 o9 `+ X
' L( h! }* B$ `
- ]3 ~) ]2 a8 V
* c* E z, ]2 }' c9 k
8 D2 R- m6 y$ B& h& A! x2 s' Yd,生成附带sizeword信息的orpmon.or32.szbin文件3 |1 s, t# S' ]) O
9 U! }9 g: Y' ^# x3 w9 ]* {) m# L向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:
2 z4 } r: G) \% L$ U1 O. h5 e( N: u$ L f& D6 k$ K( c
4 J( m- \5 X3 B1 z* ~# w
* d7 }, r9 v8 @3>SPI Flash格式文件的生成(.mcs文件) M) D$ ?9 B+ T# ^2 a. u
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。8 U$ B2 u; M' V, b! t0 P+ |
( o+ _& q, @; U
a,采用图形化界面9 a: s+ C' n1 R4 ?' G% g
! g3 @( b e8 Z7 ^1 M. [
打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。/ f7 J; _' {( w9 u) _/ K
% _; g& F2 p0 W' [( ^
# k7 o% C) }+ z& ?
# n9 {8 G" k8 x! k8 u; fb,使用Tcl命令生成mcs文件
3 E# b# E: z- o) y9 d0 J# S
8 O1 r- @/ R: {6 o3 t8 U& l除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:
6 z( H8 {2 k9 v/ ]# c# e6 y) X+ r* y" x K
打开ise,view-> Panels->Tcl Console,打开Tcl终端,执行如下命令:, ^, f9 D( H/ @+ G9 M% S2 T
9 n5 ?" ^5 T8 X4 \9 A2 B
% h* ?( u# q8 K* E
5 q+ \: M0 x7 M: n; X! e# D% Qpromgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin3 _; u) A9 [2 m
( n) [8 a# N/ B( Q' o其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。
9 N" S- Z( H/ vmcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。
8 ?2 q3 T i7 k5 j0 V
4 ? E* e% A" r _5 E1 @8 U- s7 z$ C
% E0 R0 [/ R ~+ t' I" y$ A9 x1 m& K$ l# @" Y9 w/ Q6 ]
4>用iMPACT将mcs文件烧到ML501上的SPI Flash中
Z* U! y8 k' M在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。
8 P2 N0 | o0 k; G0 w( q
' H: U$ \/ e. Q r, z/ Z
- F7 W2 n+ o: [3 F3 t$ a
X# l; T/ g9 s5>启动orpmon1 N7 P: y! `% R" n4 _, L
mcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。% o* C# A- Y; [* L
. L- G/ A6 q3 b6 J" O5 h% w
和直接采用or32-elf-gdb下载执行的结果一致。
% i: ^6 @, S4 o' h
8 o3 `+ }- V$ L( Y% s7 Y. ]# t6> PC端打开tftp server3 M3 q8 q; m0 `+ J- O
在orpmon启动运行之后,我们就可以通过tftp下载linux了。& D* a, J: B% ~9 H- z' e
$ p# [5 P# q% v+ Y
首先要在PC端建立tftp server(tftpd32.exe):; G4 E9 n0 a- V. [+ o+ J0 J
% [* M2 L ]2 V0 @0 m
指定vmlinux.bin文件的路径,设置server ip。- X) u. x) U9 y) s
) f5 D8 ^; k) e/ S9 `4 }# T+ y7 A4 s
通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:+ `9 j: \2 \8 z, {# e
; C W% V" L" q: |+ r3 S8 \/ Y- ^% ~
5 G( F, Q$ ^5 o( z* M' K: A
/ \9 i& \3 n* ?/ E- w, u# U2 K
根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。
- U7 |+ W& {* t
( }4 x' }; A) t* q" e$ r
! s' K( k* C) n% ] ]
4 ^6 F& W% T0 y3 B/ y# s& G$ T
3 i3 }$ i: Z: t% w( ]5 K, \" N+ \1 f
7>用orpmon下载vmlinux.bin文件 o! ]/ ~: a" R1 f; k! A, ~& g' |
PC机准备好之后,我们就可以下载linux了。. x/ W0 l, M* L( v2 P4 t
' b7 C; d6 s3 F5 j
首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。3 Z6 K p5 @; G" T) s) _/ b' f
0 R( r+ S3 i; {2 }然后执行‘tboot’即可完成linux的下载和执行。
, m% I+ W+ j* }. I7 \
* j0 H( o9 S x2 y3 m( h/ Y- A$ c这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。& V$ p5 X+ r9 K! i5 D4 a1 D
v$ k5 C4 {+ i$ F% n. `3 g+ k
vmlinux.bin文件下载过程中,如下图所示:
. f! ]2 T5 i6 Z7 r* Z2 G V! ~4 y n1 j" N+ n4 u
% C; Q E& s+ ^7 Y& J4 W5 u8 N7 @8 |. Y |( d
4 S- `* z/ n7 S4 I/ ~! y, j' @/ o
1 E0 {6 X f1 I J
下载完之后,执行tboot命令,即可启动linux:
5 I+ C3 Q+ ?3 R2 `2 |$ ~ C. r! e9 B# e
8 l _5 X, C# c) Y5 W; Y j" S% o
在linux启动的最后,就可以进入shell模式:. l+ `: W h _9 B! \' R
: o1 z, Y3 V0 H" P$ \; [4 t+ Z( {4 }
5 w5 n4 F! O$ D; r$ Y# p) L
+ @, o3 j5 H* ~0 @) P# Q在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了。# B1 W- m; i% l9 O) |7 V
! S6 x; ?1 B* i* T k
' `/ X0 z; u0 j8 D0 Y0 b( x7 @* Q) s! ^) M8 b4 u% _' U% y) i1 g- r
8>启动u-boot
- A; U; L, R) k. i7 k- c; G; a从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。4 P! m9 ^% t: K4 ^/ L1 f) _
- Z* @; E) g) {& i
执行:; Q( d6 |! c. G g6 _
- S- d8 J( F; ]" m c) S8 l) ?make ml501_config
1 `; F$ @9 X9 p' Vmake- p4 b. F8 G3 C
( H8 s. P1 G& s! G- K即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。
3 `. J5 J) C7 j3 R* L如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。* j& s3 N! B D) S S: [) v
; n3 b" ?7 e% s3 D# k6 r- a. A
如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。& b' ~4 p$ t* ~+ D: R/ L
6 b. v) M7 D- X2 L. H5 `& H* L如果启动u-boot之后再启动linux的话,可以采用nfs的方式。3 {9 j) Z; g5 v2 p1 q3 _+ j. \" E
7 m, S6 w! r4 A8 i4 u4 C( [, ?8 Y- V$ n; ?* D
! [9 W$ G$ z9 `, b; i# t
9>从CFI Flash启动软件* l1 y$ D5 I3 {1 k
如果想从CFI Flash启动,步骤如下:
3 Z0 H4 i. x$ O- Z6 _1 e7 d/ X8 x: h8 a0 a3 [. x/ f1 u
soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:7 e$ V3 F! y& a% v
/ e' C( b* @- ]% b8 T
make PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。) O) T, B/ r4 o' ?- s
0 g* ]( I# }7 \- W# s3 B用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。) O6 S2 X- [: r5 ^# y! w2 ]/ F9 A+ ]* X! n
p" {+ s8 D I$ [) }+ _
修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。% E0 d$ @+ J/ k# C$ U% Z5 ~; E
6 V0 C+ J& L. N9 b
! g. T. Q0 M$ a
9 H6 ?- l- p$ N) c4 D5 B3 v, k/ Z9 g* c+ p8 W
6 D% [6 _+ b r+ |6 u& N
3,小结
5 U+ V# {& Z3 _+ E! A5 w e本小节我们实现了从非易失性设备里上电启动软件。 |
|