LuckFox Pico ProでUbuntuを使ってみる

Ubuntuのインストール

AliExpressで気になるLinuxボードを見つけました。
LuckFox Picoと言う製品で、SoCにRockchip RV1103/1106を採用したLinuxです。
RV1103/1106はいずれもMCUにCortex-A7を採用したSoCです。
Cortex-A7は2011年に発表されたARMv7-Aアーキテクチャを実装したMCUで、
Raspberry Pi2のBCM2836やOrangePi PCのAllwinner H3に実装されているMCUです。
BCM2836やAllwinner H3は、このMCUを4個内蔵していますが、RV1103/1106は1個だけ内蔵しています。
右がLuckFox Pico Mini、左がLuckFox Picoで、どちらもRV1103が搭載されています。


右上がLuckFox Pico Pro(RV1106)で左上がLuckFox Pico Plus(RV1103)です。



各製品のスペックはこ ちらに公開されています。
今回入手したのはLuckFox Pico Maxで、256MBのMemoryと256MBのSPI NAND FLASHが搭載されています。
LuckFox Pico Proもメモリが小さいだけで、GPIOのピンアサインを含め、メモリ容量以外のスペックはPico Maxと全く同じです。


裏面にSPI NAND FLASHが実装されています。


OSイメージへのリンク(Google Cloud Link)がこ ちらに公開されていて、ubuntuとbuildrootのイメージを使用することができます。
ubuntuはSDカード、buildrootはSDカード、あるいはSPI NAND FLASHから起動することができます。
今回は「Luckfox_Pico_Pro_Max_Ubuntu_SDCard.zip」を使い、SDカードから起動してみました。
このイメージはPico Pro/Pico Maxのどちらでも使うことができます。
SDカードへの書き込みツール(SocToolKit.exe)と、書き込み手順がこ ちらに公開されています。
注意点としてSDカードを刺した状態で書き込みツール(SocToolKit.exe)を起動すると、SDカードを認識しません。
書き込みツール(SocToolKit.exe)起動後に、SDカードを刺すと、SDカードを認識します。
また、提供されているイメージにはupdate.imgが含まれていますが、このファイルは書き込み対象から除外する必要が有ります。


SDカードの書き込みは結構時間が掛かります。
書き込みを始めると右側に進捗状況が表示されますが、rootfsの書き込みですごぉ〜く待たされます。
私の環境では書き込みが始まるまでに45分ぐらい掛かりました。


辛抱強く待つとrootfsの書き込みが始まります。


書き込みが終了するとこの画面になります。


SPI NAND FLASHが実装されているボードでは、buildrootをSPI NAND FLASHから起動から起動することができます。
SPI NAND FLASHから起動する場合は、こ ちらの手順でFLASHにOSを書き込みます。

SDカードが準備できたら、USB-TTL変換アダプターを本体のデバッグポートに接続します。
GPIOのピン配置はこちらに 公開されていますが、デバッグポートはピン番号1(TX)、2(RX)です。
USB-TTLアダプターをWindowsマシンに接続し、TeraTermを起動してから、ボードのUSB経由で電源を供給します。
ずらずらとブートメッセージが表示されて、ログインプロンプトが表示されます。
イメージは圧縮されているので、初回だけはイメージの伸張を行います。
root/rootとpico/luckfoxのユーザが事前に登録されています。


提供されているUbuntuのバージョンはUbuntu 22.04.3です。


IPアドレスもDHCP経由で正しく取得できています。


ifconfig(net-tools)も最初からインストールされていました。


パッケージの更新も問題なくできます。


パッケージを更新したらUbuntuが22.04.3→22.04.5になりました。


提供されているubuntuはRNDIS機能が最初から有効になっていて、USBポートに対して「172.32.0.70」のIPアドレスが割り 当てられています。
Windows-PCやLinux-PCを母艦として、USBポートを使ったネットワークが使えるようになります が、
このモデルはEthernetを持っているので、このデバイスの使い道は有りません。


簡単なCソースをコンパイルしてみました。
$ cat a.c
#include <stdio.h>
int main() {
        printf("hoge\n");
        return 0;
}

$ cc a.c
/usr/bin/ld: cannot find -lgcc: No such file or directory
/usr/bin/ld: cannot find -lgcc: No such file or directory
collect2: error: ld returned 1 exit status

$ cc --version
cc (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0
Copyright (C) 2021 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

デフォルトでインストールされているgccのインストールが不完全なようです。
以下のコマンドでインストールできるgccを調べることができます。
$ sudo apt search '^gcc-[0-9]+$'
Sorting... Done
Full Text Search... Done
gcc-10/jammy-updates,jammy-security 10.5.0-1ubuntu1~22.04 armhf
  GNU C compiler

gcc-11/jammy-updates,jammy-security,now 11.4.0-1ubuntu1~22.04 armhf [installed,automatic]
  GNU C compiler

gcc-12/jammy-updates,jammy-security 12.3.0-1ubuntu1~22.04 armhf
  GNU C compiler

gcc-9/jammy-updates,jammy-security,now 9.5.0-1ubuntu1~22.04 armhf [installed,automatic]
  GNU C compiler

そこで、以下の手順でgcc-12とlibc6をインストールし、update-alternativesでバージョンを切り替えてみま した。
$ sudo apt install g++-12 -y

$ sudo apt install --reinstall libc6-dev -y

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11

$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12

$ gcc --version
gcc (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cc a.c

$ ./a.out
hoge

無事にビルドが成功しました。
g++のバージョンも切り替えます。
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 11

$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12

$ g++ --version
g++ (Ubuntu 12.3.0-1ubuntu1~22.04) 12.3.0
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

$ cp a.c a.cpp

$ g++ a.cpp

$ ./a.out
hoge

続く....