前面,我们已经实现用or32-elf-gdb将vmlinux烧到ML501上的DDR2SDRAM,并成功启动了linux,如有疑问请参考(http://blog.csdn.net/rill_zhen/article/details/17142327)。
采用gdb的方式适合在调试和开发过程中,由于在项目开发调试过程中,需要频繁的修改和调试代码,所以使用gdb无疑是最好的方式。但是,采用gdb直接将elf文件直接烧到RAM的方式,是断电不保存的,要想让程序运行的话,每次上电之后都需要重新操作一遍,这对于项目完成之后,显然是不行的。这时就需要将软件固化到非易失性设备了。
本小节就来对ML501 SPI Flash进行烧写,实现程序的自动运行。
首先配置ML501开发板的启动模式为从SPI Flash启动,将ORPSoC配置到FPGA,ORPSoC选择从bootrom启动,bootrom读取SPI Flash中的软件内容(orpmon)到RAM,然后执行orpmon,然后orpmon通过tftp下载linux镜像,最终启动linux。
本实验的基础采用(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
确认没有问题之后,我们需要对ORPSoC进行以下修改:
a,使能SPI模块
由于针对ML501板子的ORPSoC中,默认情况下SPI Flash是关闭的,所以我们在综合之前要使能之。
orpsoc-defines.v:
b,修改ucf
使能SPI之后,我们需要给SPI控制器分配相应的引脚,但是SPI控制器和CFI 控制器有一个引脚冲突(AA9),如下所示:
ml501.ucf:
SPI的引脚分配:
CFI 的引脚分配:
从中很容易就能看出,AA9这个引脚存在分配冲突,由于MOSI是写SPI flash使用的,我们只是读SPI Flash,并且后面我们可能还会使用CFI flash,所以,我们这里选择把AA9这个引脚给CFI Flash使用。SPI只用3根线即可:
c,修改ise生成bit文件时的配置参数
在综合生成bit文件之前,需要startup clk配置为CCLK,而不是JTAG CLK。
d,综合生成orpsoc_top.bit文件
用ise综合生成orpsoc_top.bit。
a,修改开发板类型
orpmon/include/board.h:
b,修改时钟频率
orpmon/include/board.h:
c,编译生成orpmon.or32.bin
在orpmon目录下执行make,即可生成orpmon.or32.bin文件:
d,生成附带sizeword信息的orpmon.or32.szbin文件
向bin文件中增加sizeword信息,用bin2binsizeword小工具生成:
在分别生成bit文件和szbin文件之后,我们就可以生成针对SPI Flash的mcs文件了。有两种方式,可以采用iMPACT的图形界面,也可以使用ISE下的Tcl。
a,采用图形化界面
打开iMPACT,双击运行PROM File Formatter,具体操作过程这里不再赘述。
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
mcs文件的生成,请参考:soc-design/orpsocv2/boards/xilinx/ml501/backend/par/bin/Makefile。
在准备好mcs文件之后,使用iMPACT,将mcs文件烧到SPI Flash里面。
mcs文件烧写完成后,连接板子的串口到PC机,打开串口终端,板子重新上电,即可看到orpmon打印输出。
和直接采用or32-elf-gdb下载执行的结果一致。
在orpmon启动运行之后,我们就可以通过tftp下载linux了。
首先要在PC端建立tftp server(tftpd32.exe):
指定vmlinux.bin文件的路径,设置server ip。
通过orpmon/include/board.h中的配置可以看到具体的网络配置参数:
根据上面的参数,我们需要修改PC机的IP地址和子网掩码。分别为192.168.0.15和255.255.255.0 。
PC机准备好之后,我们就可以下载linux了。
首先在终端执行‘tftp_conf vmlinux.bin 192.168.0.15’配置orpmon的tftp配置信息。
然后执行‘tboot’即可完成linux的下载和执行。
这里需要注意的是一定要下载vmlinux.bin文件,不是vmlinux文件。因为vmlinux文件是ELF格式,不能直接将其烧到RAM执行。而如果采用gdb下载的话,需要下载vmlinux文件。
vmlinux.bin文件下载过程中,如下图所示:
下载完之后,执行tboot命令,即可启动linux:
在linux启动的最后,就可以进入shell模式:
在shell模式下,可以看到在文件和目录周围有类似乱码的信息,那是颜色数据,由于这个串口终端不能解析造成的,如果采用putty,类似乱码的信息就会消失了(http://blog.csdn.net/rill_zhen/article/details/17142327)。
从(http://opencores.org/or1k/U-Boot)或者(http://git.openrisc.net/cgit.cgi/stefan/u-boot/commit/)将u-boot下载下来,解压。
执行:
make ml501_config make
如果想上电直接启动u-boot,按照上述步骤,替换orpmon.or32.szbin即可。未测试。
如果想上电直接启动linux,按照上述步骤,替换orpmon.or32.szbin,但是,估计SPI Flash容量不够大。未测试。
如果启动u-boot之后再启动linux的话,可以采用nfs的方式。
如果想从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。
本小节我们实现了从非易失性设备里上电启动软件。
Enjoy!