ブログ

Armadillo Base OS:カーネルモジュールを読み込む

at_takuma.fukuda
2023年3月6日 8時28分

Armadillo Base OS製品でカーネルモジュールを読み込む方法をご紹介します。
今回はUSBドングルのドライバを例に、ビルド→Armadillo-IoT G4に読み込んで動作するまでの手順を案内します。
そのためこの記事で提示しているコマンドやマニュアルはArmadillo-IoT G4に準拠したものとなります。
この他の製品をご使用の場合は適宜読み替えをお願いいたします。

*注意事項
この記事の内容はATDE9(v20230328)以降の環境で確認しています。これ以前のバージョンをご使用の場合は動作が異なる可能性があります。ご注意ください。

はじめに

環境について

この記事ではATDEを使用します。ATDEの準備については下記マニュアルをご参考下さい。
4.2. 開発/動作確認環境の構築
またこの手順ではカーネルのビルド、ルートファイルシステムのビルド、SWUファイルのビルドを行います。
それぞれソースコードやツールなどを下記のマニュアルを参考に準備しておいてください。
Linuxカーネル
*ビルドまで完了していると以降の手順がスムーズに進みます。
ルートファイルシステム
mkswu
これらの準備がすべて終わった状態から以降の手順を始めることをお勧めします。

この記事では以下のUSBドングルを使用します。
10Gtek WD-4605AC
このUSBドングルにはRealtekのRTL8812BUが使用されています。

デバイスドライバのクロスコンパイル

デバイスドライバをArmadilloで読み込み可能なカーネルモジュールとしてビルドします。
RTL8812BUのデバイスドライバはGitHUBに公開されているソースコードがあるので、これを取得してビルドします。
Linux Driver for USB WiFi Adapters that are based on the RTL8812BU and RTL8822BU Chipsets

[ATDE ~]$ git clone https://github.com/morrownr/88x2bu-20210702.git
[ATDE ~]$ cd 88x2bu-20210702
対象のアーキテクチャをarm64、クロスツールチェインにaarch64-linux-gnu- を指定し、カーネルソースコードのファイルパスを指定しておきます
[ATDE ~/88x2bu-20210702]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KSRC=[Linuxカーネルソースコードのファイルパス]
[ATDE ~/88x2bu-20210702]$ ls 88x2bu.ko
88x2bu.ko

ビルドしたLinuxカーネルを使用するための設定

Armadillo Base OSでは、標準のLinuxカーネルイメージは、アットマークテクノが提供する linux-at というAlpine Linux用のパッケージに含まれています。
自分でビルドしたLinuxカーネルを使用したい場合は、このパッケージを使用しないように設定する必要があります。
Tips
ルートファイルシステムビルドツールでArmadillo Base OSへインストールするパッケージを定義しているファイルがあるので、
これを編集してlinux-atをインストールしないように設定します。

[ATDE ~/[linuxカーネルのファイルパス]]$ BROOTFS=[ルートファイルシステムビルドツールのファイルパス]
[ATDE ~/[linuxカーネルのファイルパス]]$ sed -i -e '/^linux-at/d' "$BROOTFS/ax2/packages"

ファイルのコピー

以下の通りに Linuxカーネルイメージ・モジュール・dtbをルートファイルシステムビルドツールの所定のディレクトリに配置します。
この手順はLinuxカーネルのビルドが完了した状態で実行してください。

[ATDE ~/[linuxカーネルのファイルパス]]$ BROOTFS=[ルートファイルシステムビルドツールのファイルパス]
Linuxカーネルイメージをコピー
[ATDE ~/[linuxカーネルのファイルパス]]$ cp -v arch/arm64/boot/Image "$BROOTFS/ax2/resources/boot/"
DTB・DTBOをコピー
[ATDE ~/[linuxカーネルのファイルパス]]$ cp -v arch/arm64/boot/dts/freescale/armadillo_*.{dtb,dtbo} "$BROOTFS/ax2/resources/boot/"
カーネルモジュールをコピー
[ATDE ~/[linuxカーネルのファイルパス]]$ rm -rfv "$BROOTFS/ax2/resources/lib/modules"
[ATDE ~/[linuxカーネルのファイルパス]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH="$BROOTFS/ax2/resources" -j5 modules_install
クロスコンパイルしたデバイスドライバをコピー
[ATDE ~/[linuxカーネルのファイルパス]]$ KVER="$(\ls $BROOTFS/ax2/resources/lib/modules/)"
[ATDE ~/[linuxカーネルのファイルパス]]$ mkdir "$BROOTFS/ax2/resources/lib/modules/$KVER/extra/"
[ATDE ~/[linuxカーネルのファイルパス]]$ cd  [88x2bu-20210702ディレクトリ]
[ATDE ~/88x2bu-20210702]$  cp 88x2bu.ko "$BROOTFS/ax2/resources/lib/modules/$KVER/extra/"

カーネルモジュールの依存関係の設定

depmodコマンドでカーネルモジュールの依存関係情報を更新し、追加したカーネルモジュールもシステム起動時に自動的にロードされるようにしておきます。

[ATDE ~/[linuxカーネルのファイルパス]]$ /sbin/depmod -ae -F System.map -b "$BROOTFS/ax2/resources" "$KVER"

ルートファイルシステムイメージのビルド

変更した設定やコピーしたファイルを取り込んだルートファイルシステムのイメージファイルをビルドします。

[ATDE ~[ルートファイルシステムビルドツールのファイルパス]]$ sudo ./build_rootfs.sh
[ATDE ~[ルートファイルシステムビルドツールのファイルパス]]$ ls *tar.zst
baseos-x2-[VERSION].tar.zst

インストール用イメージの作成

ビルドしたルートファイルシステムイメージをArmadillo-IoT G4本体に書き込むためのSWUイメージファイルを作成します。
SWUイメージを作成するにはdescファイルという定義ファイルを用意する必要があります。
今回は以下のようなファイルを作成します。

[ATDE ~/mkswu]$ vi OS_update.desc
swdesc_option component=base_os version=[VERSION]-[ユーザ独自バージョン表記] 
swdesc_tar "baseos-x2-[VERSION].tar.zst"

定義ファイルを作成したらSWUイメージを生成します。
先ほど作成したルートファイルシステムのイメージファイルを定義ファイルと同じディレクトリに移動した上で実行してください。

必要なファイルが存在することを確認
[ATDE ~/mkswu]$ ls
OS_update.desc
baseos-x2-[VERSION].tar.zst
swuファイルビルド
[ATDE ~/mkswu]$ mkswu OS_update.desc
ビルド結果確認
[ATDE ~]/mkswu$ ls OS_update.swu
OS_update.swu

動作の確認

作成したSWUイメージを使ってArmadillo-IoT G4本体に書き込みを行ってください。
具体的な方法は製品マニュアルをご参考下さい。
9.8.3. イメージのインストール
再起動されたら正常に書き込みが完了しています。インストール実行後数分以上経っても再起動されない場合は何らかの処理に失敗っしている可能性があるので、「tail /var/log/messages」コマンドで実行結果を確認し、対処を行ってください。

再起動後、USBドングルをUSBポートに挿入して下さい。読み込んだドライバを使って自動的に動作します。
以下のようにifconfigコマンドでwlanデバイスとして表示されていれば確認完了です。

[armadillo ~]$ ifconfig | grep wlan0
wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX