F1C100s搭載Lichee Pi NanoでLinux mainlineカーネルを動かす

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に登録もしてみた。

GitHub - goediy/licheepi-nano-mainline: A Buildroot environment for Lichee Pi Nano with mainline Linux kernel
ABuildrootenvironmentforLicheePiNanowithmainlineLinuxkernel-GitHub-goediy/licheepi-nano-mainline:ABuildrootenvironmentforLicheePiNanowithmainlineLinuxkernel

ビルド方法や動作状況などを記事にまとめる。

スポンサーリンク

AllwinnerによるF1C100s mainline対応化の流れ

どういう力学が働いているのか不明だが、とにかくチップベンダ主導(?)で脱カスタムの流れが進んでいるようだ。

Linux mainlining effort - linux-sunxi.org

Linuxバージョン5.0が”initial F1C100s support”と書かれている。

F1C100s対応履歴

上記sunxiのサイトに記載されている表から、最近のF1C100sへの対応履歴を拾っておく。

ペリフェラルLRADCI2CIR RXPWMSPISD/MMCUSBWatchdog
Linuxバージョン6.26.26.26.25.195.196.35.19

BuildrootでSDカードイメージをビルドする

以前の記事でLichee Pi Nano用Buildroot環境の自作について紹介した。

これをベースにmainlineカーネルが動作するSDカードイメージを生成するBuildroot環境をGitHubに登録し、折角なのでビルドや設定の方法などをドキュメントにまとめた。

https://github.com/goediy/licheepi-nano-mainline/blob/main/README-j.md

以下、GitHubのドキュメントと重複するが、SDカードイメージの作り方だけ再掲。

ビルド環境のインストール

Linuxホストに環境構築する方法は以下の2ステップ。

  1. リポジトリのクローン
git clone https://github.com/goediy/licheepi-nano-mainline.git
cd licheepi-nano-mainline
  1. Docker環境の構築
cd docker/
./00create-docker.sh

ブート可能なmicroSDの作成方法

SDカードイメージ書き込みも、以下たったの2ステップ。

  1. Buildrootのダウンロードとビルド(Dockerコンテナの中で実行されます)
./download-and-build.sh
  1. 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に正確な時刻が表示されている。

Nano

USBホスト動作

手持ちのUSBメモリとUSBイーサーネットをmicroUSBのOTGアダプタを介して挿して動かしてみたので、動作状況を簡単に紹介。

USBメモリ

USBmem

挿した瞬間のカーネルメッセージは以下の通り。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アダプタ

USBether

挿した瞬間のカーネルメッセージ。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での動作に成功した方はこのブログに「動いたよー」などメッセージを貰えると嬉しいです。

コメント