Altera FPGA SoC搭建步驟


Altera SoC 官方搭建指南:

https://rocketboards.org/foswiki/Documentation/EmbeddedLinuxBeginnerSGuide

 官方文檔中除了講解搭建方法之外,還有很多原理性的介紹,感興趣的朋友可以自己閱讀。

 

准備工作:

1. 安裝Altera官方提供的IDE (QuartusSoC EDS), 不需要安裝DS-5. 文檔中的工作是基於v15.0版本

2. 一塊FPGA SoC開發板。官方Guide中的硬件平台是友晶系列的DE0-Nano-SoC,但對大多Altera板子都適用

3. 一台Linux主機

4. 一張SD卡

5. 網絡可以訪問github

 

搭建步驟:

1. 生成Preloader

2.配置和編譯Bootloader (U-Boot)

3. 生成和編譯Device Tree

4. 測試系統(一)

5. 配置和編譯Linux Kernel

6. 生成Root Filesystem

7. 測試系統(二)

 

搭建方法:

1. 生成Preloader

tar -xvzf atlas_linux_ghrd.tar.gz
  • 運行EDS配置環境變量的腳本
<path-to-soceds-tools>/embedded/embedded_command_shell.sh
  • 運行BSP Editor工具:
cd atlas_linux_ghrd
bsp-editor &

將彈出如下窗口:

 

  • 配置BSP Editor: 
    • File→New HPS BSP
    • 在彈出的窗口中,點擊"Preloader settings directory"右側的"..."按鈕,選擇“atlas_linux_ghrd/hps_isw_handoff/soc_system_hps_0”,然后點擊Open。完成后的界面如下圖,點擊確定:

    • 在生成的窗口中,選中"FAT_SUPPORT",其他的使用默認,結果如下圖:

    • 點擊Generate,正常結束后點擊Exit退出。

 

  • 編譯Preloader.
cd software/spl_bsp ; ls
make

編譯結束后將生成如下文件:

    • 新目錄 - “uboot-socfpga”
    • 新文件 - “preloader-mkpimage.bin”

 

2.配置和編譯Bootloader (U-Boot)

  • 獲取U-Boot編譯工具: Linaro GCC toolchain for the ARMv7 instruction set,並配置其相關的環境變量
cd ..
wget https://rocketboards.org/foswiki/pub/Documentation/EmbeddedLinuxBeginnerSGuide/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
tar -xvf gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux.tar.xz
export CROSS_COMPILE=$PWD/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
  •  獲取U-Boot源代碼,查看並切換至相應的tag:
git clone https://github.com/altera-opensource/u-boot-socfpga.git
cd u-boot-socfpga

git tag -l rel* git tag -l ACDS* git checkout rel_socfpga_v2013.01.01_15.09.01_pr

 

  • Clean U-Boot目錄
make mrproper

 

  • 編譯U-Boot
make socfpga_cyclone5_config
make

 

  • 創建boot腳本。在software目錄下,新建boot.script文件,並寫入如下內容:
echo -- Programming FPGA --
fatload mmc 0:1 $fpgadata soc_system.rbf; fpga load 0 $fpgadata $filesize; run bridge_enable_handoff; echo -- Setting Env Variables -- setenv fdtimage soc_system.dtb; setenv mmcroot /dev/mmcblk0p2; setenv mmcload 'mmc rescan;${mmcloadcmd} mmc 0:${mmcloadpart} ${loadaddr} ${bootimage};${mmcloadcmd} mmc 0:${mmcloadpart} ${fdtaddr} ${fdtimage};'; setenv mmcboot 'setenv bootargs console=ttyS0,115200 root=${mmcroot} rw rootwait; bootz ${loadaddr} - ${fdtaddr}'; run mmcload; run mmcboot;
  • 編譯boot腳本
mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Boot Script Name" -d boot.script u-boot.scr

 編譯結束后,將生成"u-boot.scr"文件

 

3. 生成和編譯Device Tree

  • 生成Device Tree所需的board xml文件已經存在了。在"atlas_linux_ghrd"目錄下,運行如下命令:
sopc2dts --input soc_system.sopcinfo\ 
  --output soc_system.dts\ --type dts\ --board soc_system_board_info.xml\ --board hps_common_board_info.xml\ --bridge-removal all\ --clocks

 

  • 編譯Device Tree源代碼;
dtc -I dts -O dtb -o soc_system.dtb soc_system.dts

編譯結束后,將生成二進制文件:"soc_system.dtb"。

 

4. 測試系統(一)

Preloader和U-Boot已經生成。我們首先,以測試preloader和bootloader編譯和燒寫成功。

  • 制作SD Card image, 生成空值組成的sdcard.img
sudo dd if=/dev/zero of=sdcard.img bs=512M count=1

 

  • 虛擬回環設備(loop device),並獲取回環設備名。紅色的X表示不同的環境下可能會有不同,在我的環境下,X=0,即我得到的結果是"/dev/loop0"。
sudo losetup –-show –f sdcard.img
/dev/loopX

 

  • 使用fdisk命令對該回環設備關聯的sdcard.img進行分區
sudo fdisk /dev/loopX
-- fdisk welcome message – Command (m for help):

 

首先確認,當前sd卡上沒有分區:

 

創建分區3,用來存儲preloader image,相應的配置信息如下:

轉換分區類型為'a2'

 

創建分區2,用來存放Linux root文件系統,相應的配置信息如下,且不需要進行分區類型轉換:

創建分區1,用來存放啟動文件:相應的配置信息如下:

轉換分區類型為FAT:

最終的分區信息如下圖:

確認無誤后,使用"w"命令退出,忽略下圖中的錯誤信息。

 

  •  Kernel對上述改動尚未生效,正如上圖中最后一樣的提示。Reboot,或者使用"partprobe"命令,使上述改動生效。
sudo partprobe /dev/loopX
  • 生成文件系統:

preloader寫入分區3:

sudo dd if=software/spl_bsp/preloader-mkpimage.bin of=/dev/loopXp3 bs=64k seek=0

 

 格式化分區1,成為FAT文件系統:

sudo mkfs –t vfat /dev/loopXp1

 

格式化分區2,成為ext4文件系統: 

sudo mkfs.ext4 /dev/loopXp2

 

 掛載分區1(FAT文件系統),並將拷入之前生成的"u-boot.img", "u-boot.scr"和FPGA的燒寫文件"soc_system.rbf".

mkdir temp_mount
sudo mount /dev/loopXp1 ./temp_mount sudo cp software/u-boot-socfpga/u-boot.img software/u-boot.scr soc_system.dtb soc_system.rbf temp_mount sync sudo umount temp_mount

 

  •  燒寫SD卡
sudo dd if=sdcard.img of=/dev/XXX bs=2048
sync

 

  •  將SD卡插入FPGA,開機,通過串口調試工具如minicom進行調試,結果是SoC的preloader和bootloader正常啟動,但因為我們還沒有制作linux kernel和root filesystem, 系統提示如下錯誤:

 

5. 配置和編譯Linux Kernel

  • 獲取Linux Kernel源代碼,並切換到相應的release:
cd software
git clone https://github.com/altera-opensource/linux-socfpga.git
cd linux-socfpga git tag –l rel* git checkout rel_socfpga-4.1_15.09.01_pr

 

  • 配置Linux Kernel,運行環境變量配置腳本,確保新打開的shell的環境變量配置正確:
export CROSS_COMPILE=$PWD/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-
<path-to-soceds-tools>/embedded/embedded_command_shell.sh
make ARCH=arm socfpga_defconfig

 

  •  安裝圖形化的kernel配置工具:
