MyFPGA Forum

 找回密码
 注册
搜索
查看: 2461|回复: 0

Altera-SoC QSPI烧写指南

[复制链接]
发表于 2020-6-24 18:01:50 | 显示全部楼层 |阅读模式
一.preloader、Uboot生成以及烧写

1) 在SoC EDS中输入bsp-editor打开bsp编辑器

2) File->new bsp新建bsp,preloader settings directory设置至Project Directory\hps_isw_handoff\*_qsys_hps_0文件夹
NEW.png
 

3) 勾选BOOT_FROM_QSPI,并设置QSPI_NEXT_BOOT_IMAGE地址(默认0x60000),即需要将u-boot放置在0x60000起始的存储空间里

4) 在sofware\spl_bsp文件夹下make,生成preloader镜像preloader-mkimage.bin,make uboot在uboot-socfpga文件夹下生成u-boot.img。

5) 在EDS下使用usb-blaster将prelader和u-boot烧写进qspi flash。

a) Quatus_hps –c USB-Blaster –o PV  -a 0 preloader-mkimage.bin 

说明:-a即为写入的地址,quartus_hps工具要求写入文件名为.bin扩展

b) Quatus_hps –c USB-Blaster –o PV –a 0x60000 u-boot.img.bin

说明:将uboot.img重命名为u-boot.img.bin否则可能会出错

二. Linux kernel编译及烧写。 如果需要编译内核驱动或者增添裁剪内核,需要重新编译内核。

    首先虚拟机联网。然后获取3.9版本内核,在虚拟机中解压。

1) Linux环境下安装所需要的开发包,以CentOS为例
  1. Yum groupinstall “development” 

  2. Yum install ncurses-devel ncurses 
复制代码
2) 配置环境变量
  1. Export ARCH=arm

  2. Export CROSS_COMPILE=arm-linux-gnueabihf-
复制代码
3) 到解压后的kernal目录,执行make socfpga_defconfig,目的是将内核按默认的socfpga参数进行配置。然后执行Make menuconfig 进入内核配置

4) Make

编译完成后,可以在arch/arm/boot 下找到编译好的zImage

关于kermal 与device tree的烧写qspi flash地址,可以在板子的boot阶段,通过printenv查看。

在boot阶段跟新Flash zimage步骤如下(提前打开tftpd32工具,将zImage放入basic directory)
  1. Sf probe  #加载flash模块

  2. Tftp 0x1000000 zImage #将zImage下载到内存16M位置

  3. Sf update 0x1000000 0xa0000 0x390000 #将内存16M开始的位置写到Flash 0xa0000的位置上
复制代码
也可以使用usb-blaster,在EDS command下,用jtag烧写到qspi flash,比较慢。
  1. Quatus_hps –c USB-Blaster –o PV –a 0xa0000 zImage.bin
复制代码
三. 修改文件系统。可使用yocto工具生成根文件系统(参考RocketBoards.org中Using Yocto Source Package的叙述)。提供altera-gsrd-image-socfpga_cyclone5,altera-image-minimal-socfpga的压缩包。

制作jffs2文件系统
  1. mkfs.jffs2 –r ./fs –o fs_minimal.jffs2 –e 0x10000 –pad=0x7000000 –n
复制代码
-r 文件系统源目录

-o 输出文件名

-e 擦除块大小,参照芯片手册,一般为64kB

--pad 目标文件大小

在boot阶段跟新Flash文件系统步骤如下
  1. Sf probe  #加载flash模块

  2. Tftp 0x1000000 xxx.jffs2 #将jffs2镜像下载到内存16M位置

  3. Sf update 0x1000000 0x1000000 0x7000000 #将内存16M开始的位置写到Flash 16M的位置上
复制代码
#Flash 大小为128M,后面112M为文件系统,在device tree中有定义

