ブログ

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

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

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

※注意事項※
この手順は2023/3/6時点でAlpine Linuxルートファイルシステム ビルドツールにv3.17-at.3を使用して確認したものです。
以降の製品アップデートで手順が変わることがありますのでご留意ください。

はじめに

環境について

この記事では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 ~]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- KSRC=[Linuxカーネルソースコードのファイルパス]
[ATDE ~]$ ls 88x2bu.ko
88x2bu.ko

コンパイルしたドライバを使用するLinuxカーネル・ルートファイルシステムの作成

カーネルモジュールインストール

以下の通りにLinuxカーネルからルートファイルシステムにカーネルモジュールのインストールを行います。
作成された/lib/modules/[Linuxカーネルバージョン]ディレクトリの直下にextraディレクトリを作成します。
この手順はLinuxカーネルのビルドが完了した状態で実行してください。

[ATDE ~]$ cd [linuカーネルのファイルパス]
[ATDE ~/[linuカーネルのファイルパス]]$ make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- INSTALL_MOD_PATH="$BROOTFS/resources" -j5 modules_install
[ATDE ~/[linuカーネルのファイルパス]]$ ls [ルートファイルシステムビルドツールのファイルパス]/ax2/resources/lib/modules
[Linuxカーネルのバージョン]
[ATDE ~]$ mkdir /lib/modules/[Linuxカーネルバージョン]/extra

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

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

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

ファイルのコピー

クロスコンパイルしたカーネルモジュールとLinuxカーネルイメージ・dtbをルートファイルシステムビルドツールの所定のディレクトリに配置します。

[ATDE ~/[linuカーネルのファイルパス]]$ cp -v arch/arm64/boot/Image "$BROOTFS/ax2/resources/boot/"
[ATDE ~/[linuカーネルのファイルパス]]$ cp -v arch/arm64/boot/dts/freescale/armadillo_*.{dtb,dtbo} "$BROOTFS/ax2/resources/boot/"
[ATDE ~/[linuカーネルのファイルパス]]$ rm -rfv "$BROOTFS/resources/lib/modules" 3
[ATDE ~]$ cp 88x2bu.ko [ルートファイルシステムビルドツールのファイルパス]/ax2/resources/lib/modules/[Linuxカーネルバージョン]/extra/

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

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

[ATDE ~]$ sudo ./build_rootfs.sh
[ATDE ~]$ ls *tar.zst
baseos-x2-[VERSION].tar.zst

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

ビルドしたルートファイルシステムイメージをArmadillo-IoT G4本体に書き込むためのSWUイメージファイルを作成します。
また、インストール実行時にカーネルモジュールも読み込まれるよう、カーネルモジュールの依存関係情報を更新するdepmodコマンドを実行するようにしておきます。
SWUイメージを作成するにはdescファイルという定義ファイルを用意する必要があります。
今回は以下のようなファイルを作成します。

[ATDE ~]$ cat OS_update.desc
swdesc_option component=base_os version=[VERSION]-[ユーザ独自バージョン表記] 
swdesc_tar "baseos-x2-[VERSION].tar.zst"
swdesc_command "depmod [カーネルバージョン]"

定義ファイルを作成したらSWUイメージを生成します。

[ATDE ~]$ mkswu OS_update.desc
[ATDE ~]$ 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