組み込みローレベル開発マニュアル
1.開発の概要
1.1.組み込みローレベル開発の概要
組み込みローレベル開発は、通常、U-Boot、Kernel、Rootfsの開発を指します。
-
U-Boot:(Universal Boot Loader、ユニバーサルブートローダー)は、主に組み込みシステム(Kernel、カーネル)で使用されるブートローダープログラムであり、ARM、AVR32、x86、Niosなど、さまざまなコンピュータアーキテクチャをサポートしています。GPLライセンスに従うオープンソースプロジェクトです。
-
Kernel: Linuxカーネルは、C言語で記述されたPOSIX標準準拠のUnix系オペレーティングシステムです。CPUリソースの時分割多重化によりマルチプロセスの管理とスケジューリングを実現し、各種サブモジュールを通じてメモリやディスクなどのリソースの管理とスケジューリングを実現しています。また、各種周辺機器用のデバイスドライバを作成し、デバイスツリーを変更することで、周辺機器とLinuxシステムとの相互作用を実現しています。実際のところ、組み込みカーネル開発の大部分の作業は、周辺機器リソースの追加、削除、変更であり、通常は「デバイスドライバの開発」と「デバイスツリーの変更」を通じて行われます。
-
Rootfs:(Root file system、ルートファイルシステム)は、カーネルの起動時に最初にマウントされるファイルシステムです。ファイルシステムとは、ストレージデバイス上のデータとメタデータを構成・管理するメカニズムです。このメカニズムにより、ユーザーとオペレーティングシステム間のやり取りが容易になります。
1.2.EAI UbuntuSDKの概要
EAI UbuntuSDKは、EASY-EAIチームがUbuntuシステムをベースに、組み込みシステム向けに特別に最適化・適応させたシステムです。従来の組み込みSDKと比較して、以下の特徴があります:
-
高速起動のサポート: 通常のアプリケーションは電源オンからわずか6〜7秒で実行可能になり、1秒クラスの高速起動機能もサポートしています。
-
優れたエコシステムの継承: 従来のUbuntuシステムの「依存ライブラリのインストールが容易でソフトウェアエコシステムが強力である」という特徴を継承しており、ROS2やPythonライブラリを迅速にデプロイできます。
-
ファイルシステムの高い信頼性: RamDiskをサポートしており、ファイルシステムの不良ブロックを自動的に修復し、ディスクの異常や電源断によるファイルシステムの起動障害を防止します。
-
システム初期化の高い信頼性: デフォルトで外部ウォッチドッグ(1.6秒)をサポートし、いかなる異常によるU-BootやKernelの初期化の失敗も防止します(※ユーザーアプリケーションはチップ内蔵のウォッチドッグを呼び出してアプリケーションを保護します)。
-
ローレベル開発が簡単: 膨大なBuildroot SDKのコードを研究する必要はなく、カーネルとデバイスツリーを変更するだけで済みます。
-
ローレベル開発の高効率化: 一般的なSDKの完全コンパイルはわずか15分で完了します。一方、従来のBuildroot SDKでは90分かかります(同等性能のPC:CPU@4.2GHz 12コア24スレッドで比較)。
-
Rootfsのワンクリックエクスポートをサポート: ユーザーが開発ボードにインストールしたライブラリや開発したアプリを、イーサネット経由でワンクリックでエクスポートでき、量産用イメージを簡単に出力できます。
-
ソフトウェアライブラリのオンラインアップグレードをサポート: sudo apt-get upgrade を実行するだけで、専用サーバー(os.easy-eai.com)からローレベルと関連性の高い依存ライブラリ(rkaiq、rga、gstreamerなど)を同期・更新し、チップメーカーのバグをタイムリーに修正できます。
-
アプリケーション開発の高効率化: 開発ボードでのローカルコンパイルとオンラインクロスコンパイルをサポートしています。オンラインクロスコンパイルでは、アプリの依存ライブラリがボードのファイルシステムに直接依存するため、ライブラリの互換性問題を回避しつつ、PCのコンパイル性能とソースコードエディタを活用できます。
-
OTAソリューションをサポート: ソフトウェアに起因する量産時の事故を回避し、アプリケーションやシステムの反復的なアップデートを実現します。
-
A/Bパーティション方式をサポート: 非常に高いシステム信頼性を備えていますが、多くのストレージスペースを消費します。
-
柔軟なUIインタラクション方式の選択: デスクトップシステムやブラウザのインストールをサポートしており、ユーザーはさまざまな技術的手法を用いて独自のUIインターフェースを開発できます(※デフォルトではプレインストールおよび実行されておらず、システムリソースを消費しません)。
-
ソフトウェアデプロイメントの柔軟性向上: Dockerのデプロイをサポートしています。
1.3.EAI UbuntuSDKの開発フロー
ファームウェア開発フローの概要:

EAI UbuntuSDKの開発フロー 図1
-
【uboot.img】 通常はUbuntuSDKのソースコードからコンパイルして生成されますが、99%のケースで変更や置き換えは不要です。
-
【boot.img】 カーネルイメージです。通常これもUbuntuSDKのソースコードから生成されますが、ユーザーが自由に変更できます。
-
【rootfs.img】 ファイルシステムイメージです。通常は【開発ボードから完全にエクスポートする】という方法で取得し、それをファームウェア内の rootfs.img と置き換えるために使用します。
2.ソースコードの取得
2.1.ソースコードの取得
RV1126BのUbuntuシステムSDKはUbuntu 22.04をベースに最適化および移植されているため、同様にUbuntu22.04環境(EASY-EAIコンパイル環境など)でのコンパイルと開発を推奨します。
2.1.1開発環境の準備
EASY-EAIコンパイル環境を使用する必要がある場合は、「入門ガイド/開発環境の準備/Easy-Eaiコンパイル環境の準備と更新」をお読みいただき、関連する手順に従ってコンパイル環境を構築してください。
PC側のUbuntuシステムで run スクリプトを実行し、EASY-EAIコンパイル環境に入ります。詳細は以下の通りです。
cd ~/develop_environment./run.sh 2204コンパイル補助ツールのインストール:
sudo apt-get update && sudo apt-get install file2.1.2ソースコードの取得(Pull)
/opt ディレクトリに移動し、rv1126b_sdk ディレクトリを作成します:
mkdir /opt/rv1126b_sdkcd /opt/rv1126b_sdk
2ソースコードの取得(Pull) 図3
- ダウンロードリンク: ubuntu.tar.gz 上記のリンクから ubuntu.tar.gz 圧縮ファイルをダウンロードし、仮想マシンの /opt/EASY-EAI-Toolkit ディレクトリにアップロードして解凍します。
2.2.ソースコードのコンパイルガイド
ソースコードディレクトリに入ると、以下の内容が確認できます(※元のドキュメント内の図をご参照ください)。
2.2.1設定ファイルの確認
コンパイルの最初のステップは、ボード設定の事前読み込み(プリロード)です。

1設定ファイルの確認 図5
configs ディレクトリを確認すると、各種ボードに【対応】する設定ファイルが確認できます。

1設定ファイルの確認 図6
ここでは【easy-eai-nano-tb-gstreamer-2204-cfg.sh】を選択します。
./build.sh configs/easy-eai-nano-tb-gstreamer-2204-cfg.sh2.2.2コンパイルの説明
設定ファイルの読み込み完了後、再度 build.sh を実行すると、コンパイル可能な各モジュールが表示されます。

