Lichee Pi Nanoは超小型のLinuxが動作するSBC。Lichee Pi Nanoのハードウエア規模からしてBuildrootが最適な感じなのだが、良いBuildroot設定が見つからず自力でカスタム設定を作ってみた。
今回はほぼ自分用のメモで、解説もかなりざっくりなのをお断りしておく。
ビルド環境の準備
ビルド環境はUbuntu20.04をDocker環境にインストールして利用、
Buildrootは2021年2月版を使った(最新の2022年5月版はビルドが失敗するので)。
tarボールをダウンロード/展開し、展開先ディレクトリに移動しておく。
wget https://buildroot.org/downloads/buildroot-2021.02.tar.gz
tar -xvzf buildroot-2021.02.tar.gz
cd buildroot-2022.05
Zero用のBuildroot設定をNanoに流用する
Lichee Pi Zero用設定ファイルはBuildrootのパッケージに含まれているため、これをベースにNano用にカスタマイズする事にした。
ZeroとNanoは載っているSoCが全然別物で大半の設定はそのままではダメだが、システムイメージ生成スクリプト等は使えるので、そこだけ流用する。
カーネルとブートローダーのソースコードについては別途Lichee Pi Nanoカスタム版がGitHub上にあるので、それらを使う設定を行う。
Zero用システムイメージ生成スクリプト設定を確認する
Buildrootのtarボール展開先のconfigs/licheepi_zero_defconfigがZero用設定ファイルで、この中で以下が流用出来そうな箇所だ。
BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="-c board/licheepi/genimage.cfg"
BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE="board/licheepi/boot.cmd"
genimage.shはそのまま使える。genimage.cfgとboot.cmdについてはZero用の物をベースにNano用へカスタマイズする。
別ディレクトリにカスタム設定ファイル群を置く
適当なディレクトリを掘って、以下のような構成でファイルを配置する。
.
├── Config.in -> 空でOK
├── board
│ └── licheepi_nano
│ ├── boot.cmd -> Zeroの物をコピー
│ ├── devicetree.dts -> 新規作成(Device Tree設定ファイル)
│ └── genimage.cfg -> Zeroの物をコピー
├── configs
│ └── licheepi_nano_defconfig -> Zeroの物をコピーしリネーム(Buildroot設定ファイル)
├── external.desc -> 空でOK
└── external.mk -> 空でOK
各ファイルの説明はディレクトリツリー中にコメントを書いた通りだが、改めて列挙すると、
- 空ファイル : Config.in, external.desc, external.mk
- Zeroの物をとりあえずコピー : boot.cmd, genimage.cfg, licheepi_nano_defconfig(licheepi_zero_defconfigからリネーム)
- Device Tree設定ファイル : devicetree.dts
Device Tree設定(dts)ファイルは新規作成、他はとりあえずZeroの物をコピーし適宜変更して使う。
Device Tree設定ファイルの作成
Device Tree設定(dts)ファイルはハードウエア情報を記述する大切な物(この記事にDevice Treeの簡単な解説を書いた)。
Lichee Pi Nanoカスタムカーネルに付属のdtsファイルは不完全で、I2CやSPIの記述が抜けている。以下のように、カーネル付属のdtsファイル(suniv-f1c100s-licheepi-nano.dts)をインクルードしたうえでI2Cの追加設定を記述し、上記ディレクトリ構造に従ってdevicetree.dtsというファイル名で配置する。
/dts-v1/;
#include "suniv-f1c100s-licheepi-nano.dts"
/ {
model = "Lichee Pi Nano Custom";
soc {
i2c0: i2c@1C27000 {
compatible = "allwinner,sun6i-a31-i2c";
reg = <0x01C27000 0x400>;
interrupts = <7>;
clocks = <&ccu CLK_BUS_I2C0>;
resets = <&ccu RST_BUS_I2C0>;
pinctrl-names = "default";
pinctrl-0 = <&i2c0_pins>;
status = "okay";
#address-cells = <1>;
#size-cells = <0>;
};
};
};
&pio {
i2c0_pins: i2c0 {
pins = "PE11", "PE12";
function = "i2c0";
};
};
boot.cmdとgenimage.cfgの変更
.dtbファイルの指定は”devicetree.dtb”に変更する。その他、各ファイルの変更点は以下の通り。
- boot.cmd : NanoとZeroとではメモリ配置が違うのでアドレス指定を変更
setenv bootargs console=ttyS0,115200 panic=5 console=tty0 rootwait root=/dev/mmcblk0p2 earlyprintk rw
load mmc 0:1 0x80C00000 devicetree.dtb
load mmc 0:1 0x80008000 zImage
bootz 0x80008000 - 0x80C00000
- genimage.cfg : u-bootパーティションがサイズ溢れとなったので、サイズを変更
image boot.vfat {
vfat {
files = {
"zImage",
"devicetree.dtb", <-- 変更
"boot.scr"
:
partition u-boot {
in-partition-table = "no"
image = "u-boot-sunxi-with-spl.bin"
offset = 8K
size = 1016K # 1024KB - 8KB <-- 変更
}
Nano用defconfigファイルのカスタム設定
defconfig読み込み
まずはZeroの設定になっているdefconfigファイルを読み込んで、Nano用の設定を行う。Buildrootのtarボール展開先ディレクトリへ移動したうえで、以下のコマンドを実行。
BR2_EXTERNAL=../configs/nano-custom/ make licheepi_nano_defconfig
../configs/nano-custom/は上記でNano用設定ファイルを置いたカスタムディレクトリへの相対パス。
menuconfig実行
defconfigの読み込みが終わったらmenuconfigを実行。
make menuconfig
以降、下記に挙げる設定を行う。
アーキテクチャ設定
menuconfigの中でTarget optionsを以下と同じになるように設定する。
カーネルとU-bootのGitHubリポジトリ指定
カーネルとu-bootの設定は、いずれもNano用カスタムGitHubリポジトリを指定する。
- カーネル : https://github.com/Lichee-Pi/linux(バージョン”nano-5.2-tf”)
- U-Boot : https://github.com/Lichee-Pi/u-boot(バージョン”nano-v2018.01″)
カスタム設定ファイルの参照
上記で作成したNano用設定ディレクトリは$
(BR2_EXTERNAL_LICHEEPI_NANO_PATH)によって参照出来る。Nano用設定ディレクトリに置いたカスタム設定ファイルは$
(BR2_EXTERNAL_LICHEEPI_NANO_PATH)を使ってパス指定する。
設定内容をdefconfigへ書き戻す
menuconfigを抜け(設定内容は忘れずに保存)、以下を実行すると設定内容がカスタムディレクトリのlicheepi_nano_defconfigに書き戻される。
make update-defconfig
以上でカスタマイズは完了だ。
書き戻したNano用Buildroot設定ファイルの内容
make update-defconfigで書き戻しをするとコメントが消え順番も変わって見にくいが、とりあえずNano用のSDカードイメージを作成するための設定ファイルlicheepi_nano_defconfigが完成した。以下がその内容。
BR2_arm=y
BR2_PACKAGE_HOST_LINUX_HEADERS_CUSTOM_5_2=y
BR2_TARGET_GENERIC_HOSTNAME="nano"
BR2_TARGET_GENERIC_ISSUE="Welcome to Buildroot for the Lichee Pi Nano"
BR2_TARGET_GENERIC_GETTY_PORT="ttyS0"
BR2_TARGET_GENERIC_GETTY_BAUDRATE_115200=y
BR2_ROOTFS_POST_IMAGE_SCRIPT="support/scripts/genimage.sh"
BR2_ROOTFS_POST_SCRIPT_ARGS="-c $(BR2_EXTERNAL_LICHEEPI_NANO_PATH)/board/licheepi_nano/genimage.cfg"
BR2_LINUX_KERNEL=y
BR2_LINUX_KERNEL_CUSTOM_GIT=y
BR2_LINUX_KERNEL_CUSTOM_REPO_URL="https://github.com/Lichee-Pi/linux"
BR2_LINUX_KERNEL_CUSTOM_REPO_VERSION="nano-5.2-tf"
BR2_LINUX_KERNEL_DEFCONFIG="licheepi_nano"
BR2_LINUX_KERNEL_DTS_SUPPORT=y
BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_LICHEEPI_NANO_PATH)/board/licheepi_nano/devicetree.dts"
BR2_TARGET_ROOTFS_EXT2=y
BR2_TARGET_ROOTFS_EXT2_4=y
BR2_TARGET_UBOOT=y
BR2_TARGET_UBOOT_BOARDNAME="licheepi_nano"
BR2_TARGET_UBOOT_CUSTOM_GIT=y
BR2_TARGET_UBOOT_CUSTOM_REPO_URL="https://github.com/Lichee-Pi/u-boot"
BR2_TARGET_UBOOT_CUSTOM_REPO_VERSION="nano-v2018.01"
BR2_TARGET_UBOOT_NEEDS_DTC=y
BR2_TARGET_UBOOT_NEEDS_PYLIBFDT=y
BR2_TARGET_UBOOT_FORMAT_CUSTOM=y
BR2_TARGET_UBOOT_FORMAT_CUSTOM_NAME="u-boot-sunxi-with-spl.bin"
BR2_PACKAGE_HOST_DOSFSTOOLS=y
BR2_PACKAGE_HOST_GENIMAGE=y
BR2_PACKAGE_HOST_MTOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT=y
BR2_PACKAGE_HOST_UBOOT_TOOLS_BOOT_SCRIPT_SOURCE="$(BR2_EXTERNAL_LICHEEPI_NANO_PATH)/board/licheepi_nano/boot.cmd"
ビルド実行
Buildrootのtarボール展開先ディレクトリで以下を実行することにより、各種設定ファイルと一緒にディレクトリツリーに配置したlicheepi_nano_defconfigを読み込む事が出来る。
BR2_EXTERNAL=<カスタム設定へのパス> make licheepi_nano_defconfig
以降の操作は、下記別記事にまとめたBuildrootの一般的な操作方法と同じ。パッケージ追加など、適宜行えばOK。
まとめ
なんとかLichee Pi Nano用のBuildroot環境を作ることが出来た(冒頭に「メモ書き」と断った通り記事としては雑な感じではあるが)。
とりあえずI2Cが動く状態にはなったが、Lichee Pi Nanoには他にもSPIなど設定されていないペリフェラルが存在するので、いずれ動かせるようにしてみたい。
というわけで、続く…かも。
コメント