sudo apt-get install libncurses5-dev
make ARCH=arm menuconfig
  •  在打開的圖形界面里,需要改動2個地方。1. 主菜單進入“General Setup”,取消 “Automatically append version information to the version string”  2. 主菜單進入“Enable the block layer”,選中 “Support for large (2TB+) block devices and files”。然后save到默認的.config文件。
  • 編譯Linux Kernel (zImage): 
make ARCH=arm LOCALVERSION= zImage

 注意,"LOCALVERSION=" 后面是空格

 

6. 生成Root Filesystem

  • 運行環境變量配置腳本,確保新打開的shell的環境變量配置正確:
export CROSS_COMPILE=$PWD/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux/bin/arm-linux-gnueabihf-

<path-to-soceds-tools>/embedded/embedded_command_shell.sh

 

  • 獲取buildroot代碼 (Guide中給的地址已經打不開了,自己搜索了buildroot在github上的代碼)
cd software
git clone https://github.com/buildroot/buildroot

 

  • 切換到兼容Linaro 2014.09 toolchain的版本:
cd buildroot
git checkout 2015.08.x cd ..

 

  • 打開配置窗口:
make -C buildroot ARCH=ARM BR2_TOOLCHAIN_EXTERNAL_PATH=$(pwd)/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux nconfig
  • 配置Target Options:
    • 在"Target Architecture"選項中,選擇"ARM (little endian)"
    • 在"Target Architecture variant"選項中,選中 "cortex-A9"
    • 在"Target ABI"選項中, 選中"EABIhf"
    • Enable “NEON SIMD extension support” 
    • 在“Floating point strategy”選項中, 選中"NEON"
    •  “Target Binary Format” and “ARM Instruction set” 選項保持默認。
  • 配置Toolchain:
    • 在“Toolchain type”選項中, 選中 “External toolchain”
    • 確保  “Toolchain” 選項中,選中 “Linaro ARM 2014.09”. 
    • 在“Toolchain origin”選項中, 選中 “Pre-installed toolchain”
    • 忽略"toolchain path"
    • Enable “copy gdb server to the Target”
    • 其他選項保持默認
  • 配置System configuration:
    • 配置hostname
    • 配置root password
  • 配置Kernel:
    • 去掉“Linux Kernel” 選項的選中狀態
  • 配置Target packages 
    • 在 “Debugging, profiling and benchmark”選項中, 拖動滾動條到底部並選中 “valgrind”
  • 配置結束,F6保存並退出。
  • 配置Busy Box
make –C buildroot busybox-menuconfig

在打開的配置窗口中,不做改變保存即可。

  • 編譯Root Filesystem:
make -C buildroot BR2_TOOLCHAIN_EXTERNAL_PATH=$(pwd)/gcc-linaro-arm-linux-gnueabihf-4.9-2014.09_linux all

 

7. 測試系統2

將編譯好的Linux Kernel 拷入SD,並解壓Root Filesystem。之后開機登陸root。

sudo cp linux-socfpga/arch/arm/boot/zImage <mount point that lsblk tells you, remember the FAT partition is the 256M one>
sudo tar –xvf buildroot/output/images/rootfs.tar –C <mount point of your ext4 partition, it’s the 254M one>
sync

 

 

備份:

1. 一切工作開始前,調整SoC的MSEL開關,至Fast Passive Parallel x16模式,

2. GHRD代表 Golden Hardware Reference Design,它是包含了很多基本功能模塊的硬件設計,我們可以用它作為設計參考。

3. 在生成preloader時,我碰到一個找不到二進制文件的錯誤,但實際上需要的二進制文件已經存在了。問題的原因是編譯出的二進制文件是32位的文件,而我的主機用的是64位的Linux。安裝32位兼容庫即可解決:

sudo apt-get install lib32ncurses5

4. 在生成bootloader時,缺少庫文件libz.so.1和工具包,安裝之:

sudo apt-get install lib32z1
sudo apt-get install u-boot-tools
 
        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM