@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での自作ロジックの動作に必要な設定の両方が含まれているのが難しいところですね。
コメント