メモ置き場

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

[tex: ]

FPGA Regionを使ってZYNQのPLを変更する

以前の記事で,FPGA Managerを使ってZYNQのPLを動的に変更する方法を紹介した.
Device Tree OverlayとFPGA Managerを使ってZynqの構成をLinuxから更新する - メモ置き場

記事を公開してからすぐにTwitterでikwzmさんからこんなリプライを頂いていた.


自分の環境で使っている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で出てくる設定画面で

にチェックを入れるか,configureファイルに

を追加しておく.さらに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を書き換える必要があるみたい.