找回密码
 注册
关于网站域名变更的通知
查看: 425|回复: 1
打印 上一主题 下一主题

#技术风云榜#烧写orpmon到ML501的SPI Flash并启动linux

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-11-17 15:39 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

5 K0 U3 z  g2 Q5 j引言. |  W# V/ ?. j2 p0 O
前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux。
7 [6 [5 @/ @! `) r2 Q) R' Y2 }
9 q; B/ t# x1 i% R' l# a! A采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。
, ~1 `% D0 S0 G9 o# J1 m! F
! F) p; r" k  l; [9 T, U本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
4 |8 Q6 b0 }6 g) L; m! E
5 b$ T! _1 V" E! d6 C! m8 V
& s$ {9 w$ z" g! ?" }5 \' Q4 I
$ ~7 S* _# W+ ?0 C0 h/ }: ~- v. M1,基本思想
* S% x0 @( L% l( q, q+ p$ U首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。) Q. e! D1 K+ [, C! @5 Z
  N( {" }/ {  w9 i) U+ r

- U- _  x2 T0 w! o% [' u' v! v& i$ W
2,操作步骤
9 r, h% }8 p' q9 I5 p本实验的基础采用的ORPSoC和orpmon以及linux。
% E3 v+ x- v+ P( x" g/ V; B  l, u* ]( q
此外还要注意以下几点:
) l0 l! T. j+ p5 h- t  A9 _1 {- u1 T- l1 Q6 p% ^
检查一下ORPSoC的启动地址是否为从bootrom启动。1 ?8 g( ~9 k  ?
* t$ b$ H0 i, C8 F6 I+ d9 W5 _
or1200_defines.v:
+ [! `; Z$ w8 L. E7 D+ R, g% n5 u
$ X7 p! Z. ^1 O' O  W4 U. ~
1 r) m' l% j- N! p+ a; o7 n
// Boot from 0xe0000100; m2 E. }2 _. x1 G
`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f7 ~/ N+ M& x! O* q& ~/ I
`define OR1200_BOOT_ADR 32'he0000100
, L/ t9 u% i- s8 Y, L% j( E" j5 f% w: ~; X( A
正确生成针对ML501的bootrom.v。
' R( p1 u- |5 r确认没有问题之后,我们需要对ORPSoC进行以下修改:! X8 \$ W! O5 f# p& g, S

) |7 j5 ]- |3 [2 D1>FPGA配置文件的生成1 x) ]1 C" u4 v5 V5 A9 n) N6 _( g
a,使能SPI模块
$ m: P9 M! G' \3 H0 S! S* _9 L2 i% }/ A( ~9 f
由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。
) f% w3 t0 c; F
+ j- k) i. c4 ^. g. s; d, Norpsoc-defines.v:
1 i6 v8 R$ M9 A/ O* {2 b
+ C4 u2 \9 o- ^4 d1 {  p; o# q
6 C: b! n* F- f+ k8 z  b9 T& u5 s) }* ]5 }* `  F' Z
7 T6 N) ?( w& J) L# J# P$ m( L! i

# [3 u1 i7 A' Y" Y) {  A. Hb,修改ucf+ Y# ~2 G. l" g1 o0 k

9 a# N( B6 O1 `使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:! v: w) N. j! \' q  s

' x1 Y5 A' e- H/ Gml501.ucf:% i4 N5 o* ^$ t

) Z: C' T) E# U* k# d7 \1 W' n/ gSPI的引脚分配:6 f' r- z, }3 k0 @

3 o9 J. y1 n1 T! U- b6 n& B: w ! O$ I6 \3 c. R: ]6 E6 j6 i( r& b
0 T; h, G/ ~. L" S
CFI 的引脚分配:
/ l4 R" e. l  g) o
1 \+ O6 l- n/ i+ `# }: Q9 I 0 n  N# A+ a2 o) t* B
# z/ q# D* Y$ Q5 }! z, M0 d
从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:" {* D# P% V4 H9 t6 M+ H+ c2 Y
$ [0 ]6 V7 x$ G6 Q. F& l3 A5 Z- ^
0 J. y! S+ }1 {, Z
- c' m) n/ U5 ~' P1 R
' O- Z6 D9 J  T. n7 R

5 C$ T7 n% {7 H! Bc,修改ise生成bit文件时的配置参数2 t$ R3 _% h+ Q! i: N

" J/ y, h( D* Q在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。" _  S( M* a: z

* R6 b/ C% _- ]  {& T0 id,综合生成orpsoc_top.bit文件- ~" E4 q( Y) u% C: b

6 M- [1 f2 [% G6 v8 L用ise综合生成orpsoc_top.bit。( j. X) K4 [% z+ I4 K* e& V5 X
$ g3 q$ q1 I1 w# Y' }: B- h/ \0 S

  ~  ]# W3 n; |# Q5 l8 C8 F2 N( V  L- p, P. I
2>orpmon软件文件的生成. o9 q2 Z* m' g+ a$ N
a,修改开发板类型
! I- I, x2 }1 D6 t3 z% s# t5 d( w* Y+ K+ G( b8 ~
orpmon/include/board.h:
- V5 ~+ ]: {9 g( f: z+ F( s
" T: s3 i5 h: g$ \: j
( j4 T7 f1 u# w4 h+ A. q' ], C$ @# g8 v# t; J

2 g* ?' W5 S' J! q% u* g& u! m- A  |5 D* }) h2 _# ~' ^
b,修改时钟频率
5 H/ [# K" B) p7 u6 F* n. o, G: P- @' N5 n* ^" q4 E1 M
orpmon/include/board.h:0 ~( T5 z2 z5 d

4 P  f5 @. w" W, h: H 2 x( G- ]& r% g' q$ R9 v6 t

/ B" s  \2 P8 x& Kc,编译生成orpmon.or32.bin8 ]/ o1 _* Y# X* W# F

7 J! f4 }3 U. h' c3 ]2 n* i7 o, G在orpmon目录下执行make,即可生成orpmon.or32.bin文件:4 D9 s0 U6 o& u$ L7 p  }

* Q/ j0 h1 w+ q4 `% K% t7 r# ~. C
4 o- B1 R9 n3 X% e8 \8 w6 m6 R, a* H0 Y( R7 {0 z$ i

, u; l( s/ N5 r( F8 f  _2 c: f6 V% ]) n0 z% D5 y2 O5 D
d,生成附带sizeword信息的orpmon.or32.szbin文件
9 [8 Q; U; q7 s
3 H5 G, a: E/ J; n向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:! l1 j9 P* o  F% J* a2 B

' q' n" M# w5 b
4 [$ O. k1 x& }) B
' S& N* O7 w* Z' z/ G! N% W5 K3>SPI Flash格式文件的生成(.mcs文件)- ^$ H7 e+ w+ c, \5 |8 U5 P1 E2 x
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。
: N& o4 L+ ^  l7 w& U' m5 |  Q; |/ D' O+ {% G$ i
a,采用图形化界面6 G; N1 \& X9 h5 {

! ]+ S( M; O4 ]: }  U7 @6 E* [打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。0 e3 c- W% Z! L& v0 u" x! Y& f0 J& O
& V: K& V  @  P' y6 f& h! Z

. F- E% x# V7 K4 L
% b% I  d, w9 u- G) l# {, Eb,使用Tcl命令生成mcs文件
, s  }! G/ N( M$ C8 U: C
8 [* K9 i+ a4 a6 [" \除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:9 [, W4 p4 K% O" G3 P
# a6 t/ |/ w$ T6 }0 Y6 ^
打开ise,view-> Panels->Tcl Console,打开Tcl终端,执行如下命令:, {% i. M% Y! m, B$ U+ H
" ~) I1 Z  u6 A/ N; l( k5 E

+ R6 u6 @2 t  {7 D8 V6 U! D; q
5 E1 K* F  h8 h+ ~0 xpromgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin
7 S  g0 M) v( Y
5 C! Z+ h) ^. w+ k' W- s/ H其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。
1 e+ S7 F+ S4 ]% O0 z2 t0 w4 h" Omcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。# u2 U1 V" I8 @, V+ H6 H
* r8 ~, O3 T( L  S0 q9 ^* C

8 Z* w1 s& s+ e  ^( ?2 c' l9 G  N# C8 Q
4>用iMPACT将mcs文件烧到ML501上的SPI Flash中
: @; k. N6 B6 \5 j/ m1 `/ U在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。: E0 _2 k8 ~& [4 N$ ]( L$ q4 K
$ w5 d/ w' }) C/ c

) u. u6 B: e# h$ A9 G3 {. H5 c4 w4 B' u% `$ W4 U  o
5>启动orpmon
' n, `3 k3 U# |% @mcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。
  b7 \* n3 {: _5 q7 \: }6 ?5 B! [$ W( o% t) g/ a
和直接采用or32-elf-gdb下载执行的结果一致。
- m$ ]) S, K: v. c9 d, |4 p3 t+ p+ m" ?% G: L+ U7 k
6> PC端打开tftp server5 y$ F0 Y# p/ m9 Z' W* c1 A
在orpmon启动运行之后,我们就可以通过tftp下载linux了。/ |' L% e  D6 y$ A3 {
8 _4 X/ q; ]5 I* B0 ?5 h0 s! T" {# u" ^
首先要在PC端建立tftp server(tftpd32.exe):
, e, g9 Z; ~) Y! F% D4 L
" V% V+ i6 C5 C+ E- j1 m8 Y" Y/ W指定vmlinux.bin文件的路径,设置server ip。5 |' ?' ~/ B; ]% G' s6 Z( K
% ^/ |* i( d2 {3 U6 |& \/ V
通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:
8 O. H. ^2 g* O& Q- s  ]4 T5 n# j4 x  j5 `
. ^0 z( d# v8 y
2 b0 L1 i3 y8 g' s  x2 f
根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。
8 Y0 B; }6 ^( E7 ]
8 ~0 O& f$ m- u6 j& i4 K5 Z$ {7 A , {. K& u& |6 x: l1 L
; s6 N# I% e+ r" A  N- N6 L$ E- [

4 G1 @$ [  U" _7 m! S1 L
" w* M. A7 ?2 i  B) R7 y7>用orpmon下载vmlinux.bin文件
. q5 G! m8 u! {7 z: ]PC机准备好之后,我们就可以下载linux了。
- j! F: Q- c; s2 [# O( n5 Q" j
! t4 B9 n) S  g. c首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。& v! f# ]) K4 j- s. ~* |
8 A" q8 Q9 e" F& W3 @" T* X
然后执行‘tboot’即可完成linux的下载和执行。
. B" H" `6 j  m/ F0 w8 `0 D. C
  R$ ?) `( X3 @这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。
& w; f$ I6 K  q8 i& ?0 g0 d% E, Q' h1 B4 ?9 ~; z4 w$ |! C6 G
vmlinux.bin文件下载过程中,如下图所示:8 |# o9 D4 h- H) y

: l" u8 E0 }; F' U5 J: t* f
) C6 a; K$ q% D5 c/ n! j& z& r
: r# }$ s5 J0 N
8 D7 \. D! g/ O7 p( G1 h
: ~+ G# {  o+ ]5 U下载完之后,执行tboot命令,即可启动linux:1 s# ^" z% O) f/ |

7 T3 Y+ w1 d" J2 m6 Z2 u5 \ ( o1 B6 b9 A) C4 C) H* E* b
$ B9 A& c, d( S% R6 L
在linux启动的最后,就可以进入shell模式:
; E  \% T$ O* w$ Q2 U. R) H) h0 P, C2 I6 W% J8 X& d( z% x
$ x$ o/ {4 a7 R: h7 T5 \* S
$ J1 g9 E5 B" }; c+ G
在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了。
1 E# h& c% l1 |. X) H) j2 I! O5 E8 T2 }' l7 \
# }' p$ i4 y! E- H
* k1 [5 y( a2 A* K, J( v
8>启动u-boot
& q8 v; M/ @/ D5 Y! g; _6 W从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。- L: G7 i: F) {+ Z/ i$ y
, K: O( g5 V" n& z2 v- L
执行:" l# H# F2 d( z! p0 m! U, o  u' R
. O, Q7 V1 R4 o! W
make ml501_config- q/ w, e% \, v4 \
make
4 E3 \9 J" V# z% j0 l# S8 h
6 e6 ^7 F4 H* J0 ~! K3 I即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。
9 ~3 b% w. b7 Y" y+ c" o如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。
+ |* O# Y& t' x* ]: u4 p8 M& C& T+ t7 @' m8 c
如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。
1 i$ G& |+ U, Y; X5 w. s; G9 s! g- E& D: |) f: x
如果启动u-boot之后再启动linux的话,可以采用nfs的方式。: w5 r: S8 k! t; W/ `

: B0 `3 t* A" z; o/ E8 i
! H: K. H7 y2 p9 D3 l
8 [6 S4 S& d/ \0 e) w5 a$ D2 x9>从CFI Flash启动软件, S" A7 s+ n# T' l( [7 G2 H& F
如果想从CFI Flash启动,步骤如下:. X6 w# [& D- ~4 I! K

3 _% G/ r5 {. G7 j  [soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:1 S" s9 Q" _  ~

+ F  Q  S8 o3 f' cmake PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。
$ z5 @" `* N( F% s  K6 b3 I2 m! R* ?: X) j* y2 Z
用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。8 p+ v( l2 j; |' G. [
$ h6 g( m" F( A6 f! W
修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。
, E: N5 {( r% E$ I/ A5 `
+ T6 S" t6 P1 D7 C/ F: Y2 C/ P8 }- G6 u$ Q/ Z

- K& M- J* M( y2 ?7 V/ m1 j/ y+ [( ?% E6 R9 p- ~+ G( A7 a/ L

/ ]% }) H. @. |3 ?3,小结
, a- E- g7 I, @4 \本小节我们实现了从非易失性设备里上电启动软件。

该用户从未签到

2#
发表于 2020-11-17 16:45 | 只看该作者
烧写orpmon到ML501的SPI Flash并启动linux
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-24 21:06 , Processed in 0.171875 second(s), 26 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表