EDA365电子论坛网

标题: #技术风云榜#烧写orpmon到ML501的SPI Flash并启动linux [打印本页]

作者: qsoiuwisjiuw    时间: 2020-11-17 15:39
标题: #技术风云榜#烧写orpmon到ML501的SPI Flash并启动linux

7 W  j$ u- L/ C' S引言
) R3 J. X& _# S, c0 H/ K& a1 X前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux。
2 v  E: _1 ]! O& |) \' a0 O# L- w4 P/ o0 [
采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。
+ d; E5 Q6 T" J. W! T# a: K0 \, N
+ L) l  B4 V9 v本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
! [" I! C. a9 f; |, I" a9 |6 u1 q5 ]

4 c" [4 H2 F$ K+ ]
1 d5 N! d9 L/ G) z) w3 g1,基本思想& R% Y4 {& H$ V2 `- `8 p- E
首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。
9 ]$ V& t# f9 J5 o# q6 q; i# X" \6 m* b
: D4 c2 O. k% ]$ Y1 m- H& W0 A+ }
6 T) u  {" c3 A9 O
2,操作步骤9 b1 ~* ]7 \+ T, u8 L% \
本实验的基础采用的ORPSoC和orpmon以及linux。* d$ u/ H# a3 F; Q# R: R# D

. h( o! N4 F  Z# u& ?6 `. \8 ^此外还要注意以下几点:
2 \# G6 M9 D/ ?, V* M8 l1 d% Y7 u# b- t( W' G
检查一下ORPSoC的启动地址是否为从bootrom启动。
1 O7 V0 x, w* f& Q/ U
2 Q) V3 u( s1 o- c9 g- Y. Q) |, E. \or1200_defines.v:% p5 V* w3 A" o4 r# x

; @$ u/ o2 w8 W: p0 p7 a/ |: I) d: t8 c8 C+ y2 |; H

5 }* }$ z/ T5 |; j* G* ~// Boot from 0xe0000100' @- y' a, i( a! S/ u
`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f
  V; }. r* N- T" _- z`define OR1200_BOOT_ADR 32'he0000100
; D- X1 H/ K/ Z: K, D) Y8 p* R- ?3 N# k
正确生成针对ML501的bootrom.v。! F+ x- Z0 c" U( n# ^, c3 {" l# D+ P' P
确认没有问题之后,我们需要对ORPSoC进行以下修改:
% q. V, [" {- r2 ?5 ^( p0 m: c9 `. I( F1 H% @! @
1>FPGA配置文件的生成
* |$ A- X' a) G2 `! _3 ma,使能SPI模块& n5 Y9 r2 R7 J
! a# d1 q" Y- a6 C" M3 |
由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。/ Y! Z2 f$ m: G; m* C% e6 o4 z

2 x: ]* A0 z7 N" Q/ Qorpsoc-defines.v:8 A0 J& l& k( ~( I% a% c5 o. {

/ p4 U/ t) `, l. s 9 j( f$ T2 h& F5 q

0 _9 O. V2 i3 m) |5 ~. X* o1 ~
+ |) a+ W6 ]# e* H- w4 s" M9 Z  W9 Y. T
b,修改ucf
6 Z' W- M& Q# n1 j9 ]
4 h' o3 K9 k+ |* Y4 f$ _. g使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:6 T9 K  \. X8 M/ f) e1 J
! S4 x$ a& ]9 w8 t! }
ml501.ucf:
3 S: u4 |( \# I- }, l4 l9 ]9 M# Y: ^: Y- E& y
SPI的引脚分配:
2 m' O- E" I, c8 D6 L, l) y7 ~; _& O' f& R5 `

2 e& o: t6 p: g  H$ ^* P' l+ ~/ W7 S
CFI 的引脚分配:( w* `0 R5 K- E2 w% f. f
5 ^# w* s) |- N. j
2 L7 P! ~7 l* S

9 U" E8 K6 k5 L( p9 {# @从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:
5 f4 M, E3 h. h* A: w9 q
4 L! x% P& _: j2 f* c- e# m& E6 f* m; ?
- Q# _% V# B7 ~6 H! h! \/ l$ u5 I1 e; L) t6 w

' a1 b- G7 D( h) I! y7 N6 n- ]! m$ [$ v8 B7 c+ t7 }
c,修改ise生成bit文件时的配置参数
" g* k8 s$ ]' P6 `- i7 B+ \
" f0 w1 ?3 c" w- B在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。' y+ s; I3 F7 ^
  o0 ]' z6 h5 L7 X. w, R