2コンパイルの説明 図7
-
all:ファームウェア全体をコンパイルします。
-
uboot:U-Bootイメージ(uboot.img)のみをコンパイルして生成します。
-
kernel:カーネルイメージ(boot.img)のみをコンパイルして生成します。
-
rootfs:Ubuntuファイルシステムイメージ(rootfs.img)のみをコンパイルして生成します。
通常、初回のコンパイルでは ./build.sh all を選択します。
./build.sh all
2コンパイルの説明 図8
インタラクティブなプロンプトが表示されたら、【Enterキー】を押して実行を確認します。その後、スクリプトが自動的にサーバーから【各イメージモジュール】のソースコードを取得し、【イメージのコンパイルと構築】を開始します。
*注意: **【カーネル】**のコンパイル時に、ディスクファイルのタイムスタンプを確認する処理があります。このとき /mnt の接続が切断されていると、NFSの無限タイムアウトにより処理が停止してしまいます。解決方法は、まず Ctrl+C でコンパイルを終了し、次に sudo umount -f /mnt を使用してこのディレクトリをアンマウントしてから、再度コンパイルを実行することです。
2.3.ディレクトリの簡単な説明
2.3.1ファームウェア出力ディレクトリ
コンパイル完了後、ファームウェアは【output】ディレクトリに出力されます。

1ファームウェア出力ディレクトリ 図9
ファームウェア内の対応するファイルを、生成された boot.img、MiniLoaderAll.bin、parameter.txt、rootfs.img、uboot.img に置き換えるだけで完了です。
2.3.2uboot
U-Bootのソースコードが保存されているディレクトリは u-boot です。

2uboot 図10
U-Bootを変更した後、U-Bootを再コンパイルする場合は、上の階層のディレクトリに戻って ./build.sh uboot を実行するのではなく、u-boot ディレクトリ内で以下のコマンドを実行してください:
./make.sh2.3.3kernel
カーネルのリリースソースコードが保存されているディレクトリは kernel です。

3kernel 図11
kernel ディレクトリ内でソースコードを直接変更することはお勧めしません。ファームウェア全体を再コンパイルする際、【ファームウェア全体】の一貫性を確保するために、kernel ディレクトリは完全に削除され、設定済みのリモートサーバーから新しいものが再取得されるためです。
2.3.4rootfs
Ubuntuシステムの rootfs.img の作成は少し複雑で、configs、hooks、overlay の3つのディレクトリが関係します。

4rootfs 図12
3.kernel
3.1.環境の準備とソースコードの取得
3.1.1書き込みツールのダウンロードと配置
リンク:
ダウンロードした書き込みツールを仮想マシンの任意の場所(例: ~/rv1126b_sdk)に配置します。
次に、ツールの保存先(例: ~/rv1126b_sdk)に移動し、実行権限を付与します。
cd ~/rv1126b_sdk/chmod 777 upgrade_toolさらに、ツールを仮想マシンの /usr/bin ディレクトリに移動させます。
sudo mv upgrade_tool /usr/bin
1書き込みツールのダウンロードと配置 図13
最後に、ターミナルを再起動するとツールが有効になります。(注:このツールの配置は仮想マシン環境で1回のみ行えばよく、以降の操作で繰り返す必要はありません)
3.1.2開発環境の準備
PC上のUbuntuシステムで run スクリプトを実行し、EASY-EAIコンパイル環境に入ります。詳細は以下の通りです。
cd ~/develop_environment./run.sh3.1.3ソースコードの取得
3.1.4カーネル開発用ディレクトリの作成
SDKの初回コンパイルが完了した後、以下のコマンドを実行して kernel リポジトリをコピーします。
cp kernel -r kernel_dev
4カーネル開発用ディレクトリの作成 図14
kernel_dev ディレクトリに移動し、ユーザーのカスタムコードを管理するためのブランチを作成します。
cd kernel_dev/3.2.カーネルの利用ガイド
3.2.1コンパイル設定の説明
SDKのルートディレクトリに戻り、ボードのコンパイル設定ファイルを編集します。
cd /opt/rv1126b_sdk/ubuntuvim configs/easy-eai-nano-tb-cfg.sh
1コンパイル設定の説明 図15
-
カーネルドライバの設定ファイルは次のディレクトリにあります:/opt/rv1126b_sdk/ubuntu/kernel_dev/arch/arm64/configs/
-
デバイスツリーファイル (dts) は次のディレクトリにあります:/opt/rv1126b_sdk/ubuntu/kernel_dev/arch/arm64/boot/dts/rockchip/
3.2.2カーネルのコンパイル
SDKのルートディレクトリ(/opt/rv1126b_sdk/ubuntu/)で以下のコマンドを実行し、カーネルのコンパイル対象ディレクトリを「kernel」から「kernel_dev」に切り替えます。
export KERNEL_DEVELOP=kernel_dev-
この環境変数は【現在の環境】の【現在のターミナルウィンドウ】でのみ有効です。新しくターミナルウィンドウを開いた場合、デフォルトの「kernel」ディレクトリがコンパイル対象に戻ります。
-
このコマンドを .config ファイルに追加して常に有効にすることもできますが、不要になった場合はコメントアウトすることを忘れないでください。
再度 build kernel コマンドを実行します。
./build.sh kernel
2カーネルのコンパイル 図16
【Enterキー】を押して、コンパイル対象がカーネルソースであることを確認します。「kernelディレクトリ以外」のカーネルソースをコンパイルしようとすると、「コンパイルするカーネルディレクトリは /opt/xxx/xxx/kernel_dev ですか?」というプロンプトが表示されます。【Enterキー】を押して再確認すると、コンパイルが実行されます。

