ジャンル不定の日記です。

u-bootとlinuxのビルドやってみたが・・・

Orange pi R1をSPIフラッシュを使って運用したいので、とりあえずSDブートで自ビルドしてみた。

u-boot
$ git clone git://git.denx.de/u-boot.git
$ cd u-boot
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- orangepi_r1_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-
u-boot-sunxi-with-spl.bin ができあがる。
git コマンドに --depth=1 オプションをつけたほうが良かったかも。
バージョンが大量にある場合に --depth=1 だと1個しか持ってこないらしい。
makeの際に arm-none-eabi-gcc と swig が必要だった。クロスコンパイラは当然なきゃ無理だね。

kernel
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git --depth=1
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- sunxi_defconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- menuconfig
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- zImage
$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- dtbs
arch/arm/boot/zImage と arch/arm/boot/dts/sun8i-h2-plus-orangepi-r1.dtb が出来上がった。
bcコマンドを追加インストールの必要があった。
menuconfigはとりあえず何もいじってない。

フォーマットとu-bootのインストール
SDをfdiskでシングルパーティションにしてext2でフォーマットした。
$ sudo dd if=u-boot-sunxi-with-spl.bin of=/dev/sdX bs=1024 seek=8
でu-bootをインストール。
bsが1024でseekが8なんでデバイスの先頭から8KiBの位置にインストールされる。
この位置がAllwinnerが実行するブートローダーのアドレスってことだろうが、フォーマットしたファイルシステムが壊れないの?
と思って考えたが、
デバイスの先頭から512byteでMBRが入ってる。
fdiskでパーティションを作成すると先頭は2048セクタになる。1セクタ512byteだから1MB。
というわけで、空き領域に入れてるんだね。

rootfsの展開
rootfsはArch Linux ARMのものを使おうとした。
ext2でフォーマットしたSDのパーティションをマウントして、
$ sudo bsdtar xf ArchLinuxARM-armv7-latest.tar.gz -C mnt
で展開した。
bsdtarではなく普通のtar使うと、「tar: 未知の拡張ヘッダキーワード 'LIBARCHIVE.xattr.security.capability' を無視」とか警告が出た。
/bootにはzImageとdtbsにいっぱいファイルが入ってるので消した。
initramfs-linux.img も消したけど、無いとだめだよね。というわけで戻した。
消したあとに作ったzImageとsun8i-h2-plus-orangepi-r1.dtbを/bootに入れた。

boot.cmd
setenv bootargs console=ttyS0,115200 root=/dev/mmcblk0p1 rootwait rootfstype=ext4
load mmc 0:1 ${kernel_addr_r} /boot/zImage
load mmc 0:1 ${fdt_addr_r} /boot/${fdtfile}
load mmc 0:1 ${ramdisk_addr_r} /boot/initramfs-linux.img
bootz ${kernel_addr_r} ${ramdisk_addr_r} ${fdt_addr_r}
最初のパーティションがfatかextXで、/boot.scr か /boot/boot.scr があるとu-bootは読み込んでくれるらしい。
boot.scrはファイル名は別でもいいと思うがテキスト形式の boot.cmd から mkimage コマンドでboot.scrに変換できる。
$ sudo mkimage -A arm -O linux -T script -C none -a 0 -e 0 -n "Orange Pi R1 boot script" -d boot.cmd mnt/boot/boot.scr
これで mnt/boot/boot.scr が作成される。

で起動してみたら、
Starting kernel ...
で止まる・・・
boot.cmd いろいろいじってみたが解決せず。
正しいサイズでロードしてるのは確認できるので、u-bootは問題なく、kernelの起動オプションに問題があるかinitに問題があるかなのかな?

u-bootは /boot/extlinux/extlinux.confがあるとextlinuxでブートしてくれるらしいんで、
extlinux.conf
TIMEOUT 100
DEFAULT default
MENU TITLE Boot menu
LABEL default
    MENU LABEL Default
    LINUX /boot/zImage
    FDT /boot/sun8i-h2-plus-orangepi-r1.dtb
    APPEND root=/dev/mmcblk0p1 rootwait console=ttyS0,115200n8
    INITRD /boot/initramfs-linux.img

LABEL exit
    MENU LABEL Local boot script (boot.scr)
    LOCALBOOT 1
こんな感じで試してみたが、こっちも、
Starting kernel ...
で止まる。

Arch Linuxのrootfsを使ったのが良くなかったか?

もう疲れたんで続きはまた今度。