http://blog.csdn.net/lzy272942518/article/details/50923102
一.preloader、Uboot生成以及烧写
1) 在SoC EDS中输入bsp-editor打开bsp编辑器
2) File->new bsp新建bsp,preloader settings directory设置至Project Directory\hps_isw_handoff\*_qsys_hps_0文件夹
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为例
Yum groupinstall “development”
Yum install ncurses-devel ncurses
2) 配置环境变量
Export ARCH=arm
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)
Sf probe #加载flash模块
Tftp 0x1000000 zImage #将zImage下载到内存16M位置
Sf update 0x1000000 0xa0000 0x390000 #将内存16M开始的位置写到Flash 0xa0000的位置上
也可以使用usb-blaster,在EDS command下,用jtag烧写到qspi flash,比较慢。
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文件系统
mkfs.jffs2 –r ./fs –o fs_minimal.jffs2 –e 0x10000 –pad=0x7000000 –n
-r 文件系统源目录
-o 输出文件名
-e 擦除块大小,参照芯片手册,一般为64kB
--pad 目标文件大小
在boot阶段跟新Flash文件系统步骤如下
Sf probe #加载flash模块
Tftp 0x1000000 xxx.jffs2 #将jffs2镜像下载到内存16M位置
Sf update 0x1000000 0x1000000 0x7000000 #将内存16M开始的位置写到Flash 16M的位置上
#Flash 大小为128M,后面112M为文件系统,在device tree中有定义
对于生成好的jffs2文件,也可以使用usb-blaster,在EDS command下直接烧写到qspi(特别慢,不提倡用)。先重命名为jffs2.bin,然后
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.
part0: partition@0x0 {
label = "Flash 0 Raw Data"; /* appended from boardinfo */
reg = < 0x00000000 0x01000000 >; /* appended from boardinfo */
}; //end partition@0 (part0)
part1: partition@0x1000000 {
label = "Flash 1 Root Filesystem"; /* appended from boardinfo */
reg = < 0x01000000 0x07000000 >; /* appended from boardinfo */
}; //end partition@800000 (part1)
Windows在EDS下,Linux使用终端命令(首先安装dtc工具)
Dtc –I dts –O dtb -o devicetree.dtb dtsfile.dts
(-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
在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。
dd if=/home/soc_system.rbf of=/dev/fpga0 bs=1M
cat /sys/class/fpga/fpga0/status
echo "enable bridges"
使能f-h,h-f桥
echo 1 > /sys/class/fpga-bridge/fpga2hps/enable
echo 1 > /sys/class/fpga-bridge/hps2fpga/enable
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) 这样启动时就会自动执行初始化脚本了