2カーネルのコンパイル 図17
💡 注意 :カーネルのコンパイル中に、ディスクファイルのタイムスタンプを確認するステップがあります。この時点で/mntの接続切断されていると、NFSの無限タイムアウトにより処理が停止してしまいます。**解決方法:**まず Ctrl+C でコンパイルを強制終了し、sudo umount -f /mntを実行してディレクトリをアンマウントしてから、再度コンパイルを実行してください。
3.2.3 Wi-Fiドライバのコンパイル
カーネルの【ドライバ設定】や【デバイスツリー設定】を大幅に変更した場合、カーネルドライバのシンボルテーブルが変更されることがあります。rootfs 上でロードされる Wi-Fi ドライバのシンボルテーブルが更新されていないと、シンボルの競合によって Wi-Fi ドライバのロードに失敗します。解決方法: カーネルソースのコンパイルが完了した後、Wi-Fi ドライバを再度コンパイルします。
ubuntu ディレクトリで以下のコマンドを実行し、Wi-Fi ドライバをコンパイルします。
./hooks/hook-none-install-wifibt-db37.sh💡 注意 :このコマンドは rootfs に依存しているため、実行する前に必ず./build.sh all または ./build.sh rootfs を実行しておく必要があります。

3Wi-Fiドライバのコンパイル 図18

3Wi-Fiドライバのコンパイル 図19
3.2.4コンパイル結果の説明
コンパイル完了後、output ディレクトリ内の以下の3つのファイルが更新されます。

4コンパイル結果の説明 図20
-
boot.img: カーネルイメージファイル(Rockchipの U-Boot イメージは uboot.img と呼ばれます)。
-
db37-ko.tar.gz: Wi-Fi・Bluetoothドライバおよび関連設定(Wi-Fiドライバのコンパイルは特殊で、単独で生成する必要があります)。
-
lib_modules.tar.gz: rootfs 段階でロードする必要があるドライバ(例:CONFIG 設定が =m になっているドライバなど)。
※dts やドライバ設定の変更内容が多く、ドライバのシンボルテーブルが変更された場合は、lib_modules.tar.gz と db37-ko.tar.gz を rootfs に解凍して配置する必要があります。
3.3.カーネルの更新
カーネルのコンパイルが完了したら、ショートカットキー【Ctrl+Shift+T】を押して新しいターミナルウィンドウを開きます。

カーネルの更新 図21
先ほどカーネルをコンパイルした出力ディレクトリに移動します。
cd ~/rv1126b_sdk/ubuntu/output
カーネルの更新 図22
次に、3つ目のターミナルウィンドウを開き