对于生成好的jffs2文件,也可以使用usb-blaster,在EDS command下直接烧写到qspi(特别慢,不提倡用)。先重命名为jffs2.bin,然后
  1. Quatus_hps –c USB-Blaster –o PV –a 0x1000000 fs.jffs2.bin
复制代码
四.Device tree修改、编译及烧写。

1) 编译devicetree

Quartus工程编译好之后,有个device tree文件夹,有dts文件,即为device tree文件。修改其中的part0,part1。其中part1为文件系统的flash地址,定义为0x1000000,长度0x7000000.
  1. part0: partition@0x0 {

  2. label = "Flash 0 Raw Data"; /* appended from boardinfo */

  3. reg = < 0x00000000 0x01000000 >; /* appended from boardinfo */

  4. }; //end partition@0 (part0)

  5.  

  6. part1: partition@0x1000000 {

  7. label = "Flash 1 Root Filesystem"; /* appended from boardinfo */

  8. reg = < 0x01000000 0x07000000 >; /* appended from boardinfo */

  9. }; //end partition@800000 (part1)

  10. Windows在EDS下,Linux使用终端命令(首先安装dtc工具)

  11. Dtc –I dts –O dtb  -o devicetree.dtb dtsfile.dts

  12. (-I –O分别为输入输出)
复制代码
使用usb-blaster,在EDS command下直接烧写到qspi

Quatus_hps –c USB-Blaster –o PV –a 0x50000 devicetree.dtb

五. 生成rbf文件以配置FPGA

Fileàconvert programming file 

选择RawBinaryFile  Mode选择Passive Parallel x8或者Passive Parallel x16.

选择SOF Data项,Add File ,浏览至编译好的sof文件。然后Generate
选择.png


在Linux下配置FPGA

a) 编程 dd if=/home/root/output_file.rbf of=/dev/fpga0 bs=1M。可以将此命令写入脚本中。

b) 查看fpga状态: cat /sys/class/fpga/fpga0/status

Linux启动以后要确保启动f-h,h-s桥使能,配置fpga。

在Linux下配置FPGA。
  1. dd if=/home/soc_system.rbf of=/dev/fpga0 bs=1M

  2. cat /sys/class/fpga/fpga0/status 

  3. echo "enable bridges"
复制代码
使能f-h,h-f桥
  1. echo 1 > /sys/class/fpga-bridge/fpga2hps/enable

  2. echo 1 > /sys/class/fpga-bridge/hps2fpga/enable

  3. echo 1 > /sys/class/fpga-bridge/lwhps2fpga/enable
复制代码
加载内核模块

Insmod xxx.ko  将内核模块加载到系统

Mknod /dev/xxx  c 245  0 在 /dev/下创建设备文件节点。C 表示为字符设备;后面两项分别为主设备号和次设备号,可以在模块源码中查到。一般提供的内核模块(如i2c)在加载时会自动创建设备节点

六.启动脚本

一般Linux原始启动脚本在/etc/init.d中,并在rcX.d下建立符号链接。以start_work.sh为例可以通过以下方式加入启动脚本。

a) 将start_work.sh复制到/etc/init.d中。在/etc/init.d文件夹下可以看到所有的启动脚本,以及rcS脚本。rcS脚本中定义了启动脚本的runlevel为S,即将会依次执行/etc/rcS.d下的脚本。

b) 在rcS.d下建立指向start_work.sh的符号链接。/etc/rsS.d下的文件命名都为S+数字+名称的方式,文件名表明了该脚本会在何时加载执行。初始化分为00-99个阶段,我们可以把我们的脚本放在第九十几的阶段上。例如:

Ln  -s /etc/init.d/startwork.sh /etc/rcS.d/S91startwork.sh

c) 这样启动时就会自动执行初始化脚本了
————————————————
版权声明:本文为CSDN博主「LakersNation」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/LZY272942518/article/details/50923102
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|MyFPGA

GMT+8, 2024-3-28 21:55 , Processed in 0.046194 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

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