Lichee Pi NanoはAllwinner製のF1C100sというSoCが搭載された超小型SBC。これまで自分はこのSBCをLinuxバージョン5.2のカスタムカーネル+Buildrootの組み合わせで動かしてきたのだが、ここ最近mainlineカーネルでF1C100sのメンテが進みつつあるのが気になっていた。ついでにU-Bootもmainline対応化が進んでおり、カスタムなコードを一切使わずに最新バージョン6.4のmainlineカーネルでLichee Pi Nano用Buildrootイメージが作れる事を確認。
動作も安定している感じなのでBuildroot環境をGitHubに登録もしてみた。
ビルド方法や動作状況などを記事にまとめる。
AllwinnerによるF1C100s mainline対応化の流れ
どういう力学が働いているのか不明だが、とにかくチップベンダ主導(?)で脱カスタムの流れが進んでいるようだ。
Linuxバージョン5.0が”initial F1C100s support”と書かれている。
F1C100s対応履歴
上記sunxiのサイトに記載されている表から、最近のF1C100sへの対応履歴を拾っておく。
ペリフェラル | LRADC | I2C | IR RX | PWM | SPI | SD/MMC | USB | Watchdog |
---|---|---|---|---|---|---|---|---|
Linuxバージョン | 6.2 | 6.2 | 6.2 | 6.2 | 5.19 | 5.19 | 6.3 | 5.19 |
BuildrootでSDカードイメージをビルドする
以前の記事でLichee Pi Nano用Buildroot環境の自作について紹介した。
これをベースにmainlineカーネルが動作するSDカードイメージを生成するBuildroot環境をGitHubに登録し、折角なのでビルドや設定の方法などをドキュメントにまとめた。
以下、GitHubのドキュメントと重複するが、SDカードイメージの作り方だけ再掲。
ビルド環境のインストール
Linuxホストに環境構築する方法は以下の2ステップ。
- リポジトリのクローン
git clone https://github.com/goediy/licheepi-nano-mainline.git
cd licheepi-nano-mainline
- Docker環境の構築
cd docker/
./00create-docker.sh
ブート可能なmicroSDの作成方法
SDカードイメージ書き込みも、以下たったの2ステップ。
- Buildrootのダウンロードとビルド(Dockerコンテナの中で実行されます)
./download-and-build.sh
- SDカードへ書き込み
dd if=sdcard.img of=/dev/sd?
Linux6.4.16は当たりのカーネル?
GitHub公開前に幾つかのバージョンのカーネルを試したところ、開発途上のmainlineカーネルだけあって時々動作が怪しい物もあったのだが、バージョン6.4.16は起動も速く安定している感触。
U-Bootのメッセージからrootログイン後uname -aを実行するまでのコンソール表示を抜粋すると以下のような感じ。
U-Boot SPL 2023.07.02 (Sep 17 2023 - 14:00:56 +0000)
DRAM: 32 MiB
Trying to boot from MMC1
U-Boot 2023.07.02 (Sep 17 2023 - 14:00:56 +0000) Allwinner Technology
CPU: Allwinner F Series (SUNIV)
Model: Lichee Pi Nano
:
Starting kernel ...
[ 0.000000] Booting Linux on physical CPU 0x0
:
[ 9.415140] g_ether gadget.0: g_ether ready
[ 9.679148] random: crng init done
Welcome to Buildroot for the Lichee Pi Nano
nano login: root
# uname -a
Linux nano 6.4.16-licheepi-nano #1 Sun Sep 17 14:09:08 UTC 2023 armv5tejl GNU/Linux
USBケーブル一本でインターネットに接続
USB Gadget Ethernet(g_ether)を設定済なので、USBケーブルでホストPCに接続するとネットワークデバイスusb0が有効となり、ホストPCを介してLichee Pi Nanoがインターネット通信出来る。ip aを実行すると、以下のような感じでネットワークデバイスが動作しているのが分かる。(詳しい設定方法はGitHubのドキュメントを参照)
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: usb0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 26:65:34:f8:5f:36 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.10/24 brd 192.168.10.255 scope global usb0
valid_lft forever preferred_lft forever
ホストPC側からLichee Pi Nanoへssh接続したり、ホストPCのファイルシステムをnfsマウントすることも出来る。実は以前の5.2系カスタムカーネルでも頑張って同様の設定をして使っていたのだが、これがmainlineカーネルで動いてくれるのは嬉しい。
I2Cも問題無し
i2cdetectによるI2Cデバイス検出結果。0x27に1602 LCDに繋がったPCF8574が検出されている。(0x48はオンボードのタッチセンサ)
$ i2cdetect -y 0
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
:
サンプルプログラムの動作
同梱のPythonサンプルプログラムを動かした時の様子。インターネット接続を介してタイムサーバと時刻同期がされているので、I2C接続の1602 LCDに正確な時刻が表示されている。
USBホスト動作
手持ちのUSBメモリとUSBイーサーネットをmicroUSBのOTGアダプタを介して挿して動かしてみたので、動作状況を簡単に紹介。
USBメモリ
挿した瞬間のカーネルメッセージは以下の通り。USBメモリがsdaとして認識され、マウントも問題なく出来た。
[ 1958.485157] usb 1-1: new high-speed USB device number 6 using musb-hdrc
[ 1958.675549] usb 1-1: New USB device found, idVendor=0951, idProduct=1666, bcdDevice= 0.01
[ 1958.683917] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 1958.691258] usb 1-1: Product: DataTraveler 3.0
[ 1958.695843] usb 1-1: Manufacturer: Kingston
[ 1958.700098] usb 1-1: SerialNumber: 60A44C4252A8F351D98D4F16
[ 1958.711395] usb-storage 1-1:1.0: USB Mass Storage device detected
[ 1958.736276] scsi host0: usb-storage 1-1:1.0
[ 1959.757350] scsi 0:0:0:0: Direct-Access Kingston DataTraveler 3.0 PQ: 0 ANSI: 6
[ 1959.861490] sd 0:0:0:0: [sda] 30218842 512-byte logical blocks: (15.5 GB/14.4 GiB)
[ 1959.870079] sd 0:0:0:0: [sda] Write Protect is off
[ 1959.875157] sd 0:0:0:0: [sda] Mode Sense: 4f 00 00 00
[ 1959.882452] sd 0:0:0:0: [sda] Write cache: disabled, read cache: enabled, doesn't support DPO or FUA
[ 1959.900408] sda: sda1
[ 1959.904190] sd 0:0:0:0: [sda] Attached SCSI removable disk
USB Ethernetアダプタ
挿した瞬間のカーネルメッセージ。eth0として認識された。
[ 79.124035] usb 1-1: new high-speed USB device number 2 using musb-hdrc
[ 79.310509] usb 1-1: New USB device found, idVendor=0b95, idProduct=1790, bcdDevice= 1.00
[ 79.318974] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 79.326297] usb 1-1: Product: AX88179
[ 79.330042] usb 1-1: Manufacturer: ASIX Elec. Corp.
[ 79.335044] usb 1-1: SerialNumber: 0000000000084C
[ 79.825602] ax88179_178a 1-1:1.0 eth0: register 'ax88179_178a' at usb-musb-hdrc.1.auto-1, ASIX AX88179 USB 3.0 Gigabit Ethernet, 50:c4:dd:6d:c6:75
[ 79.839554] usbcore: registered new interface driver ax88179_178a
デフォルトではusb0が有効になっているため無効化、eth0の有効化が必要。以下のコマンド実行で、こちらでもインターネット接続は問題なく出来るようになる。
ifdown usb0
ifup eth0
ip aを実行すると、こんな感じ。
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: usb0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 92:47:c8:e1:3e:1a brd ff:ff:ff:ff:ff:ff
3: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 50:c4:dd:6d:c6:75 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth0
valid_lft forever preferred_lft forever
まとめ
以前使っていた5.2系カスタムカーネルもパッチを当てるとUSBが一応動いていたが、今回試した6.4系はmainlineだけあって特にUSBホスト動作の安定感が数段上がったような感触がある。試しにUSBメモリとUSB Ethernetを動かしてみたが、設定さえすれば他も何でも動きそうな気がする。
個人的には初めて作った物をGitHubに登録したので、Lichee Pi Nanoでの動作に成功した方はこのブログに「動いたよー」などメッセージを貰えると嬉しいです。
コメント