メモ置き場

メモ置き場です.開発したものや調べたことについて書きます.

[tex: ]

ZynqでFPGA Managerを使う

FPGA Managerを使うと,Linux側から(つまりZynqのPS側から)FPGAを書き換えることができる.

Xilinxが提供するLinuxでは/dev/xdevcfgというデバイスドライバがあって,ここにbitstreamファイルをcatで書き込むとPLを書き換えることができる.
今回はこのxdevcfgではなくLinuxの提供するFPGA Managerを使ってPLを書き換えてみようと思う.

こちらの記事を参考にした.
FPGA+SoC+LinuxでFPGA Managerを試してみた - Qiita

Kernelとデバイスツリーのビルド

kernelをビルドするときのconfigにCONFIG_FPGA=yを追加してからビルドする.

FPGA Manager用のデバイスツリーとして,zynq-7000.dtsiとzynq-zybo-z7.dtsに以下の行を追加する.

---- zynq-7000.dtsiに追加
/{
    ....
    amba {
        devcfg@f8007000 {
            compatible = "xlnx,zynq-devcfg-1.0";
            reg = <0xf8007000 0x100>;
            interrupt-parent = <0x3>;
            interrupts = <0x0 0x8 0x4>;
            clocks = <0x1 0xc>;
            clock-names = "ref_clk";
            syscon = <0x5>;
        };
    ....
};
----zynq-zybo-z7.dtsに追加
&amba{
    fpgacfg0 {
        compatible        = "ikwzm,fpgacfg-0.10.a";
        fpga-manager-path = "/amba/devcfg@f8007000";
    };
};

コンパイルしてSDカードの第一パーティションに置いておく.コンパイルのときはシンボル情報を埋め込むオプションを忘れないこと.

dtc -I dts -O dtb -@ -o devicetree.dtb zynq-zybo-z7.dts

kernelとdevice treeの準備が出来たらブートしておく.

カーネルモジュールのインストール

GitHub - ikwzm/fpgacfg: FPGA Configuration Interface for Linux FPGA Manager Framework
こちらのレポジトリで提供されているデバイスドライバを使う.ikwzmさんありがとうございます.
ここからは全てzynqの上で作業する.zynqにはこの記事を参考にheaderをインストールしておく.
モジュールをコンパイルする.

$ git clone git@github.com:ikwzm/fpgacfg.git
$ cd fpgacfg
$ make
$ ls
fpgacfg.ko

インストールする.

$ sudo insmod fpgacfg.ko
$ dmesg | grep fpgacfg
[   59.705675] fpgacfg: loading out-of-tree module taints kernel.
[   59.706907] fpgacfg amba:fpgacfg0: driver probe start.
[   59.707263] fpgacfg amba:fpgacfg0: driver installed.
[   59.707273] fpgacfg amba:fpgacfg0: device name  : fpgacfg0
[   59.707281] fpgacfg amba:fpgacfg0: fpga manager : Xilinx Zynq FPGA Manager

/devデバイスドライバが,/sys/class/fpgacfg/fpgacfg0にコントロール用のスペシャルファイルが認識される.

$ ls /dev
/dev/fpgacfg0
$ ls /sys/class/fpgacfg/fpgacfg0
buffer_state      data_format      dev    fpga_mgr_state    head_store_size       load_start     power      uevent
data_buffer_size  data_store_size  flags  head_buffer_size  is_partial_bitstream  max_data_size  subsystem

FPGAの書き換え

FPGAの書き換えは/dev/fpgacfg0にbitstreamファイルをコピーすることで行う.コピーの前にdata_formatに1を書き込む.こうすることで,bitstreamファイルがXilinxのものであるということを認識させる.次に/dev/fpgacfg0にbitstreamファイルを書き込み,最後にload_startに1を書き込むとFPGAのconfigurationが始まる.操作はrootで行う.

root$ echo 1 > /sys/class/fpgacfg/fpgacfg0/data_format
root$ cp my_fpga.bit /dev/fpgacfg0
root$ echo 1 > /sys/class/fpgacfg/fpgacfg0/load_start
root$ cat /sys/class/fpgacfg/fpgacfg0/buffer_state
done

buffer_stateを読んでdoneが入っていればconfiguration完了.