TrenzElectronic社のTE0802用に自分でLinuxをビルド成功
TrenzElectronic社のTE0802用に自分でLinuxをビルドしていたのですが、はじめて、FSBLからU-Bootからデバイスツリーから全部作ってLinuxを動作させることに成功しました。
Petalinuxは一切使用していません。
要点はいくつかあるのですが、
- Ubuntuのバイナリは、armhf用(つまり32bit)でも64bitのARMは動く
- Linuxカーネルはもちろんコンパイルしなおす
カーネルをコンパイルするコマンドは、
make ARCH=arm64 UIMAGE_LOADADDR=0x8000
です。
uImageを作るコマンドは
mkimage -n 'TE0802hoge' -A arm64 -O linux -C none -T kernel -a 0x3000000 -e 0x3000000 -d arch/arm64/boot/Image uImage
です。-n 'TE0802hoge'は名前なので、何でもよいのかもしれません。-a や -e でアドレスを指定していますが、このアドレスがどういう影響があるのかはわかりません。
- hsiを使って、Vivadoが吐き出したハードウェアエクスポートからデバイスツリーを作るときのカスタマイズは下記のとおり。
まず、system-top.dtsに自分のハードウェアの特色を出したい部分を書きます。(起動時のメッセージとか)
/dts-v1/;
#include "zynqmp.dtsi"
#include "zynqmp-clk-ccf.dtsi"
#include "pcw.dtsi"
/ {
model = "### TOKUDEN Trenz TE0802 v1.1 ###";
chosen {
bootargs = "console=ttyPS0,115200, root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1 earlycon";
stdout-path = "serial0:115200n8";
};
aliases {
ethernet0 = &gem3;
i2c0 = &i2c0;
i2c1 = &i2c1;
serial0 = &uart0;
spi0 = &qspi;
sdhc0 = &sdhci0;
};
memory {
device_type = "memory";
reg = <0x0 0x0 0x0 0x3ff00000>;
};
cpus {
/delete-node/ cpu@2 ;
/delete-node/ cpu@3 ;
};
};
&sdhci0 {
clock-frequency = <187500000>;
status = "okay";
no-1-8-v;
disable-wp;
xlnx,mio-bank = <0x0>;
};
sdhci0にdisable-wpを付けるのは重要です。ハードウェアの構成上、WP(ライトプロテクト)が無いので、WPが無いことを明示的に示しておかないと、なぜか、Linuxの起動時にクラッシュします。それくらいのことで・・と思うのですが仕方ありません。
hsiで作ったUltraScale+用のデバイスツリーのソースをコンパイルするときには、dtcでそのまま変換することはできませんでした。
C言語風のinclude文などが、大量にひっかかっています。
どうやら、dtcに食わせる前にgccを使って変換してからでないといけないようです。それにはLinuxのカーネルをコンパイルしたディレクトリを用いて、
gcc -E -P -x assembler-with-cpp -I $(LINUX_KERNEL_SRCDIR)/arch/arm/boot/dts -I $(LINUX_KERNEL_SRCDIR)/include system-top.dts | dtc -I dts -O dtb -i $(LINUX_KERNEL_SRCDIR)/arch/arm/boot/dts -o hoge.dtb
とコマンドを与えるようです。
それから、真贋判定装置の中継基板の設計を進めました。右側8個のコネクタにも同じように配線を行い、基板上側のコネクタに接続しました。
ここからがなかなか難しい。
| 固定リンク
コメント