カーネルの更新 図23
3.3.1db37-ko.tar.gz の更新
【2つ目のウィンドウ】に戻り、adb コマンドを使用して db37-ko.tar.gz をボードにプッシュします。
adb push db37-ko.tar.gz /userdata
1db37-ko.tar.gz の更新 図24
【3つ目のウィンドウ】に移動し、db37-ko.tar.gz を解凍します。
tar -xvf /userdata/db37-ko.tar.gz -C / && sync
1db37-ko.tar.gz の更新 図25
3.3.2lib_modules.tar.gz の更新
【2つ目のウィンドウ】に戻り、adb コマンドを使用して lib_modules.tar.gz をボードにプッシュします。
adb push lib_modules.tar.gz /userdata
2lib_modules.tar.gz の更新 図26
【3つ目のウィンドウ】に移動し、lib_modules.tar.gz を /usr に解凍します。
cd /userdatatar -xvf lib_modules.tar.gz -C /usr && sync
2lib_modules.tar.gz の更新 図27
3.3.3boot.img の更新
【開発ボード上(3つ目のウィンドウ)】で、【loaderモードへの再起動】コマンドを実行します。
reboot loader- この方法で loader モードに入れない場合は、ハードウェアのボタンを使って入ることもできます(『ファームウェアの書き込みと更新』==2.1-手動でLoaderモードに入る== を参照)。
【2つ目のウィンドウ】に戻り、以下のコマンドを実行して kernel.img を開発ボードに更新します。
sudo upgrade_tool di -boot boot.img
3boot.img の更新 図28
「Download image ok.」と表示されれば、カーネルの書き込みは成功です。以下のコマンドを実行するか、【RSTボタン】を押してデバイスを再起動します。
sudo upgrade_tool rd※もしエラーが表示された場合、ボードが MASKROM モードに入っている可能性があります。その場合は、Baidu Netdisk のファームウェアを使って MiniLoaderall.bin を再度書き込む必要があります。

3boot.img の更新 図29
上記の方法以外にも、【ファームウェア書き込みツール】を使って boot.img を更新することが可能です。具体的な手順としては、コンパイルで生成された boot.img をコピーして手元の【ファームウェアフォルダ】内の boot.img を上書きし、書き込みツールを使って開発ボードに焼き込みます。
3.4.カーネル設定の変更
ubuntu ディレクトリで ./build.sh all または ./build.sh kernel を実行すると、対応するカーネルディレクトリ(kernel または kernel_dev)に .config ファイルが生成されます。

カーネル設定の変更 図30
以下のコマンドで、プラットフォームの環境変数を arm64 に指定します。
export ARCH=arm64- 新しいターミナルを開いたり、コンパイル環境に入り直したりすると、この環境変数は失われるため特に注意してください。
次に make menuconfig を実行し、カーネルの設定メニューを開きます。
make menuconfig
カーネル設定の変更 図31
- ここでの menuconfig はカーネル設定の「検索」にのみ使用します。カーネルのコンパイル操作に不慣れな場合は、直接 menuconfig で設定を変更することは推奨しません。
キーボードの【/】キーを押すと検索メニューが表示されるので、探したいドライバ設定(例:CH343)を入力します。

カーネル設定の変更 図32
【Enterキー】を押して を選択すると、該当するメニューが表示されます。

カーネル設定の変更 図33
-
【Symbol】 は現在必要としているドライバ(例:USB_SERIAL_CH343)です。
-
【Depends on】 は、そのドライバが依存している前提ドライバ(例:USB_SUPPORT, USB, USB_SERIAL)を示しています。

