ブログ

Armadillo-IoT G3/G3L: JP1を設定せずにSDカード内のカーネルを起動する方法

at_syunya.ohshio
2017年11月24日 17時04分

Armadillo-IoT G3/G3L(以下Armadilloと表記)で、JP1を設定せずにSDカード内のLinuxカーネルを起動する方法をご紹介します。

概要

2017/11/24現在、Armadilloの製品マニュアル内「SDブートの活用」で紹介されているSDブート実行方法に「JP1をショートに設定する」という操作が記載されています。
これは利用者自身が「Armadilloの外装を取り外し、ジャンパーをJP1に差し込みショートに設定する」という一連の作業をしなければならず、手間が発生しています。
これを回避するため、Armadilloで採用しているブートローダー「U-Boot」の機能である「起動時のスクリプトファイル(boot.scr)読み込み」を利用します。

今回は例として、「ArmadilloのBoot時、SDカードの第一パーティション内に【sdboot_enable】というファイルが存在した場合、SDカードに保存されているLinuxカーネルを起動する」という処理を記載します。
また今回の方法ではマニュアルのSDブートとは違い、SPIフラッシュの「U-Boot」からSDカード内に保存されたLinuxカーネルを起動します。

U-bootで用いるスクリプトファイル(boot.scr)について

U-Bootスクリプト(boot.scr)については別ブログ
Armadillo-X1, Armadillo-IoT G3/G3L: U-Bootブートスクリプト(boot.scr)の使い方
にて紹介されています。
詳しい情報はこちらを参照してください。

U-Bootコマンドのテキストファイル(boot.txt)作成

ATDE上でテキストファイル"boot.txt"を作成します。

atde:~$ vi boot.txt

"boot.txt"は以下のように記載します。

setenv sdboot_mmcdev 0
setenv sdboot_part 1
setenv get_sdboot_state fatload mmc ${sdboot_mmcdev}:${sdboot_part} ${loadaddr} sdboot_enable

if run get_sdboot_state; then
  echo try SD boot...
  setenv mmcdev 0
  setenv mmcpart 1
  setenv mmcroot /dev/mmcblk0p2 rootwait rw
fi

if mmc rescan; then
 if run loadimage; then
   run mmcboot;
 fi
fi

上記スクリプト内で、「SDカードデバイスの有無を確認し、存在する場合に指定変数を変更する」という処理を行っています。
各変数の詳細を以下の表に記載します。

変数名 変数詳細 パラメータ例と詳細 パラメータの使用場所
mmcdev デバイスコードナンバー 0 : SDカード 1 : eMMC U-Boot
mmcpart パーティション番号 1 : パーティション1 U-Boot
mmcroot カーネルパラメータ ルートファイルシステムの場所 dev/mmcblk0p2 : SDカードデバイス Linuxカーネル

boot.scrの生成

ATDE上でboot.scrを生成します。

atde:~$ mkimage -A arm -O linux -T script -C none -a 0 -e 0 -d boot.txt boot.scr

生成した"boot.scr"をArmadilloに転送して下さい。

boot.scrの配置

ATDEからArmadilloに転送した"boot.scr"を、eMMCの第1パーティション(/dev/mmcblk2p1)にコピーします。

armadillo:~# mount /dev/mmcblk2p1 /mnt/
armadillo:~# cp boot.scr /mnt/
armadillo:~# sync
armadillo:~# umount /mnt/

SDブートの準備

マニュアル内の項目「SD ブートの活用」を参考にATDEでブートディスクを作成します。
ATDEでのブートディスク作成後、SDカードの第一パーティションに「sdboot_enable」という空ファイルを作成します。
SDカードのデバイス名は適宜変化するため、確認の上指定してください。(以下例ではsdb)

atde:~$ sudo mount /dev/sdb1 /mnt
atde:~$ touch /mnt/sdboot_enable
atde:~$ sync
atde:~$ sudo umount /mnt

作成後、ブートディスクをArmadilloのSDスロットに接続します。

Armadilloの再起動と確認

Armadilloを再起動して、SDカードのLinuxカーネルが起動する事を確認します。

armadillo:~# reboot

dfコマンドを用いてファイルシステム情報を呼び出し、「Filesystem 」欄の「/dev/mmcblk〇p2」の〇部分の数値を確認します。
以下のように「/dev/mmcblk0p2」であればSDカードのLinuxカーネル起動成功です。

armadillo:~# df
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/mmcblk0p2   1738128 659996    971792  41% /
udev               10240      0     10240   0% /dev
tmpfs             100272   4840     95432   5% /run
tmpfs             250672      0    250672   0% /dev/shm
tmpfs               5120      0      5120   0% /run/lock
tmpfs             250672      0    250672   0% /sys/fs/cgroup
/dev/mtdblock1       128    128         0 100% /opt/license
tmpfs              50136      0     50136   0% /run/user/0

eMMCのLinuxカーネル起動に戻したい場合は一度Armadilloの電源を落とし、ブートディスクを取り出してから電源を入れなおすことで戻ります。
以下のように「/dev/mmcblk2p2」であればeMMCのカーネル起動に戻っています。

armadillo:~# df
Filesystem     1K-blocks   Used Available Use% Mounted on
/dev/mmcblk2p2   3457408 745560   2516504  23% /
udev               10240      0     10240   0% /dev
tmpfs             100272   4828     95444   5% /run
tmpfs             250672      0    250672   0% /dev/shm
tmpfs               5120      0      5120   0% /run/lock
tmpfs             250672      0    250672   0% /sys/fs/cgroup
/dev/mtdblock1       128    128         0 100% /opt/license
tmpfs              50136      0     50136   0% /run/user/0

注意点

IoTゲートウェイ管理クラウド「node-eye」に必要なnode-eyeパッケージをArmadilloにインストールすると、node-eye専用のboot.scrに上書されますのでご注意ください。
また、独自作成した"boot.scr"を使用したい場合、IoTゲートウェイ管理クラウド「node-eye」を利用することが出来ませんのでご注意ください。