今度はZYBOにてLinuxを動作させてみようと挑戦した備忘録。

まとまった情報がなかなか見つからなくて苦労したが、基本はMasahiro Yamadaさんの、"U-Boot と Linux Kernel のメインラインで Zynq を動かす"を参考にした。

STEP0: DTCの準備 はそのまま実施した。

STEP1: U-Bootのビルド ではまった。結論としては、ARMのクロスコンパイラとしてCodeSourcery Liteを使用した(単にXilinxからgccをダウンロードするのが面倒だったので。Xilinxのgccで動くかは試していないため不明)。

最初はLinaroのGCCでU-Bootをビルドしていたが、どうしても動作しなかった。U-Bootはlibcにも依存しているようで、LinaroのGCCだとダメだと思われる。

さらに、肝心のU-Bootは、オリジナルのものだと動かなかったので、DigilentのU-Bootを使用した。この手順は、Ryuzさんの"ZYBO(Zynq)のu-bootのビルドまで"に従った。CROSS_COMPILEのところは、(CodeSourceryなので)arm-none-eabi-にした。makeでu-boot.binができた(上記手順だとDTBはできないが、Linuxのブートは可能)。

STEP2: Linux Kernelのビルド には、Linaroのgccを使用した。
gcc-linaro-arm-linux-gnueabihf-4.8-2014.04_linux.tar.xzを解凍して使用した。CodeSourceryでも可能かは試していないため不明だが、linuxのカーネル自体はlibcに依存していないらしいので、可能かも知れない。

git cloneしてgit checkout v3.14。arch/arm/boot/dts/zynq-7000.dtsiを直接編集し、ps-clk-frequency=<50000000>してからmake。

STEP3, STEP4はほぼ同様だが、fit.itsにおいて、fdt@1のセクションでzynq-zc706.dtbをzynq-zed.dtbに変更した。

これでSTEP5の手順にてLinuxのブートまで確認できた。ただし、dow -data u-boot-dtb.binの代わりに、dow -data u-boot.binとした。

ただ、これだとDTBが正しくない?のか、Ethernetが使えない。これについては現在調査中。

2014/5/8追記:
Ethernetを使えるようにするために、純正カーネルではなく、別のところからカーネルを持ってきた。

こちらにある、linux-xlnx.git(Xilinx純正gitレポジトリ)をcloneして、 xilinx-v2014.1をcheckout。こちらもarch/arm/boot/dts/zynq-zed.dtsを編集して、ps-clk-frequencyを50MHzにした(ZedBoardのdtbを使った)。次に、こちらのページに従い、
make ARCH=arm xilinx_zynq_defconfig
make ARCH=arm menuconfig
make ARCH=arm CROSS_COMPILE=arm-none-eabi-
と実行。後は、fit.itsのkernel@1ノードとfdt@1ノードのdataプロパティを、それぞれ
data = /incbin/("linux-xlnx/arch/arm/boot/zImage"), data=/incbin/("linux-xlnx/arch/arm/boot/dts/zynq-zed.dtb")とした。再度mkimageしたバイナリで起動したら、Ethernetが認識できるようになった。

Comments