« Zynq の面白さとハードルの高さと(駄文) | トップページ | ZyboのLinuxからI2Cを使ってみる »

2018年4月15日 (日)

ZyboでLinuxからUIOアクセス(備忘録)

@ikwzm様の環境でのUIOからのアクセスに挑戦したので備忘録です。
FPGA+SoC+Linuxのブートシーケンス(ZYNQ+Vivado編)
https://qiita.com/ikwzm/items/7e90f0ca2165dbb9a577

本当にありがたく利用させていただいております(感謝)。

なお、今回は、FPGA region の機能は利用せずに、起動時のbitファイルを入れ替えます。
SDカードのFAT領域を弄るだけですね。Vivadoは2017.4を使っています。
やることは

  • u-boot の SPL部分に ps7_init_gpl.c / ps7_init_gpl.h を反映させる
  • DeviceTreeを入れ替える
  • bitファイルを入れ替える

u-boot が一番面倒ですね。@ikwzm様の環境のu-bootは「U-Boot v2016.03 (customized) 」との事ですが、どうせSPLしか利用しないので、将来のことも考えて新しめの U-Boot(v2018.03-rc4) を使ってみました。

git clone -b v2018.03-rc4 git://git.denx.de/u-boot.git

で、

cd u-boot

して

make zynq_zybo_config

make menuconfig
して、特に内容は弄らずSPLが有効になっているか一応確認。

ここで
board/xilinx/zynq/zynq-zybo に ps7_init_gpl.c と ps7_init_gpl.h をコピーして上書き。
(ちなみにVivadoからexport Hardware したときのhdfファイルが実体はzipファイルなのでunzipすればわざわざSDK起動しなくてもこれらのファイルは得られる模様です)

最後に

make CROSS_COMPILE=arm-linux-gnueabihf-

すれば spl の下に boo.bin が出来上がるのでSDカードにコピー

次に、DeviceTreeを変更します。

@ikwzm様の環境に既に

devicetree-4.14.21-zynq-zybo-z7.dts

が用意されているのでこれに書き足します。
私の場合、0x40000000 以降にWISHBONEを割り当てて、そこからRTLでアドレスデコードしているので、下記のように大胆に各種ペリフェラルデバイスのいるメモリ空間をまとめて1個のuioに割り当てています(後でbitファイルだけ入れ替えればよいように)。

 

    amba_pl: amba_pl {
        #address-cells = <1>;
            #size-cells = <1>;
            compatible = "simple-bus";
            ranges ;
            my_pl_peri: my_pl_peri@40000000 {
                compatible = "generic-uio";
                    reg = <0x40000000 0x40000000>;
                    xlnx,s00-axi-addr-width = <0x4>;
                    xlnx,s00-axi-data-width = <0x20>;
            };
        };

 

 

で、

sudo apt-get install device-tree-compiler

すれば、dtcが得られます(VirtualBoxのUbuntuでもよいですし、なんとZyboのDebianでもできそうです)。

dtc の使い方は

dtc -I dts -O dtb -o output_file.dtb input_file.dts

みたいな感じですので、 output_file.dtb と input_file.dts は各自のファイル名で読み替えてください。

出来上がった dtb ファイルをSDカードにコピー

最後に、bitファイルもSDカードにコピーして、uEnv.txt の中の dtbやbitファイルのファイル名を必要に応じて変更すれば完了です(もちろん元の名前のまま上書きするならこの作業は不要です)。

UIOへのアクセス方法は下記を参考にさせて頂きました。
https://qiita.com/take-iwiw/items/da91ce4dc2a8a8df3c0a

とりあえずアクセスでき始めました。
これでやっとXilinxSDK での standaloneでのプログラム(ベアメタルの開発)から次のステップに進めるかな?

ps7_init_gpl.c には、PSでのLinuxのブートに必要な設定と、PLでの自作ロジックの動作に必要な設定の両方が含まれているのが難しいところですね。

« Zynq の面白さとハードルの高さと(駄文) | トップページ | ZyboのLinuxからI2Cを使ってみる »

FPGA」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: ZyboでLinuxからUIOアクセス(備忘録):

« Zynq の面白さとハードルの高さと(駄文) | トップページ | ZyboのLinuxからI2Cを使ってみる »