カーネル設定の変更 図34
これらに「CONFIG_」というプレフィックスを付け、rv1126b_eai.config に直接追記すれば設定完了です。
(ここまでで、カーネル開発の完全なフローの説明は終了です。他に必要事項がなければ、これ以降の内容は読む必要はありません。)
3.5.==== 補足説明 ====
3.5.1menuconfig について
もし menuconfig を直接使用してカーネルの設定を行う場合は、ubuntu ディレクトリの ./build.sh kernel を使ってカーネルをコンパイルすることはできません。カーネルのソースコードディレクトリに直接移動し、手動でコンパイルを行う必要があります。手順は以下の通りです:
cd kernel_dev # カーネルソースディレクトリに移動export ARCH=arm64 #プラットフォームをarm64に設定(※新しいターミナルを開くとリセットされるので注意)make rockchip_linux_defconfig rv1126b.config rv1126b_eai.config #これらの設定ファイルを使用して .config を生成make savedefconfig # .config を defconfigとして保存(バックアップ)cp defconfig mydefconfig # 紛失防止のため defconfigをコピーしておくこの状態で、make menuconfig を実行して .config を変更できるようになります。
make menuconfig設定完了後、カーネルを手動でコンパイルするコマンドは以下の通りです:
make rv1126b-nano.img -j8 # rv1126b-nano.dtsをルートデバイスツリーとしてカーネルドライバをコンパイル#rootfs上でロードする必要があるドライバをコンパイルし、lib_modules.tar.gzにパッケージ化するmake modules -j8make modules_install INSTALL_MOD_PATH=/tmpcd /tmp/tar czvf /tmp/lib_modules.tar.gz libcd -# lib_modules.tar.gzをカレントディレクトリに持ってくる(コピーしなくても問題ありません)mv /tmp/lib_modules.tar.gz ./# 最後に、emmcパーティション修復機能を持つ ramdisk を boot.imgにパッケージ化する./mk-fitimage.sh boot.img boot4recovery.its arch/$ARCH/boot/Image$DTB_PATH resource.img rootfs.cpio.gz上記の手動操作を終えたら、この記事の 2.3 Wi-Fiドライバのコンパイル を参照して db37-ko.tar.gz を更新してください。
すべての機能のデバッグが完了し、【アーカイブしてリリース】する必要がある場合は、make savedefconfig を実行して現在の .config を defconfig としてエクスポートします。それを以前の mydefconfig と比較し、差分を手動で rv1126b_eai.config 内に追記して保存してください。
4.開発ボードの rootfs のエクスポート
4.1.エクスポート前の準備
4.1.1EASY-EAI コンパイル環境への移行
PC上の Ubuntu システムで run スクリプトを実行し、EASY-EAI コンパイル環境に入ります。詳細は以下の通りです。
cd ~/develop_environment./run.sh注:EASY-EAI コンパイル環境への入り方や使い方がわからない場合は、まず『スタートガイド/開発環境の準備/Easy-Eaiコンパイル環境の準備と更新』を一読し、その手順に従ってコンパイル環境を構築してください。
4.1.2開発ボードのマウント
次に、シリアルデバッグを通じてボードの IP アドレスが 192.168.3.121 であることを確認し(マウントのパラメータは実際の環境に合わせて変更する必要があります)、開発ボードを /mnt ディレクトリにマウントします。以下の通りです。
sudo mount -t nfs -o nolock 192.168.3.121:/ /mnt
2開発ボードのマウント 図35
4.2.エクスポート操作
EASY-EAI コンパイル環境の【任意の場所】(例として /opt/rv1126b_sdk を使用)で以下のエクスポートコマンドを直接実行すると、開発ボードのファイルシステムが rootfs.img としてエクスポートされます。
export_rootfs
エクスポート操作 図36
- ※この処理にかかる待機時間は、2GB で約1分程度です。
エクスポート成功のプロンプトが表示されます。

エクスポート操作 図37
生成された rootfs.img を確認してください。デフォルトでは【コマンドを実行したディレクトリ】にエクスポートされます。

エクスポート操作 図38
最後に、この rootfs.img を【標準ファームウェア】内の rootfs.img と置き換えることで、量産用のファームウェア書き込みに使用することができます。
4.3.エクスポートに関する説明
/export_rootfs エクスポートスクリプトは、引数を渡すことで rootfs.img の出力先ディレクトリを指定することも可能です。以下のようになります。

エクスポートに関する説明 図39
この場合、rootfs.img は /opt/work/z_test/ というディレクトリ内にエクスポートされます。
4.3.1注意事項
-
引数として渡すディレクトリは、事前に【存在している】必要があります。
-
エクスポート先のディレクトリには【書き込み権限】が必要です。
-
エクスポート先のディスクの空き容量は、新しい rootfs.img が必要とするサイズより大きい必要があります。
-
エクスポートの実行中は、/mnt のマウントを切断してはいけません。