Embedded Linux Development Links
2024年12月3日更新(修正版テキスト対応版)
https://interface.cqpub.co.jp/linux-hands-on/
この文書のページ: https://ahidaka.github.io/EmbeddedLinuxDevelopmentLinks/
ソースコード: https://github.com/ahidaka/EmbeddedLinuxDevelopmentLinks
ハンズオン中にオンラインで参照、使用するリンクとコマンド集です。
コマンドは必ず行頭に、入力対象のコマンドプロンプトがあるのでご注意ください。
エディタ は nano vi/vim emacs が利用出来ます。
$ exit
$ sudo shutdown -r now
$ sudo shutdown -h now
後に以下を実行。
> wsl --shutdown
https://github.com/TeraTermProject/teraterm/releases/tag/v5.3
UUU 1.5.21 (Universal Update Utility)
https://github.com/nxp-imx/mfgtools/releases/tag/uuu_1.5.21
ファームウェア Yocto Linux Full Image (wic)
https://avtinc.sharepoint.com/:u:/t/ET-Downloads/EX0ZecM2petAnDaj2Ky3d7MByKoB55fRASdztgjpTxtYuw
ファームウェア BootLoader u-boot Image
https://avtinc.sharepoint.com/:u:/t/ET-Downloads/ES_q6BqSIV9JssbRsO5n-2UB2AtMwp3Ygkjp0Viu5iUrow
電源側USBケーブルだけを接続した状態(コンソールUSBは取り外し)で、コマンドプロンプトを起動して、UUUコマンドでファームウェアを書きこみます。
> uuu -b emmc_all u-boot-maaxboard-8ulp.imx avnet-image-full-maaxboard-8ulp.wic
IPアドレス調査。
$ ip a
sysfs LED ディレクトリ。
# cd /sys/class/leds
# ls
ledblue ディレクトリの中を確認。
# ls ledblue
赤と緑を点灯。
# echo 0 > /sys/class/leds/ledblue/brightness
# echo 1 > /sys/class/leds/ledgreen/brightness
# echo 1 > /sys/class/leds/ledred/brightness
# shutdown -h now
コンソールの Power down メッセージを確認後、電源側USBコネクターを切断して下さい。
動作環境の構築手順は、ハンズオン環境構築 資料として公開しています。 https://github.com/ahidaka/BuildingWSLEmbeddedLinux
最新版へのシステムの更新と、treeコマンドのインストール確認。
$ cd
$ sudo apt update
$ sudo apt upgrade
$ sudo apt install tree -y
$ ls ~/linux-imx
$ ls ~/toolchain
$ ls ~/toolchain/rm-gnu-toolchain-12.2.rel1-x86_64-aarch64-none-linux-gnu
$ ls ~/imx-yocto-bsp
$ ls ~/imx-yocto-bsp/sources/
$ ls ~/imx-yocto-bsp/maaxboard-8ulp/build/
WSL上に作業ディレクトリ(以降 work)を作成してダウンロード。
$ mkdir work; cd work;
$ git clone https://github.com/ahidaka/HelloLinuxDriver.git
$ git clone https://github.com/ahidaka/SysfsLedController.git
$ git clone https://github.com/ahidaka/GeneralIoTModules.git
wgetでダウンロード入手。
$ cd ~/work
$ wget http://www.devdrv.co.jp/download/tse/202409yocto/CROSS_ENV
$ wget http://www.devdrv.co.jp/download/tse/202409yocto/send_udp.ko.xz
$ cd ~/work
$ source CROSS_ENV
$ cd SysfsLedController/sysfs_led; make
$ cd ~/work/GeneralIoTModules/udp; make
$ cd ~/work; tar xJvf send_udp.ko.xz
こんちは!あなたは優秀なLinuxカーネルに詳しいIoTプログラマーです。
初心者用の学習用に、単純な演習用のLinuxローダブルモジュールを次の条件で作成してください。
1. モジュール名は、greeting.ko とします。
2. ローダブルモジュール用のsysfs パラメータとして"debug" というint型の値、初期値'0'を持ちます。
3. 起動時にprintkで"Greetings! debug=%d" というメッセージで、debug パラメータの値を表示します。
4. Linuxカーネル 6.2 でビルドするためのMakefileも同時に出力します。
応答。
greeting.c
「実際の画面を参照してください」
Makefile
「実際の画面を参照してください」
ありがと。試してみます。
ここで、実際にビルドして、ファイル転送後、ロードして動作確認します。
$ cat > greeting.c
$ cat > Makefile
この時 Makefileがセルフコンパイル用記述の場合は、カーネルディレクトリ参照定義を $(KDIR) に修正します。 またMakefileの字下げ行頭文字が「タブ」である点に十分注意します。
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
の記述を以下の様に修正。行頭をタブに変更することを忘れずに。
make -C $(KDIR) M=$(PWD) modules
ビルドします。
$ make
以下で greeting の全ソースコードを公開しています。
https://github.com/ahidaka/GreetingLinuxDriver
Maaxboardに転送。 192.168.51.154 はMaaxboard のIPアドレスです。実際のアドレスに書き換えます。
$ scp greeting.ko root@192.168.51.154:
または
$ rsync -e ssh -a greeting.ko root@192.168.51.154:
# cd
# insmod greeting.ko debug=5
ビルド、転送、ロード、動作確認した後のお礼。
ありがと。一発で完璧に動きました!すごいです。感激です。
ジョーク!
エッヘン。すごいだろう!と言って自慢してみてください。
前述の手順でビルドした、次の4種類のカーネルモジュールを使用して、ローダブルモジュールの取り扱いを確認します。HelloLinuxDriver リポジトリのモジュールは元、インターフェース2005年7月号掲載 のサンプルドライバーが元ですが、Copilotの助けでカーネル6.xに移植しました。
Use | Repository | Folder | target | 説明 |
---|---|---|---|---|
- | HelloLinuxDriver | hello | hello.ko | デバッグメッセージ |
- | HelloLinuxDriver | hello | hello_m.ko | 複数ソース |
- | HelloLinuxDriver | hello | params.ko | 様々なモジュール・パラメータ |
- | HelloLinuxDriver | schedule | kthread.ko | Kernel Thread |
- | HelloLinuxDriver | schedule | period.ko | 定期実行 Kernel Thread |
- | HelloLinuxDriver | schedule | tasklet.ko | tasklet |
- | HelloLinuxDriver | schedule | workq.ko | 汎用 Workqueue |
- | HelloLinuxDriver | schedule | workq2.ko | カスタム Workqueue |
Yes | SysfsLedController | sysfs_led | sysfs_led_lib.ko | sysfsLEDライブラリ |
Yes | SysfsLedController | sysfs_led | sysfs_led_test.ko | sysfsLED実行 |
Yes | GeneralIoTModules | udp | send_udp.ko | UDP汎用ファイル送信 |
Yes | GeneralIoTModules | udp | receive_udp.ko | UDP汎用ファイル受信 |
WSLのコマンドプロンプトで操作して、Maaxboardに転送。 192.168.51.154 はMaaxboard のIPアドレスです。実際のアドレスに書き換えます。
$ scp sysfs_led_lib.ko root@192.168.51.154:
$ scp sysfs_led_tesl.ko root@192.168.51.154:
または
$ rsync -e ssh -a sysfs_led_lib.ko root@192.168.51.154:
$ rsync -e ssh -a sysfs_led_tesl.ko root@192.168.51.154:
# insmod sysfs_led_lib.ko
# insmod sysfs_led_test.ko
SYSFSパラメータにパターンを出力して確認。
# echo 1 > /sys/module/sysfs_led_test/parameters/pattern
# echo 2 > /sys/module/sysfs_led_test/parameters/pattern
# echo 3 > /sys/module/sysfs_led_test/parameters/pattern
# echo 4 > /sys/module/sysfs_led_test/parameters/pattern
# echo 7 > /sys/module/sysfs_led_test/parameters/pattern
# echo 0 > /sys/module/sysfs_led_test/parameters/pattern
WSLのコマンドプロンプトで操作して、モジュールをMaaxboardに転送。 192.168.51.154 はMaaxboard のIPアドレスです。実際のアドレスに書き換え。 テキストファイル中にsend_udd.ko とあるのは、send_udp.ko の間違いです。
$ scp send_udp.ko root@192.168.51.154:
$ scp reseive_udp.ko root@192.168.51.154:
または
$ rsync -e ssh -a send_udp.ko root@192.168.51.154:
$ rsync -e ssh -a reseive_udp.ko root@192.168.51.154:
Maaxboardでロード。
# insmod send_udp.ko debug=1
# insmod receive_udp.ko debug=1
SYSFSのdataパラメータを使用して、データ送信後、次に受信。
# echo "This is test send data." > /sys/module/send_udp/parameters/data
# cat /sys/module/receive_udp/parameters/data
実行時にシリアルコンソールのデバッグログ出力確認。 syslog出力確認。
# tail /var/log/syslog
WSLのコマンドプロンプトで操作して、受信モジュールをMaaxboardに転送。 192.168.51.154 はMaaxboard のIPアドレスです。実際のアドレスに書き換え。
$ scp reseive_udp.ko root@192.168.51.154:
または
$ rsync -e ssh -a reseive_udp.ko root@192.168.51.154:
$ cd ~/work
$ sudo insmod send_udp.ko debug=1
Maaxboardでロード。
# insmod send_udd.ko debug=1
SYSFSのdataパラメータを使用して、データを送信後、受信。
192.168.51.154 はMaaxboard のIPアドレスです。実際のアドレスに書き換え。
$ sudo echo 192.168.51.154 > /sys/module/send_udp/parameters/ip
$ sudo echo "This is test send data." > /sys/module/send_udp/parameters/data
Maaxboard 受信。
# cat /sys/module/receive_udp/parameters/data
シリアルコンソールのデバッグログ出力確認。syslog出力を確認。
# tail /var/log/syslog
$ cd ~/imx-yocto-bsp
$ source sources/poky/oe-init-build-env maaxboard-8ulp/build
この、oe-init-build-env の呼び出しで、build ディレクトリに移動します。
~/imx-yocto-bsp/maaxboard-8ulp/build$ ディレクトリに移動したことを確認して、最初に meta-greeting レイヤーを作成します。
$ bitbake-layers create-layer meta-greeting
つづいて。
$ bitbake-layers add-layer meta-greeting
tree コマンドで確認。
$ tree meta-greeting
layer.conf の内容確認。
$ cat meta-greeting/conf/layer.conf
example_0.1.bb ファイル確認。
$ cat meta-greeting/recipes-example/example/example_0.1.bb
example レシピを削除。
$ cd meta-greeting
$ rm -rf recipes-example
フォルダ作成。
$ mkdir -p recipes-greeting/greeting
$ cd recipes-greeting/greeting
$ mkdir files
$ cp ~/imx-yocto-bsp/sources/poky/meta-skeleton/recipes-kernel/hello-mod/hello-mod_0.1.bb greeting_0.1.bb
エディタで編集します。
テキスト22ページ 3.3.1.1. レシピファイルのコピーと編集 に編集内容の抜けがありましたので、修正掲載します。 以下の部分、最後の kernel-module-greeting の行の修正が抜けていました。
前略
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=12f884d2ae1ff87c09e5b7ccc2c4ca7e"
inherit module
SRC_URI = "file://Makefile \
file://greeting.c \
"
S = "${WORKDIR}"
# The inherit of module.bbclass will automatically name module packages with
# "kernel-module-" prefix as required by the oe-core build environment.
RPROVIDES:${PN} += "kernel-module-greeting"
以下の clone コマンドで取得します。Copilotで作成して動作確認済の場合は不要です。
$ cd
$ git clone https://github.com/ahidaka/GreetingLinuxDriver.git
cp コマンドで greeting.c ソースコードだけをコピーします。
cd ~/imx-yocto-bsp/maaxboard-8ulp/build
$ cp ~/GreetingLinuxDriver/greeting/greeting.c meta-greeting/recipes-greeting/greeting/files
Makefileファイルをコピー、先頭行のターゲット名だけを変更して利用。
$ cp ~/imx-yocto-bsp/sources/poky/meta-skeleton/recipes-kernel/hello-mod/files/Makefile meta-greeting/recipes-greeting/greeting/files
修正前のMakefileの1行目
obj-m := hello.o
修正後のMakefileの1行目
obj-m := greeting.o
local.conf 編集。
...前略...
CONF_VERSION = "2"
IMAGE_INSTALL:append = " greeting"
...後略...
bitbake greeting
エラー発生。
md5 checksum is 0835ade698e0bcf8506ecda2f7b4f302
「checksum is 」 で指摘の値をコピーして書き換え。
$ bitbake greeting
bitbake 出力の、デバッグシンボル付きのローダブルモジュールの場所
./work/maaxboard_8ulp-poky-linux/greeting/0.1-r0/greeting.ko
シンボル削除済のローダブルモジュールの場所
./sysroots-components/maaxboard_8ulp/greeting/lib/modules/6.1.22+g78ce688d5a79/extra/greeting.ko
core-image-minimal は、最小構成でビルドするために poky で指定されている包括的なレシピです。
$ bitbake core-image-minimal
作成される転送用のROMイメージ。
~/imx-yocto-bsp/maaxboard-8ulp/build/tmp/deploy/images/maaxboard-8ulp/core-image-minimal-maaxboard-8ulp.wic
■ Maaxboard 電源断
# shutdown -h now
■ ファームウェア・コピー
cp ~/imx-yocto-bsp/maaxboard-8ulp/build/tmp/deploy/images/maaxboard-8ulp/core-image-minimal-maaxboard-8ulp.wic /mnt/c/FIRM
■ ファームウェア書き込み
電源切断後、ジャンパピンを設定し直して、USB電源ケーブルだけの接続 としてMaaxboard の電源を入れてファームウェアをMaaxboard に書き込みます。
> uuu -b emmc_all u-boot-maaxboard-8ulp.imx avnet-image-full-maaxboard-8ulp.wic
■ 動作確認
Maaxboard にファームウェア書き込み完了後は、ジャンパピンを設定し直して、USB電源ケーブルだけとシリアルコンソールケーブルの両方を接続して電源を入れて、動作確認します。
ハンズオン時間の都合上、小規模ルートファルシステムの core-image-minimal レシピで bitbake したため、Maaxboard では sshdが動作しない点に注意してください。
# depmod -a
# modprove greeting
シリアルコンソールで、以下のメッセージ出力を確認します。
greeting: loading out-of-tree module taints kernel.
Greetings! debug=0
greeting.ko は次の場所にインストールされています。
/lib/modules/6.1.22+g78ce688d5a79/extra/greeting.ko
時間がある方は、同様に追加するレシピ名を receive-udp として、meta-receive-udp を作成、追加して動作確認します。
$ bitbake-layers create-layer meta-receive-udp
$ bitbake-layers add-layer meta-receive-udp
bitbake コマンド。
$ bitbake core-image-minimal
追加レシピの内容や追加ファイルの内容に誤りがあった場合は、再度 bitbake し直してもデータがキャッシュされているため、作成されるイメージが変更されません。この問題に対応するために、再度 bitbake する際に、古いキャッシュをクリアする方法を説明します。
キャッシュクリアは、bitbake 対象の該当レシピの最小のもので実行します。例えば今回のハンズオンで、bitbake core-image-minimal を再度実行する場合でも、その前に動作確認として実行した、テキスト23ページ 3.3.3. 単一レシピだけのbitbakeからやり直します。その際にキャッシュをクリアするための
$ bitbake -c cleansstate greeting
と -c cleansstate オプションを付けて bitbake を実行します。
core-image-minimal を再実行する場合は、続いて、
$ bitbake core-image-minimal
レシピの内容やレシピに含まれるファイルを修正、変更した場合は、この様にして何回でもレシピの内容を修正しながら、bitbake を試すことが可能です。
https://github.com/Avnet/MaaXBoard-8ULP-HUB
https://www.avnet.com/wps/wcm/connect/onesite/07e9ad99-8969-40c1-b632-db97adf350d0/MaaXBoard-8ULP-Linux-Yocto-UserManual-V3.1.pdf?MOD=AJPERES
https://www.avnet.com/wps/wcm/connect/onesite/4fa62a19-239c-40c9-aff6-8a122f993f1e/MaaXBoard-8ULP-Linux-Yocto-Development-Guide-V3.1.pdf?MOD=AJPERES
https://www.avnet.com/wps/wcm/connect/onesite/60e2bb73-e479-4f76-821f-0b811ae52643/MaaXBoard-8ULP-User-Guide-v1.0.pdf?MOD=AJPERES
uuu (Universal Update Utility), mfgtools 3.0(https://github.com/nxp-imx/mfgtools)
https://github.com/nxp-imx/mfgtools
https://github.com/ahidaka/InstallingWSLEmbeddedLinux
https://github.com/ahidaka/BuildingWSLEmbeddedLinux