|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
6 ~, ~/ u& h7 t, [! F4 h
引言+ b' [# I# x) V3 {) R+ J
前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux。
+ Z a0 n, N- n; Y* S! Q
+ v4 w$ n0 a: i5 T采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。
3 |0 N/ P1 w7 A- H7 E u
2 O0 j! }0 l7 _& v x. I# H; O本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
: h3 u) y8 E4 U: ]2 F4 M; U: m2 _
$ m' f% y* r6 }3 n/ }
' A( a7 y) p7 m. L) ?1,基本思想5 Y. c" _* ~* ` I5 y2 L
首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。
+ j- v" n* g: t ~- P' n) X5 o3 z ]! l$ m. C/ m
N2 E* _3 r$ ~ t {
6 w' P; d" Y+ R( p* |
2,操作步骤
6 e- b5 q+ Q% r2 h本实验的基础采用的ORPSoC和orpmon以及linux。
. X+ ]/ X: I: m" v6 u4 H0 @- R% {3 \0 Q, ^
此外还要注意以下几点:
; W& J+ H) c$ x7 w5 p! }$ Z! y5 Z4 m6 F2 M3 h& z; J! Y
检查一下ORPSoC的启动地址是否为从bootrom启动。$ i e$ f1 m2 ?1 I2 { P5 G
- O" ?9 e" [, S; E
or1200_defines.v:8 Q" r1 d4 K0 T, k
$ f1 X9 `; g0 Y8 p
; }, G) ^; _, w3 e ]0 p% |8 N
* g1 h. Q' Y& H7 P2 s) g0 |- M+ p// Boot from 0xe00001009 \; _$ V; O4 J- c- x- J
`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f
! u7 ?8 b3 q/ N! B7 l" W: `8 n`define OR1200_BOOT_ADR 32'he0000100
! I0 u. D( f0 r2 v) e7 q4 ^8 h# X& i9 V7 n8 {5 H' h
正确生成针对ML501的bootrom.v。8 Q( E3 i9 b0 Y* R5 Q( t$ u- }) v
确认没有问题之后,我们需要对ORPSoC进行以下修改:3 b Q" k i$ g* g1 L) a. x+ u- _* E4 u
+ U/ s8 S& {( w2 x; @0 I; y
1>FPGA配置文件的生成
, Y/ {& e9 _1 q; s0 w4 r$ ea,使能SPI模块- `7 U- Q8 T* e. t$ q5 w
9 e# T: s5 B1 r. v: i
由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。' w+ j/ ?* X( ~& Z: i
- V' S6 ]5 e& S- X
orpsoc-defines.v:
) z0 p$ R1 z7 b9 O0 v7 b/ B# z, |, k% ?4 l
: c0 x& i/ U" f6 [( n
% V ], O4 y+ b6 b0 _) `% @) h) Y0 K" }- g8 ]2 m, o6 b$ i
( J ]% q) ~6 }& U# D, wb,修改ucf' l" }& B% W( ^4 C0 x
" B, r- D; t' \! f w使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:
0 E) i) B, h6 y# {2 y8 L8 {2 Z) C+ k7 p1 H- M8 s0 |' ^
ml501.ucf:
* e* C( d3 W" P. A% u3 O3 V' y8 Y3 J
SPI的引脚分配:
- ^- y# D& r( F9 P* B0 ^0 S$ U7 ]1 X0 b0 `/ M
! y, r' y: f5 E+ c5 K& G
8 W* S8 \, b. Z/ M/ p
CFI 的引脚分配:% r W4 A4 G( g. z; e0 r8 `1 H
: g+ Y5 c: d0 l
! d( ?2 ^2 E! @/ {2 G" R" h
2 Y$ K1 \1 n$ U' d' U5 U. K
从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:
9 z* ^; m5 [9 T4 X0 \, ]8 s' ~6 q+ U# @6 X! `4 }) m0 y1 p0 C- `: N; ^
- G8 E- F, s* S4 ~
6 O; R: o/ v' I) F9 T0 h: p& l& m9 I3 E6 p1 n8 w
; G" p- H! t w" q. n3 F# |c,修改ise生成bit文件时的配置参数) p$ @( |! z x3 ]0 P
' m% I$ q( s$ e
在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。
1 ]7 Q* j& Q8 H% P
3 a& T: R: J1 ~, y' c7 i. ?d,综合生成orpsoc_top.bit文件
; ]6 R& v8 i, _$ n m: J( k4 O2 r4 O3 |, x5 \
用ise综合生成orpsoc_top.bit。7 P) a$ x) p& A7 J% v$ ^1 s2 }% ^
/ ^/ v P3 k- H! L3 z
0 S+ t: g2 \3 ?
9 z0 t, o) F+ M& I4 {) G1 t9 J* k2>orpmon软件文件的生成
5 _5 f, D& Y# n; z; Q% g9 L xa,修改开发板类型
m# } E& O$ `9 Y. ?$ \
$ h& b$ G& x, V' V# corpmon/include/board.h:
$ i% g: D) c9 q: M& n2 B" {/ ~) r' \8 j# V; c) ~9 R
: g$ K9 R) _3 ]) X! i& r
3 l" x+ m) c; @( @( q* ]% q4 B8 n6 }+ C' [2 O. K
5 ?# e; N' q7 i
b,修改时钟频率
% _' ?3 v, {7 I" f' [# V8 j) y& W( n5 q% c( X
orpmon/include/board.h:
4 d6 @' ^6 Z W" x- L, N' a
3 D/ ~& j8 B4 p# ]. ?
. D7 Y3 Y1 ~ C
7 g2 ~0 O `" t0 b7 e7 ]% t
c,编译生成orpmon.or32.bin# D: M" {# M( D- O9 w
/ Q- ?( Q9 q, s+ `. x! w5 W在orpmon目录下执行make,即可生成orpmon.or32.bin文件:7 ~: t' y- F# ]* t B+ Z$ G$ @' b- n
" }3 [# b2 K' \9 ?' g
( D! |; d9 X7 j) E N$ {
* ^; q! y! i1 S3 F8 f2 _$ C$ J; \& [. U! F% a" D( `3 M5 b4 F6 g
& D' T/ ]+ A- [# a# Ud,生成附带sizeword信息的orpmon.or32.szbin文件8 F# j+ a7 }5 P% s2 v
$ d4 g/ B/ `, g, e! I向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:
& ~' z$ ]# |; w, n8 y2 K
% P4 _' l" ?# g5 O' G! j
! w; t) A; [. `/ [" v" l! o9 ^% D# C6 Z [1 n! Z$ f3 n
3>SPI Flash格式文件的生成(.mcs文件)6 `% e4 }7 H" C1 ?" Y
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。
: x9 y! H6 y% x# |" r4 T5 P) e, b( [- f
a,采用图形化界面
6 l j' n' X+ T7 \8 D! a- n4 r0 F; Y* @" e- f+ j" r" y
打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。% ]# J) p) {' W) k" [
, _5 N k' ^* m2 V
8 [) N7 k# I2 N& B. k% m5 q/ Z
}5 w5 } ^4 C1 K8 q
b,使用Tcl命令生成mcs文件) g9 a' y! e& R2 k6 j
1 {7 C% Q0 a) H U2 T: \! ?+ b: ?$ ~
除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:
4 b6 ]9 S" G# }# u/ f! ]( L1 o& k: K7 ~$ {' B6 Y* t; e( t
打开ise,view-> Panels->Tcl Console,打开Tcl终端,执行如下命令:$ i$ e7 A% B* ^: r3 m3 ]3 N
. B8 g; B9 q: V2 u
6 \0 F5 ?8 `2 I C% m1 O+ p. X. a9 `; j) W+ J* d5 V5 N
promgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin
$ P0 Z2 ~7 D9 {8 P; g
: ^; T7 h: q% c6 a$ B其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。
( X' [+ X+ n: S6 E% y1 jmcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。
/ O- g f4 d% h4 F' Q% Q
* ^+ \# q/ z, k! t5 d" r- b( n2 O( c9 [4 O
, m3 g- a" [- V' A4 S# V# H
4>用iMPACT将mcs文件烧到ML501上的SPI Flash中8 ^' f+ L) n6 U
在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。$ p0 z: J0 r: v
) q& s3 `0 Z d" _6 O
% C$ n- B, ^ w B8 ^ x& ]7 \0 L8 G% ]0 A
5>启动orpmon
8 D' o f+ [% N' O& t% imcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。
5 N$ f/ e0 R5 P0 p0 |* h4 p: h& j, ~+ i+ }5 m! m0 y1 G. ~% ^
和直接采用or32-elf-gdb下载执行的结果一致。
9 y" b, Z, b; v* U, L u( K |- b/ D! i! B, a1 _( h
6> PC端打开tftp server
. _2 t) V: L& U6 G! ]: P在orpmon启动运行之后,我们就可以通过tftp下载linux了。
2 g. h; b0 R4 e& ]1 ^- b
3 F; c- E1 J0 a首先要在PC端建立tftp server(tftpd32.exe):
5 J; K; C" Z" l+ r
7 f* N# R" G5 |& i; Z指定vmlinux.bin文件的路径,设置server ip。& S/ s; n6 }! o& f6 K4 R
1 Y9 N7 ?0 \3 ?0 t9 m6 L" S
通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:
1 M# E; F% J" U/ o( T* e, _' d( P/ i. z" G- w: O
. T1 H; y. ^" D% ~9 t
" m7 t2 R3 Z% ?# G1 F; n& m
根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。! [4 x" `# N& ]
+ Q. n7 Q$ }& `
3 W0 k7 Z, B+ }/ @: a/ Q* ^
9 D) e u0 V3 G7 c; ~% s3 d9 _0 G: G
1 [* @; w: \. b7 N8 @
+ k* t6 ]9 d" |* a7>用orpmon下载vmlinux.bin文件
/ b/ `. M( E5 ~. u! N. K3 I9 fPC机准备好之后,我们就可以下载linux了。/ W9 s& W g" g2 z5 s$ h
" X7 [9 Q$ u% Q; M8 K4 R9 g" E
首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。! ?1 }$ M: }! j/ n
, R Y/ ]. q& m8 Y8 G! A) T
然后执行‘tboot’即可完成linux的下载和执行。; Q$ B7 O5 k4 a- n q0 z
p% Y7 w$ q) t1 {1 y这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。6 u' b2 W7 h0 [' V3 O% Q3 x/ u
( f5 x1 s L! m+ p& S5 kvmlinux.bin文件下载过程中,如下图所示:$ h+ i4 H' Z: A7 H' ^8 B
8 b1 o8 b# J% R( s. n; r% W
; t* W( {3 m* M, \ p# R' g
: _8 ^+ E# x' R* h
1 ^+ s: H) ~8 c0 V9 K0 [9 J+ e8 n
; ]1 r" x5 ~5 {0 u/ S下载完之后,执行tboot命令,即可启动linux:
, k& o+ }( S0 x/ u
6 [) X* Q$ N6 j. p! o( s
; o5 n- l/ b4 a# y( K, e; o& q4 Q: D# X+ Q0 ~6 c
在linux启动的最后,就可以进入shell模式:
# m4 {" i6 s4 P# L' z
$ z4 k" D0 E) F* p' t7 ]. i) m
# k. w- A. u+ @3 i7 k9 i
6 V: q, C0 s/ j9 G2 w9 h3 i, [; ]7 |9 C在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了。
5 [( ]4 D3 ?+ J& t1 Y/ B1 u; l6 u% L' Y8 y$ x: L, k
) `6 I- _) m! |: A! i
. R4 U0 s, y) r' v
8>启动u-boot. i* z* { l' U$ ?
从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。, D9 s/ ^) D; V f
8 e3 s$ j7 s+ g/ m0 v
执行:- e8 ^. Y# [; O' [: f
, O3 M5 K, h. G$ X& bmake ml501_config$ g$ g2 Y, C* C
make1 ? q" P$ C8 Z% v. ` Y
) s; f& `& A- K, J即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。; Z7 z8 u9 x" Z% Y" o) _1 u
如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。
' ?1 n2 H" ]( o0 J3 Y6 D% u+ T
1 _: {) i3 z, R& @如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。 w( j" [* z' o1 d- @
: V5 K" b8 N3 K
如果启动u-boot之后再启动linux的话,可以采用nfs的方式。) e' T% }; D% n1 j* _' h6 _* A
, v/ o- I* n" a* P) m
6 k% y+ _0 K, m. m. F. @# _. m2 k) E8 ~5 f* \
9>从CFI Flash启动软件3 d+ i) i$ P" C% B
如果想从CFI Flash启动,步骤如下:
, U3 l7 M. g$ X6 }0 m) `9 p: o7 j! c8 K4 u# P# v9 b4 V9 V
soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:
7 j* J0 A& k& N" |% G7 n2 n4 l0 Q9 _7 G; h* [1 y0 ~
make PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。. z2 `2 Z/ d. g; {* h: A
0 q! o# H& b+ Y! \5 _- B
用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。' T7 h8 V/ a9 b' O
' ]& ~1 l' h! I2 a( s修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。' j$ @- C8 `/ v
6 x( O& ]& d1 V9 B
; n2 n# q; L8 [. k& d) a
- A9 f7 n$ j4 Z& N; @2 K% f6 ~. ?8 H q: l+ k
+ Z. i% \* g% V* b+ r3,小结
9 A2 T- L4 o, \4 E本小节我们实现了从非易失性设备里上电启动软件。 |
|