一.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) 這樣啓動時就會自動執行初始化腳本了