d,综合生成orpsoc_top.bit文件
& k6 U& O$ s1 I4 G: ^: v) J; Z' m  X! b9 ?
用ise综合生成orpsoc_top.bit。+ C  `/ }6 V' M7 M' b  T
  p( v% P7 L0 S; H9 J* Y

/ E/ z- {! R& y8 @2 ^
% o& V% _) u' x: L  r2>orpmon软件文件的生成* k7 C! B& t0 E8 H4 c( b6 |& ]; a
a,修改开发板类型
+ s- g) f5 j9 D0 e" M" e4 B- A0 p+ L
orpmon/include/board.h:
5 U* Z* r4 P. L6 _4 Q) z0 u0 \- }0 A) n* c0 E7 L6 ^

% i- M3 A$ D, t
5 N2 y" C9 V) I- |$ ?6 a0 E3 `
) \& p: D' @- I" S; X& _& f& B
. e5 J9 t$ [  b3 o' mb,修改时钟频率/ a4 N' {" A, I

8 M* d( Y0 H6 c: A- g6 Rorpmon/include/board.h:1 Q5 L+ g- g: c4 C1 n. `

) Y0 |- A, v, m6 ` 4 B) L. D) S' [3 R
$ S/ R; g! H7 T2 `: Y  ?
c,编译生成orpmon.or32.bin
8 b% q8 V9 T* R
  I% L8 u& |) z- D7 E; Q在orpmon目录下执行make,即可生成orpmon.or32.bin文件:& d9 J2 k. a. b6 d& v& ^

8 d, z" s/ O$ N+ f" I, U $ i, X1 Q9 K7 L) V; v
; W8 L$ F; [2 }( x
, F  N1 l. _9 u# P
: h9 E0 }% t9 a
d,生成附带sizeword信息的orpmon.or32.szbin文件
% q: U) M4 _3 o) g
2 U! `: \3 @. m" B% ], f向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:
0 O% E  |3 [1 z+ X$ d1 y' `0 f- K' E  {  U. G8 i

3 s+ O" i3 j/ d) r
6 Y+ G0 G% v. d; U* z% W8 y- R3>SPI Flash格式文件的生成(.mcs文件)' J7 W+ L; Y3 V5 H- E+ T& V& W
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。
- p/ c) w& K9 C
6 g8 @/ t! D; s( G  d  ja,采用图形化界面
0 Z2 q# d) w* ]2 T' n8 |' g
' w" J9 @3 p! |4 e# X) I打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。+ ]1 k: X1 ^1 ]& Q: g1 D5 Q: N' i
4 Z; p; p2 h9 _# F2 w3 I

+ C9 @. c6 J/ l" d8 a+ z8 N' T0 W8 w3 z# C3 _
b,使用Tcl命令生成mcs文件$ k: P& ?1 Q* K9 A& S# a

- h- G. ~% C( R% E6 s9 v+ z除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:% T% B- b, E; h

( c+ u  N, a8 Q6 d- d1 J打开ise,view-> Panels->Tcl Console,打开Tcl终端,执行如下命令:
# W: ^3 A. W& b, j7 [% {& z* I. A0 x7 B/ m5 |7 R9 `. ?4 I( M

. }" I; m! G5 g. f/ H( z+ B: R& H0 E2 J0 }/ b  g2 z0 v6 b
promgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin$ Z$ Q: Q; y9 d& X% p( u- Y# [. l
4 ~9 `& \9 \/ k2 b
其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。) M' |" ]9 M! u6 n
mcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。; d0 p: Z) i6 O0 o5 f$ b
4 T! o0 [* e& l7 d" B, M
  a0 m3 m9 b8 j) X3 T8 X4 |9 T
9 X. t0 h3 E! B2 T! u
4>用iMPACT将mcs文件烧到ML501上的SPI Flash中& B8 K4 ?% S) A7 y/ ^
在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。+ ]* t% j9 W5 H  c3 u
% z! a( A+ [4 C

7 ^2 v1 y2 F% G7 y. L1 n2 {, i4 c$ U" T8 a; _$ m: ]% _. r1 z* p8 x( B
5>启动orpmon0 r( }9 I+ k# u/ X& G
mcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。
; ^3 D; j& S. V- [( c: R1 L3 ?% H2 D% l0 C* I1 k
和直接采用or32-elf-gdb下载执行的结果一致。
( Q9 ?  z4 O' Y1 C8 ?5 ?( C- I* L6 D7 w2 m  g  [3 t) E
6> PC端打开tftp server- C* V' Z1 K- {0 K% i7 T
在orpmon启动运行之后,我们就可以通过tftp下载linux了。
% c0 y* K" `; m1 f* }* a, n7 w$ z9 D
首先要在PC端建立tftp server(tftpd32.exe):* U+ D" H9 Q1 Y- J5 a

4 N+ T: V/ J+ T0 Z指定vmlinux.bin文件的路径,设置server ip。) Y% T, }% |' @8 a

) s6 y/ s! d8 _$ {通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:  A, z+ Y+ M2 v$ @

0 [  h4 x$ l+ E& ~ 8 G% F" c& e# Y- j8 t

/ }' c0 j$ n. m) k; G, j根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。
5 Z4 o+ u, z* e; q* x/ J
) B8 C7 j. g# I6 k* q' X ' Q$ K: G9 t2 ?) R& J: x, i4 Y

0 [, Z9 ?5 n  M  B: l/ Y' C+ v7 L+ a# |! B& X, f7 |

+ L% F( ^7 [% N7>用orpmon下载vmlinux.bin文件
& k& Z! {6 W: ^1 e% GPC机准备好之后,我们就可以下载linux了。) H% ~6 s1 p% ?& j3 ?' b

# C4 K; o% V  Y: t% s- C6 {首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。, K/ o) y# U1 W
$ Y6 d6 J0 E$ p
然后执行‘tboot’即可完成linux的下载和执行。
* R% h! i( Z& s1 c
( ?9 @- M# p  F7 O2 O这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。: q4 v- v) J0 X, u9 ?8 h& t% ]
7 J2 ^, N6 F0 U
vmlinux.bin文件下载过程中,如下图所示:
$ ?3 b6 W( k/ q! o+ _) Y- W& Q, z) N; `. B0 g$ m, r, W& b% q
& X" U, x9 `4 H5 X* ]  m& j' z( i7 |

1 O* P7 R3 ]' y" z9 @+ I- q 7 n3 U8 {, M. t

0 ?4 z- d$ N/ @- E* e5 o$ d下载完之后,执行tboot命令,即可启动linux:
; R4 B2 {: x0 b2 Q$ r7 U+ ~' `3 v6 @6 h
7 D2 r* R( t  c* C: O9 [; i, f- s
5 U+ _/ P; [2 O8 S' h/ B( }0 D3 a
在linux启动的最后,就可以进入shell模式:
/ b1 ^, E+ c. v8 d0 v3 Q1 ?4 ~1 B* h9 F" H
' k# e8 [- ~1 r, a  f% N, I7 F4 T
1 Q6 u! n; x6 T) \; X
在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了。
. k6 ?! `6 z. Q7 m7 j) A9 D- O7 V- h8 m% i8 @. N- }  q7 h( Q8 R0 {, Q

/ K) }. w. W" A/ K& A: y, ~, q: V
8>启动u-boot
1 v* m1 o: p) v* J+ E6 }: j从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。
3 a1 i& N% _- s3 d( E- z3 Z% k0 D' U9 i4 f$ i: ?
执行:$ P  L7 z; }* Y, Z) ~
% m: f7 x% A! J( {) l% m
make ml501_config
% m. b" C+ g0 n" P7 }make" T5 ]  h9 G  p3 e1 x2 g7 `
2 H$ `5 |# c+ {
即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。9 k' E) _" c) W* m
如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。7 s# @0 }. B9 M( r8 c
  J) x/ X& G' Q8 `
如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。4 a4 P; U, R" `3 ~/ z

$ V6 i9 l( ?) F+ u* N3 d如果启动u-boot之后再启动linux的话,可以采用nfs的方式。6 Z9 h/ ^: o9 x0 B
+ T0 N( N- U2 w2 t  S2 ?# D2 G: O9 ?

- ~9 t7 e# T# b+ ]/ w/ Q7 J1 u
9>从CFI Flash启动软件
% j4 }7 I* O2 z! \! H5 o如果想从CFI Flash启动,步骤如下:. l, h. W/ U- R- T3 G0 t
+ a( a  c6 e8 R9 A
soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:
2 y' X. p8 g* j3 U- x7 N9 t6 K' |4 W/ ~2 W* W4 W5 c  B
make PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。2 {" f; Y3 q7 @, x2 Q( j  b

% Q% V" f. G" L. U5 p+ d. k用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。" S1 E' `* R. n7 S' Y

3 ]% U' R! K* j8 e& l修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。
- ]4 R" o" u' H' |, t& N
# q4 D" ^; M5 _# u0 V" P; l$ V
, Y1 u" S8 [7 W3 w& W9 C* r5 i1 _4 ~  f* \
0 i3 O, z/ M2 \6 ?# h

1 ]6 d6 e+ M7 k0 P9 W9 Z1 p3,小结) x. c$ J" }. D5 H; ?5 U
本小节我们实现了从非易失性设备里上电启动软件。
作者: CCxiaom    时间: 2020-11-17 16:45
烧写orpmon到ML501的SPI Flash并启动linux




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