FPGA Regionを使ってZYNQのPLを変更する
以前の記事で,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を書き換える必要があるみたい.