|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
K) ?7 W5 G1 ~) m/ J4 U. @
引言4 u6 |, L4 P- x$ i7 W
前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux。
1 z+ \: h! [9 V% N& J% d8 M" t7 z) d$ d' j
采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。) T4 r+ j; A$ a
2 C7 c) P4 P! U
本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
* e) D, q9 l& [. ^7 f4 G7 [2 u1 f h3 T" R7 i0 l
9 C! q- ^! c# T) u, J% E
0 G# i3 _4 ]- n1,基本思想
/ w* h' h" E+ k* P; G首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。
, p) D/ o v3 }7 g' C* K7 `+ X+ X3 U6 ^6 N& q5 R0 m
K6 l" R7 ~& g7 Y
: @1 e0 I' j- n3 k7 p+ D1 a2,操作步骤
* g/ r5 ^, u% y: ]# _+ l本实验的基础采用的ORPSoC和orpmon以及linux。
6 M! J0 \; g( C1 l0 \2 r, m9 d; t$ T) }1 t0 }, o5 A0 w
此外还要注意以下几点:
+ H$ f5 r9 p4 a4 Z: E( ~8 h; P1 b. z9 J
检查一下ORPSoC的启动地址是否为从bootrom启动。
( S3 h, S* Q0 T5 I0 L8 |& f* h. J
1 G# \5 g3 E* h! o1 A' sor1200_defines.v:* t0 R+ s7 I* R. e7 U3 C
" J) }/ f' l' {5 A
' Z" H" I& l- i0 W# N' |
8 j$ }: Q& L4 J/ v// Boot from 0xe0000100; P: Z7 D1 F- b7 _, G- `
`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f
/ i; m- \; T! N0 B+ D) ]`define OR1200_BOOT_ADR 32'he0000100
7 d1 U3 j. K5 u% A1 |9 [' x; }% ?. X& _/ e; R6 S
正确生成针对ML501的bootrom.v。
: T) M$ @3 y8 j$ e) p! L确认没有问题之后,我们需要对ORPSoC进行以下修改:
4 ~5 T3 G0 M& `( r+ E) r
+ q: O2 P6 U2 g# U( k' i* k1>FPGA配置文件的生成
2 _+ m1 n0 \' k1 ]. b+ q) B' ha,使能SPI模块# }# e" _$ R: q0 B9 C
. G4 I+ b# E! \) W由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。7 G0 Q! J$ y$ F( |! q; c6 \
" V& T# N1 B' j2 H5 m& h' porpsoc-defines.v:
7 \* ~) Z* d8 y K3 @
) _# S: {# p4 D5 q. w1 E8 ]
6 d7 s+ z$ q* [9 i! z* j! _+ N4 W% B6 F( a+ q3 k5 m! o8 `. Y
* b, ~2 ~/ `1 J+ y: k$ k' n
8 j7 X) m$ ~# e9 \b,修改ucf T: R: @; h+ o5 k- e F
, o. g% S! D% {
使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:: h( ~* l/ k; o/ d
% u& b5 N/ a. r L. K# }ml501.ucf:/ }# L+ i" u$ B7 @/ a% H) \: M0 x
6 G/ y$ d0 T+ X0 JSPI的引脚分配:
" i8 J6 e& D6 G( w; O% n: J' Y7 E6 I1 J+ g$ X
, U m5 G! C% ?. j$ y$ g! ~- k, X/ c' @
CFI 的引脚分配:+ q7 ]* ~; l3 W! h7 p! ], u1 e
- L3 u5 g [3 O0 Q: G0 C$ @
' }+ |$ M9 ]6 k! u
2 ~- x3 B9 I* v
从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:
) b K2 G% A1 i S7 T' m- K; N1 J0 t, q* W- m4 j4 f+ b
3 I9 c: w+ P0 f4 k8 v; o* U
( ?2 T( f" a' t; j8 Y3 ^
* u. F3 d$ u# Q$ e; h5 V7 B
, W5 ?1 S* x1 f2 {- D
c,修改ise生成bit文件时的配置参数
' c& I2 t2 z8 |& [
5 B y/ @( Y4 T! O在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。' q: e# Z) d4 `+ z& a d) x1 [
/ c, L1 l/ l% T$ v
d,综合生成orpsoc_top.bit文件: }; k8 o1 P2 j: a0 P. }/ V
- u# w9 S' _+ [8 O$ F8 [
用ise综合生成orpsoc_top.bit。
. l7 _! a% ^. e+ h0 e6 n7 q% D, s& c2 k
7 d1 s7 Z: H9 S) V
# ~* o7 [+ U5 u' i5 w2 I" }
2>orpmon软件文件的生成1 b4 p* h U6 }% D0 G
a,修改开发板类型3 }6 i( k' L9 z/ P$ k: ]5 `
& R' j z4 ~3 J
orpmon/include/board.h:
$ l( K9 a9 P# @! z c6 M8 q, f
- t3 ^! w7 ]* a
; M" ]: r( S& y5 j
9 f2 E' P# m, Y; U# V) g3 e* p' V$ X5 ~2 E: Z5 L5 ]
" c7 I( C0 N# Z' u- Fb,修改时钟频率+ M1 k2 [! ]9 B! D3 P& }; t/ c
; g3 n3 \' \: L% k, W& {+ i2 dorpmon/include/board.h:
+ ^+ L! F9 s& {, g. _: H! P( t: D! |% B8 a# s# p
5 n7 u7 q; F- |( h0 Y ]$ R) w) X q8 m7 ]# p3 a; Y) G
c,编译生成orpmon.or32.bin$ H7 k, a% E. f6 b5 \- E4 z
6 N0 H/ I- q* V8 K& W
在orpmon目录下执行make,即可生成orpmon.or32.bin文件:
- H# p/ b$ }' R" y2 M
5 g4 A+ i9 p0 {% l4 ~* v- S
9 p6 R, l" L5 E+ K. x) t7 }) F
# l# X5 w/ ~) g ]3 H0 t
8 r# c# g) Z3 A' H1 E1 C: T
* t3 z3 ^0 F T/ z5 E% p! _d,生成附带sizeword信息的orpmon.or32.szbin文件
1 [! X$ @6 W2 F9 C! k. g( G- ]5 B! W
$ |' Y2 ^0 ]7 r. o) o. |6 b! E0 m向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:" C( m2 h, ]8 G. F% ]5 F0 D2 G- u: r
7 K& G6 \& v) `6 z* {0 v
' g$ M: ?) a8 | D! b2 e8 Z2 n" s& p" f& r% G& J/ {! V% M8 Z9 Z
3>SPI Flash格式文件的生成(.mcs文件)9 q3 d2 {' l2 R/ U \& ^% |
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。4 [. }, W7 | ~
- D8 D1 j* O, Sa,采用图形化界面
( E* w% U0 f: ~* k z: W: |- @; K7 k$ f( x. b N6 U9 z
打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。
4 ]$ N7 K5 }. o) I- f' c) o0 X8 Y: t
1 B3 t; Q* G: D" _3 h$ ]" @
* M. i( k% G, ~
b,使用Tcl命令生成mcs文件
) b. S6 ^! T+ l# i2 a4 r2 s. D: c3 h; Q' w
除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:: K7 A6 z6 M+ G) `
- E; \) z( A% G* P; @ B# y/ @打开ise,view-> Panels->Tcl Console,打开Tcl终端,执行如下命令:
8 v( _; J! G( y6 `; j D3 R1 a d k+ p8 E @' S7 i
. @& O8 b6 o/ m/ \
' x: D4 x' ^* K# G6 S! O' Ppromgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin
4 z' s3 w: N! `2 J( F( c" D6 X+ A0 Q0 i
其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。9 m0 g, O! w; K3 U0 x! x6 A
mcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。8 G9 V, Z- \* h6 |
& j7 G4 ~9 y- ~1 z3 a# P
( R# m B" W8 F+ D6 @ C2 `: o v' {
5 r. D6 e& K% U3 r# o) o$ y9 V. f4>用iMPACT将mcs文件烧到ML501上的SPI Flash中$ v6 u! r9 Q) R) |8 W0 U4 N
在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。
0 _' H4 I( q p+ L
6 r- Z# q$ v j! @
) M# |/ W! N: ~/ V( b% G- l9 G# |$ _
5>启动orpmon
& j* s. i5 L% @/ [' ^, P3 tmcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。
0 Y5 b! r; X, m( E0 L/ ^2 R
+ q( y7 d, i; U9 K! _ L; p% L和直接采用or32-elf-gdb下载执行的结果一致。
; z' ~1 U5 m% Z& K
8 e) U6 j; h. U' e7 v7 H+ s' g6> PC端打开tftp server
+ D: C3 c" K8 R. s, e在orpmon启动运行之后,我们就可以通过tftp下载linux了。, D4 f3 q% h9 H1 z3 ^( Q, V* ?& Y
% T3 S! [0 w# g% \
首先要在PC端建立tftp server(tftpd32.exe):
0 v' U' b2 {0 T s+ ? G- Y2 Z( N4 ]# H, Y( J
指定vmlinux.bin文件的路径,设置server ip。, j7 W: e" J" k$ C+ A4 ~
+ c* @- F; Q5 L
通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:( n! ~4 n" y; p1 |
: {! V; @: s5 ]2 V* c, h
# E0 O$ _/ o& x+ Y0 M2 ^9 T& d) x/ E
% a3 O& N$ a0 _7 [& B: e/ W" W
根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。" z, a3 g: _' ^' \& R. M
4 N( t' e' b/ f4 p' z" v6 R
/ X% m& s8 p9 A) c+ h6 U! @& h ? B5 g$ d2 B$ i( @
) m7 G8 U0 @$ N6 N" g+ I
; u6 ?$ ]! ?0 E# d" x" p
7>用orpmon下载vmlinux.bin文件
. @( F. I2 P- J) I, ~PC机准备好之后,我们就可以下载linux了。6 c7 Q" W3 n6 g Q, R- G" w" c- V8 `
) }/ c/ q4 W ?* u5 C6 U4 v
首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。
5 K5 ~: E Q6 }, V
0 H- V8 m3 |+ T% F* Y0 ?* x# l$ M/ @然后执行‘tboot’即可完成linux的下载和执行。' V0 C" x/ z* F
$ q; T% S" a3 B: W- Q$ q这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。5 u; P7 d" `9 ? Y$ m
) x2 p4 z- A6 @, d9 h* qvmlinux.bin文件下载过程中,如下图所示:
) v/ l: `* v5 V; R, z
$ _' X: O8 {1 s9 _2 s
9 C% c3 g& t$ Q# G' ?- c. o- L* C4 e/ V( n# }: h! y2 L
& W. K( A3 G) v8 i9 T+ \& y7 s
下载完之后,执行tboot命令,即可启动linux:
0 K3 l: Z6 ] S
; m+ [1 o0 ]: M) G# `( W1 ]" r8 j
- Z U; M9 o7 I
3 F0 i3 W' O% V: _7 d! H/ J在linux启动的最后,就可以进入shell模式:
; Z! Z# S+ p/ @9 D$ A' R& x
" R3 I8 I9 Q% r3 Y1 W, d
6 K+ T6 a) n8 E1 A- k3 O4 [3 ^9 u, ?8 q9 |
在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了。
: y7 C4 d, y; k3 e; ?+ ~+ N3 X* t( h8 f$ ]- ^. |# U0 X- Y- \& `
6 Y8 y- H v0 c& j; D% Z
& w( L0 i8 q+ V( Z6 I' L/ k8>启动u-boot
. E/ K; G% T- F. {6 v从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。
& |$ w' O" X( C0 S O% t8 N
- l6 r4 i, k, K执行:
$ T$ z( f5 ^% S4 k
1 Y0 ?$ C7 @3 W8 _& _) Qmake ml501_config8 W+ l. |) D. _8 p2 Q
make" `# E( M; |- Z1 j' M# M4 ]
, k6 Y& _( ?5 A; Q
即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。
% r+ ?0 R# `' U1 O- ]2 s如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。
# G1 \+ J8 `8 @
# c# q5 V$ F, W# I如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。5 `7 X2 T i/ x8 o
- `! F8 G x) `1 q
如果启动u-boot之后再启动linux的话,可以采用nfs的方式。
; D' n) d# u' h1 ]5 \8 \# o
+ p( t1 e9 r8 X9 Q ^( G3 M
0 f$ _& ^. K( Q' M/ g0 \% X
0 N6 ]+ C) T8 q- E9>从CFI Flash启动软件
0 F4 O$ z3 \/ d# c% B如果想从CFI Flash启动,步骤如下:
8 Q6 Y6 n# Y( P$ |4 B! g: t* C- p1 R# C5 s. z1 e
soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:
q& C3 z! H# w
1 |2 T! R7 W0 }1 q* A3 v: Nmake PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。
. u/ z% ^4 G, g" R, T. V: |# A# V7 _8 O/ ^
用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。
- w/ ?' U( p* ^: S
$ ?4 \ ^7 M: v4 g修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。
. U4 A0 s X% y, S6 i- r" w9 \# W2 \; Y7 T2 _; h9 v1 Y
, J. U# n7 r5 S& v
+ G% q- a) k( l. Q3 {2 C
' H- B6 u8 l- w! i$ s) m5 `
8 M' Y* m+ i8 C3,小结6 J4 C( |* z0 w2 }
本小节我们实现了从非易失性设备里上电启动软件。 |
|