在中国本土化一个选择,将以下内容进行释义:FPGA + SoC + Linux + Device Tree Overlay + FPGA Manager (提供引导镜像)。FPGA(现场可编程门阵列)+ SoC(片上系统)+ Linux(操作系统)+ 设备树覆盖层 + FPGA管理器(提供引导镜像)
请注意(2017年9月20日更新)
这篇文章是在Linux Kernel 4.4时发表的,其中包含了一些旧的内容。自Linux Kernel 4.10以后,FPGA相关技术有了巨大的进步。想要了解更多,请参考「Linux Kernel 4.10下FPGA的支持现状」。
只需要一个选项的参考(2017年11月2日补充)。
我们提供了包含FPGA区域的Linux 4.12.14引导镜像。请参考“FPGA+SoC+Linux+设备树叠加+FPGA区域(引导镜像提供)”了解更多详情。
首先
我解釋了「FPGA+SoC+Linux的引導順序(使用Device Tree Overlay和FPGA Manager)」,以及在「FPGA+SoC+Linux中嘗試Device Tree Overlay」和「FPGA+SoC+Linux中嘗試FPGA Manager」中介紹了Device Tree Overlay和FPGA Manager。
我为了让这些文章更实用,除了提供简单的介绍和解释外,也准备了以下网址上的预先构建好的 U-Boot、Linux Kernel、Debian8-rootfs 和设备驱动程序(如 dtbocfg 和 fpgacfg)包,以支持 ZYBO、PYNQ-Z1 和 DE0-Nano-SoC 的实际运行环境。
- https://github.com/ikwzm/FPGA-SoC-Linux
如果您觉得构建Linux或u-boot很麻烦,请放心。
此外,Readme.md 中也写了建构方法,如果你想要自己建构,请将此作为参考。
顺便提一句,目前Linux的FPGA Manager和Device Tree Overlay的支持仅属于临时和有限的程度,关于将来的情况仍然存在未知的部分,请知悉。在此介绍的dtbocfg和fpgacfg等设备驱动程序是我个人随意添加的,这是因为Linux目前没有提供与用户交互的接口。(或者说,快点正式支持吧… Linux)
此外,以下文章中介绍了一些使用该系统的实例,请一起浏览。
-
- 「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ZYBO-Examples)」@Qiita
- 「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(DE0-Nano-SoC-Examples)」@Qiita
补充
-
- 2017/1/14 に Linux Kernel のバージョンを v4.8.17 に更新しました。
-
- 2017/1/30 に udmabuf のバージョンを v0.6.0 に更新しました。
- 2017/2/16 に ハードウェアとして PYNQ-Z1 を追加しました。
简单概括
-
- Hardware
ZYBO : Xilinx Zynq-7000 ARM/FPGA SoC Trainer Board by Digilent
PYNQ-Z1 : Python Productive for Zynq by Digilent
DE0-Nano-SoC : Altera SoC FPGA Development Kit by terasic
U-Boot v2016.03 (customized)
Build for ZYBO, PYNQ-Z1 and DE0-Nano-SoC
Customized boot by uEnv.txt
Customized boot by boot.scr
Linux Kernel Version v4.8.17
Available in both Xilinx-Zynq-7000 and Altera-SoC in a single image
Enable Device Tree Overlay
Enable FPGA Manager
Debian8(jessie) Root File System
Installed build-essential
Installed device-tree-compiler
Installed ruby ruby-msgpack ruby-serialport
Installed u-boot-tools
FPGA Device Drivers
dtbocfg (Device Tree Blob Overlay Configuration File System)
fpgacfg (FPGA Configuration Interface for Linux FPGA Manager Framework)
fclkcfg (FPGA Clock Configuration Device Driver)
udmabuf (User space mappable DMA Buffer)
zptty (Pseudo TeleTYpewriter for FPGA Device)
fpga-bridge (FPGA to/from HPS Bridge Driver for Altera SoCFPGA Devices)
安装到 ZYBO 或 ZYBO 上的安装说明
请下载
请从 GitHub 下载如下内容。
当前版本为 v0.3.3,请进行检出。
另外,由于有一些图像文件非常大,所以我们使用了 Git LFS(大型文件存储)。
您的环境需要安装 git-lfs。
shell$ git clone git://github.com/ikwzm/FPGA-SoC-Linux
shell$ cd FPGA-SoC-Linux
shell$ git checkout v0.3.3
shell$ git lfs pull
文件说明
请参考”FPGA+SoC+Linux的引导序列(ZYNQ+U-Boot-SPL篇)”,了解目标/zynq-zybo/boot目录中每个文件的详细信息。
-
- tareget/zynq-zybo/
boot/
boot.bin : Stage 1 Boot Loader(U-boot-spl)
design_1_wrapper.bit : FPGA configuration file (Xilinx Bitstream Format)
u-boot.img : Stage 2 Boot Loader(U-boot)
uEnv.txt : U-Boot environment variables for linux boot
zImage-4.8.17-armv7-fpga : Linux Kernel Image
devicetree-4.8.17-zynq-zybo.dtb : Linux Device Tree Blob
devicetree-4.8.17-zynq-zybo.dts : Linux Device Tree Source
debian8-rootfs-vanilla.tgz : Debian8 Root File System (use Git LFS)
linux-image-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb : Linux Image Package (use Git LFS)
linux-headers-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb : Linux Headers Package (use Git LFS)
fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb : Device Drivers Package (use Git LFS)
SD卡的格式化
使用FAT文件系统在SD卡的分区1上创建文件系统。
使用ext3文件系统在SD卡的分区2上创建文件系统。
省略了格式化方法的详细信息。
对SD卡的写入操作
将 target/zynq-zybo/boot/ 目录下的文件复制到 SD 卡的分区 1 (例如 /dev/sdc1)。
将 debian8-rootfs-vanilla.tgz 文件的内容解压到 SD 卡的分区 2 (例如 /dev/sdc2)。
另外,最好事先将 fpga-soc-linux-drivers 包复制到展开后的根文件系统中的 home/fpga 目录中。也可以通过网络后续再进行复制。
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
shell# cp target/zynq-zybo/boot/* /mnt/usb1
shell# tar xfz debian8-rootfs-vanilla.tgz -C /mnt/usb2
shell# cp linux-image-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb /mnt/usb2/home/fpga
shell# cp linux-headers-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb /mnt/usb2/home/fpga
shell# cp fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb /mnt/usb2/home/fpga
shell# umount mnt/usb1
shell# umount mnt/usb2
将 PYNQ-Z1 安装到电脑上。
基本上与ZYBO相同。我在下面的文章中提供了关于如何在PYNQ-Z1上安装的参考文章。请参考。
- 「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)」@Qiita
安装到DE0-Nano-SoC
下载
请从Github下载以下内容。
当前最新版本为v0.3.2,请进行检出操作。
另外,由于一些图像文件相当大,我们使用Git LFS(大文件存储)进行存储。
您的环境必须安装了git-lfs。
shell$ git clone git://github.com/ikwzm/FPGA-SoC-Linux
shell$ cd FPGA-SoC-Linux
shell$ git checkout v0.3.0
shell$ git lfs pull
文件说明
请参考“FPGA+SoC+Linux的启动顺序(Altera SoC+EDS版本)”获取target/de0-nano-soc/boot/和target/de0-nano-soc/u-boot/目录下文件的详细信息。
-
- target/de0-nano-soc/
boot/
DE0_NANO_SOC.rbf : FPGA configuration file (Raw Binary Format)
uEnv.txt : U-Boot environment variables for linux boot
zImage-4.8.17-armv7-fpga : Linux Kernel Image
devicetree-4.8.17-socfpga.dtb : Linux Device Tree Blob
devicetree-4.8.17-socfpga.dts : Linux Device Tree Source
u-boot/
u-boot-spl.sfp : Stage 1 Boot Loader(U-boot-spl)
u-boot.img : Stage 2 Boot Loader(U-boot)
debian8-rootfs-vanilla.tgz : Debian8 Root File System (use Git LFS)
linux-image-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb : Linux Image Package (use Git LFS)
linux-headers-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb : Linux Headers Package (use Git LFS)
fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb : Device Drivers Package (use Git LFS)
SD卡的格式化
使用FAT文件系统在SD卡的分区1上创建文件系统。
使用ext3文件系统在SD卡的分区2上创建文件系统。
将SD卡的分区3设置为特殊分区(分区类型=0xa2),不创建文件系统。
省略格式化方法的详细信息。
对SD卡进行写入
使用dd命令将target/de0-nano-soc/u-boot/文件映像写入SD卡的第三个分区(在下面的示例中为/dev/sdc3)。
将target/de0-nano-soc/boot/下的文件复制到SD卡的第一个分区(在下面的示例中为/dev/sdc1)。
在SD卡的第二个分区(在下面的示例中为/dev/sdc2)中解压debian8-rootfs-vanilla.tgz的内容。
此外,最好预先将fpga-soc-linux-drivers软件包复制到展开的根文件系统的home/fpga目录中。稍后也可以通过网络进行复制。
shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
shell# cp target/de0-nano-soc/boot/* /mnt/usb1
shell# dd if=target/de0-nano-soc/u-boot/u-boot-spl.sfp of=/dev/sdc3 bs=64k seek=0
shell# dd if=target/de0-nano-soc/u-boot/u-boot.img of=/dev/sdc3 bs=64k seek=4
shell# tar xfz debian8-rootfs-vanilla.tgz -C /mnt/usb2
shell# cp linux-image-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb /mnt/usb2/home/fpga
shell# cp linux-headers-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb /mnt/usb2/home/fpga
shell# cp fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb /mnt/usb2/home/fpga
shell# umount mnt/usb1
shell# umount mnt/usb2
ZYBO和DE0-Nano-SoC的双启动
请参考以下文章中关于如何制作支持 ZYBO 和 DE0-Nano-SoC 双启动的 SD-Card。
- 「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ZYBOとDE0-Nano-SoCのデュアルブートに対応)」@Qiita
安装设备驱动程序包。
重新启动后,使用FPGA或root登录
FPGA的密码是”fpga”。
debian-fpga login: fpga
Password:
fpga@debian-fpga:~$
根密码为 “admin”。
debian-fpga login: root
Password:
root@debian-fpga:~#
安装Linux头文件/镜像包
在安装设备驱动程序包之前,需要先安装设备驱动程序所需的Linux头文件/映像包。设备驱动程序的安装需要对应的Linux内核版本的头文件/映像。
fpga@debian-fpga:~$ sudo dpkg -i linux-image-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb
fpga@debian-fpga:~$ sudo dpkg -i linux-headers-4.8.17-armv7-fpga_4.8.17-armv7-fpga-1_armhf.deb
安装设备驱动程序包
使用dpkg工具安装fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb。
fpga@debian-fpga:~$ sudo dpkg -i fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb
Selecting previously unselected package fpga-soc-linux-drivers.
(Reading database ... 17830 files and directories currently installed.)
Preparing to unpack fpga-soc-linux-drivers_0.0.3-1_armhf.deb ...
Unpacking fpga-soc-linux-drivers (0.0.3-1) ...
Setting up fpga-soc-linux-drivers (0.0.3-1) ...
Created symlink from /etc/systemd/system/multi-user.target.wants/device-tree-overlay.service to /etc/systemd/system/device-tree-overlay.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/fpga-manager.service to /etc/systemd/system/fpga-manager.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/udmabuf.service to /etc/systemd/system/udmabuf.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/zptty.service to /etc/systemd/system/zptty.service.
如果尝试将fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb安装到已安装有v0.1.3(Linux Kernel Version 4.4.7版)的fpga-soc-linux-drivers-4.4.7-armv7-fpga_0.0.2-1_armhf.deb的RootFS上,将会出现冲突导致安装失败。这是我制作包的错误。非常抱歉,请先删除fpga-soc-linux-drivers-4.4.7-armv7-fpga_0.0.2-1_armhf.deb,然后再安装fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb。
fpga@debian-fpga:~$ sudo dpkg --purge fpga-soc-linux-drivers-4.4.7-armv7-fpga
检查设备驱动程序包是否已安装。
fpga@debian-fpga:~$ sudo lsmod
Module Size Used by
zptty 8529 0
udmabuf 10177 0
fpgacfg 12287 0
dtbocfg 3200 2
fpga@debian-fpga:~$ sudo systemctl status device-tree-overlay.service
● device-tree-overlay.service - Device Tree Overlay Service.
Loaded: loaded (/etc/systemd/system/device-tree-overlay.service; enabled)
Active: active (exited) since Sat 2016-04-30 07:50:08 JST; 1min 22s ago
Process: 1461 ExecStart=/sbin/modprobe dtbocfg (code=exited, status=0/SUCCESS)
Main PID: 1461 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/device-tree-overlay.service
Apr 30 07:50:08 debian-fpga systemd[1]: Started Device Tree Overlay Service..
fpga@debian-fpga:~$ sudo systemctl status fpga-manager.service
● fpga-manager.service - FPGA Manager Service.
Loaded: loaded (/etc/systemd/system/fpga-manager.service; enabled)
Active: active (exited) since Sat 2016-04-30 07:50:09 JST; 2min 46s ago
Process: 1477 ExecStart=/sbin/modprobe fpgacfg (code=exited, status=0/SUCCESS)
Process: 1467 ExecStartPre=/usr/bin/fpgacfg_load_overlay.rb (code=exited, status=0/SUCCESS)
Main PID: 1477 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/fpga-manager.service
Apr 30 07:50:09 debian-fpga systemd[1]: Started FPGA Manager Service..
fpga@debian-fpga:~$ sudo systemctl status udmabuf.service
● udmabuf.service - User space mappable DMA Buffer Service.
Loaded: loaded (/etc/systemd/system/udmabuf.service; enabled)
Active: active (exited) since Sat 2016-04-30 07:50:09 JST; 3min 50s ago
Process: 1484 ExecStart=/sbin/modprobe udmabuf (code=exited, status=0/SUCCESS)
Main PID: 1484 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/udmabuf.service
Apr 30 07:50:09 debian-fpga systemd[1]: Started User space mappable DMA Buff....
Hint: Some lines were ellipsized, use -l to show in full.
fpga@debian-fpga:~$ sudo systemctl status zptty.service
● zptty.service - Pseudo TTY Driver for communication with FPGA.
Loaded: loaded (/etc/systemd/system/zptty.service; enabled)
Active: active (exited) since Sat 2016-04-30 07:50:09 JST; 4min 40s ago
Process: 1491 ExecStart=/sbin/modprobe zptty (code=exited, status=0/SUCCESS)
Main PID: 1491 (code=exited, status=0/SUCCESS)
请参考
U-Boot、Linux Kernel和Debian8-rootfs的构建方面,下面的资料对我非常有帮助。在此借此机会向您表示感谢。
-
- 「FPGA マガジンNo.12」, CQ出版社
- 「Debian Linux on Zynq Setup Flow Version March 2016 for Vivado 2015.4」