以前の記事で,FPGA Managerを使ってZYNQのPLを動的に変更する方法を紹介した.
Device Tree OverlayとFPGA Managerを使ってZynqの構成をLinuxから更新する - メモ置き場
記事を公開してからすぐにTwitterでikwzmさんからこんなリプライを頂いていた.
この記事では fpgacfg を使って fpga-manager に対してFPGAの書き込みをしているようです。この方法でももちろん可能ですが、4.10以降では fpga-region を使ったほうが良いかも。 https://t.co/KGWGYU5HSq
— 隠居したエンジニア (@ikwzm) February 5, 2019
自分の環境で使っているLinux kernelは4.14だったので,FPGA Regionを使ってPLの構成を書き換えてみることにした.
ikwzmさんの以下の記事を参考にした.
Linux Kernel 4.10 でのFPGAのサポート事情 - Qiita
Linux の FPGA Manager で Xilinx のビットストリームファイルを扱う方法 - Qiita
下準備
FPGA Regionを使うためにはLinux kernelのビルド時にFPGA Regionに関するオプションを指定しなければならない.具体的には,make menuconfigで出てくる設定画面で
- Device Drivers/FPGA Configuration Support/
にチェックを入れるか,configureファイルに
- CONFIG_FPGA=y
- CONFIG_FPGA_REGION=y
- CONFIG_FPGA_BRIDGE=y
- CONFIG_FPGA_MGR_ZYNQ_FPGA=y
- CONFIG_XILINX_PR_DECOUPLER=y
を追加しておく.さらにZynqのdevice treeを編集して,ambaノード以下に次の項目を追加しておく.
/dts-v1/;
/ {
…
amba {
devcfg: devcfg@f8007000 {
compatible = "xlnx,zynq-devcfg-1.0";
reg = <0xf8007000 0x100>;
interrupt-parent = <&intc>;
interrupts = <0 8 4>;
clocks = <&clkc 12>;
clock-names = "ref_clk";
syscon = <&slcr>;
};
fpga_region0: fpga-region0 {
compatible = "fpga-region";
fpga-mgr = <&devcfg>;
#address-cells = <1>;
#size-cells = <1>;
ranges;
};
…
};またDevice Tree Overlayが必要なので,この記事を参考に準備をしておく.
FPGA Regionを使用する
Xilinxのbitstreamファイルはそのままでは使えず,ヘッダの除去及び,1ワード(4Byte)単位でバイトスワップを行ってから使用する必要があるらしい.そのために必要なツールを取得しておく.
github.com
これより下記の操作は全てZynq上で行う.
zynq上にダウンロードしておく.またZynqにはpythonがインストールしておく.
実行権限を与えてから次のようにしてbitstreamファイルの変換を行う.
aho@zynq$ sudo chmod u+x fpga-bit-to-bin.py #実行権限の付与.最初に使うときだけで良い aho@zynq$ ./fpga-bit-to-bin.py --flip my-bitstream.bit output.bin
変換したbinファイルを/lib/firmwareにコピーしておく.今回は新しくサブディレクトリを作成し,/lib/firmware/my-bit/output.binに書き込みたいfirmwareを置いた.
次に,以下に示すようなdevice treeファイルを作成する.
// Device Tree File for FPGA Region: fpga_reg.dts
/dts-v1/;
/plugin/;
/ {
fragment@1 {
target-path = "/amba/fpga-region0";
#address-cells = <1>;
#size-cells = <1>;
__overlay__ {
#address-cells = <1>;
#size-cells = <1>;
firmware-name = "my-bit/output.bin";
};
};
};target-pathには,ambaノードに追加したFPGA Regionのラベルを指定する.firmware-nameには/lib/firmwareからのパスで書き込みたいfirmwareを指定する.このdevice treeファイルをoverlayすると,PLに回路情報が書き込まれる.
aho@zynq$ dtc -I dts -O dtb fpga_reg.dts -o fpga_reg.dtbo aho@zynq$ sudo mkdir /config/device-tree/overlays/fpga-region aho@zynq$ sudo cp fpga_reg.dtbo /config/device-tree/overlays/fpga-region/dtbo aho@zynq$ echo 1 | sudo tee /config/device-tree/overlays/fpga-region/status
これでPLを書き換えることができる.
ZYBO-Z7を使っている場合だと,Device Tree Overlaysのstatusに1を書き込んだ瞬間にDONEのLEDが消え,しばらくするとまた点灯するようになる.Device Tree Overlayを行った瞬間からPLへの書き込みが始まるようだ.
また,PL情報を書き換えた後にstatusに0を書き込んだとしても,変更する前のPLの構成に戻ることはないので注意が必要.もしPLを復元したい場合は,bitstreamファイルを別途に用意して,同様の手順でPLを書き換える必要があるみたい.