12
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(PYNQ-Z1対応)

注意(2017年9月20日追記)

この記事は Linux Kernel 4.4 時点に投稿したものであり、古い内容が含まれています。Linux Kernel 4.10 以降、FPGA 関連は大きく進歩しました。詳しくは「Linux Kernel 4.10 でのFPGAのサポート事情」を参照してください。

参考(2017年11月2日追記)

FPGA Region を含んだ Linux 4.12.14 のブートイメージを提供しています。詳しくは「FPGA+SoC+Linux+Device Tree Overlay+FPGA Region(ブートイメージの提供)」を参照してください。

はじめに

「FPGA+SoC+Linux+Device Tree Overlay+FPGA Manager(ブートイメージの提供) @Qiita」で、ZYBO と DE0-Nano-SoC 用の Device Tree Overay と FPGA Manager に対応した Linux Kernel と Debian8 RootFS を紹介しました。

今回は新たにプラットフォームとして PYNQ-Z1 を追加しました。PYNQ-Z1 に関しては次の URL を参照してください。

なお、現時点での Linux の FPGA Manager と Device Tree Overlay のサポートは暫定的かつ限定的なもので、将来どうなるかは未だ不明な部分があることをご了承ください。ここで紹介している dtbocfg や fpgacfg と言ったデバイスドライバは、現時点で Linux が提供していないユーザー側とのインターフェースを私が勝手に追加したものです。

概要

PYNQ-Z1 へのインストール

ダウンロード

github から次のようにダウンロードしてください。
現時点の最新バージョンは v0.3.3 です。チェックアウトしてください。
なお、いくつかのイメージファイルはかなり大きいので、Git LFS(Large File Storage)を使っています。
お使いの環境に 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

ファイルの説明

target/zynq-pynqz1/boot ディレクトリの各ファイルの詳細は、「FPGA+SoC+Linuxのブートシーケンス(ZYNQ+U-Boot-SPL編)」を参照してください。

  • tareget/zynq-pynqz1/
    • boot/
      • boot.bin : Stage 1 Boot Loader(U-boot-spl)
      • 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-pynqz1.dtb : Linux Device Tree Blob
      • devicetree-4.8.17-zynq-pynqz1.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-Card のフォーマット

SD-Card のパーティション1を FAT File System でファイルシステムを作ります。
SD-Card のパーティション2を ext3 File System でファイルシステムを作ります。
フォーマット方法の詳細は省略します。

SD-Card への書き込み

SD-Card のパーティション1(下の例では/dev/sdc1)に target/zynq-pynqz1/boot/ 下のファイルをコピーします。
SD-Card のパーティション2(下の例では/dev/sdc2)に debian8-rootfs-vanilla.tgz の中身を展開します。
また、展開したルートファイルシステムの home/fpga に fpga-soc-linux-drivers パッケージをあらかじめコピーしておくと良いでしょう。後から network 経由でコピーしてもかまいません。

shell# mount /dev/sdc1 /mnt/usb1
shell# mount /dev/sdc2 /mnt/usb2
shell# cp target/zynq-pynqz1/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

デバイスドライバパッケージのインストール

リブートして fpga または root でログイン

fpga のパスワードは "fpga" です。

debian-fpga login: fpga
Password:
fpga@debian-fpga:~$

root のパスワードは "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
sudo: unable to resolve host debian-fpga
Selecting previously unselected package fpga-soc-linux-drivers-4.8.17-armv7-fpga.
(Reading database ... 37627 files and directories currently installed.)
Preparing to unpack fpga-soc-linux-drivers-4.8.17-armv7-fpga_0.0.3-1_armhf.deb ...
Unpacking fpga-soc-linux-drivers-4.8.17-armv7-fpga (0.0.3-1) ...
Setting up fpga-soc-linux-drivers-4.8.17-armv7-fpga (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.

なお、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.8.17-armv7-fpga_0.0.2-1_armhf.deb をインストールしようとするとコンフリクトしてインストールに失敗します。これは私のパッケージ作成ミスです。申し訳ありませんが、次の様に先に 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.2-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)

使用例

PYNQ祭り

2017年3月4日に開催された 「FPGAエクストリーム・コンピューティング 番外編:PYNQ祭り」 にて、「PythonでFPGAプログラミング」という題で発表しました。ここで紹介した環境上に、Python で fibonacci 関数を記述して FPGA に実装して、Juptyer Notebook から動かしてみました。
この環境一式も次の URL に置いてあります。参考にしてください。

参考

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
12
Help us understand the problem. What are the problem?