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完了.