Lichee Pi Nano用Buildrootカスタム設定のメモ

Lichee Pi Nanoは超小型のLinuxが動作するSBC。Lichee Pi Nanoのハードウエア規模からしてBuildrootが最適な感じなのだが、良いBuildroot設定が見つからず自力でカスタム設定を作ってみた。

今回はほぼ自分用のメモで、解説もかなりざっくりなのをお断りしておく。

Buildroot Logo
スポンサーリンク

ビルド環境の準備

ビルド環境は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を以下と同じになるように設定する。

ARCH設定

カーネルと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。

BuildrootでSBC用Linuxシステムイメージを作る
ラズパイなどのメジャーでハイパワーなSBC(SingleBoardComputer)であればUbuntuCoreやArmbianなどパッケージ管理ツール付きディストリビューションを選べるが、マイナーだったりメモリやプロセッサが貧弱なSBCの...

まとめ

なんとかLichee Pi Nano用のBuildroot環境を作ることが出来た(冒頭に「メモ書き」と断った通り記事としては雑な感じではあるが)。

とりあえずI2Cが動く状態にはなったが、Lichee Pi Nanoには他にもSPIなど設定されていないペリフェラルが存在するので、いずれ動かせるようにしてみたい。

というわけで、続く…かも。

コメント