OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux

引言

前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux,如有疑问请参考(http://blog.csdn.net/rill_zhen/article/details/17142327)。

采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。

本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。


1,基本思想

首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。


2,操作步骤

本实验的基础采用(http://blog.csdn.net/rill_zhen/article/details/17142327)中的ORPSoC和orpmon以及linux。

此外还要注意以下几点:

检查一下ORPSoC的启动地址是否为从bootrom启动。

or1200_defines.v:


// Boot from 0xe0000100
`define OR1200_BOOT_PCREG_DEFAULT 30'h3800003f
`define OR1200_BOOT_ADR 32'he0000100

正确生成针对ML501的bootrom.v,如有疑问请参考( http://blog.csdn.net/rill_zhen/article/details/16880801)。

确认没有问题之后,我们需要对ORPSoC进行以下修改:

1>FPGA配置文件的生成

a,使能SPI模块

由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。

orpsoc-defines.v:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第1张图片


b,修改ucf

使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:

ml501.ucf:

SPI的引脚分配:


CFI 的引脚分配:


从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第2张图片


c,修改ise生成bit文件时的配置参数

在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。

d,综合生成orpsoc_top.bit文件

用ise综合生成orpsoc_top.bit。


2>orpmon软件文件的生成

a,修改开发板类型

orpmon/include/board.h:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第3张图片


b,修改时钟频率

orpmon/include/board.h:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第4张图片

c,编译生成orpmon.or32.bin

在orpmon目录下执行make,即可生成orpmon.or32.bin文件:



d,生成附带sizeword信息的orpmon.or32.szbin文件

向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第5张图片

3>SPI Flash格式文件的生成(.mcs文件)

在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。

a,采用图形化界面

打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第6张图片

b,使用Tcl命令生成mcs文件

除了采用图形化界面,还可采用更加方便的Tcl命令生成mcs文件:

打开ise,view->Panels->Tcl Console,打开Tcl终端,执行如下命令:


promgen -spi -p mcs -w -o orpsoc.mcs -s 2048 -u 0 -data_file up 1c0000 orpmon.or32.szbin

其中orpsoc.mcs为生成输出文件名,2048为SPI Flash的大小(KBytes),-u后面的0代表mcs文件的起始地址,1c0000为软件数据的起始地址,orpmon.or32.szbin为包含sizeword信息的软件镜像的文件名。

mcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。


4>用iMPACT将mcs文件烧到ML501上的SPI Flash中

在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。


5>启动orpmon

mcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。

和直接采用or32-elf-gdb下载执行的结果一致。

6>PC端打开tftp server

在orpmon启动运行之后,我们就可以通过tftp下载linux了。

首先要在PC端建立tftp server(tftpd32.exe):

指定vmlinux.bin文件的路径,设置server ip。

通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第7张图片

根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第8张图片


7>用orpmon下载vmlinux.bin文件

PC机准备好之后,我们就可以下载linux了。

首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。

然后执行‘tboot’即可完成linux的下载和执行。

这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。

vmlinux.bin文件下载过程中,如下图所示:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第9张图片

 

下载完之后,执行tboot命令,即可启动linux:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第10张图片

在linux启动的最后,就可以进入shell模式:

OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux_第11张图片

在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了(http://blog.csdn.net/rill_zhen/article/details/17142327)。


8>启动u-boot

从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。

执行:


make ml501_config
make

即可生成u-boot.bin文件,替换vmlinux.bin,按照上述步骤,即可启动u-boot。经测试,没问题。

如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。

如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。

如果启动u-boot之后再启动linux的话,可以采用nfs的方式。


9>从CFI Flash启动软件

如果想从CFI Flash启动,步骤如下:

soc-design\orpsocv2\sw\apps\cfi_ctrl_programmer下执行:

make PROGRAMMINGFILE_SWBIN=orpmon.or32.szbin生成烧写CF卡的裸机程序(cfi_ctrl_programmer.elf)。

用gdb将cfi_ctrl_programmer.elf烧到RAM并运行,将orpmon烧到CF卡里。

修改ORPSoC的启动地址,为从CF卡启动,综合,重新将bit文件转换成mcs文件,烧到FPGA的SPI Flash里,重新上电,即可直接从CF卡启动orpmon。



3,小结

本小节我们实现了从非易失性设备里上电启动软件。

Enjoy!


你可能感兴趣的:(OpenRisc-61-烧写orpmon到ML501的SPI Flash并启动linux)