第12章 フラッシュメモリの書き換え方法

本章では、Armadillo-IoT のフラッシュメモリに書き込まれているイメージファイルを更新する手順について説明します。

フラッシュメモリの書き換え方法には、大きく分けて以下の3種類の方法があります。

表12.1 フラッシュメモリの書き換え方法

方法特徴
netflashを使用する
  • イメージファイルをネットワークまたはストレージで転送するため書き換えが高速

  • ArmadilloでLinuxにログインできる必要がある

ダウンローダーを使用する
  • イメージファイルをシリアルで転送するため書き換えが低速

  • Armadilloでブートローダーが起動できればよい

TFTPを使用する
  • イメージファイルをネットワークで転送するため書き換えが高速

  • Armadilloでブートローダーが起動できればよい


フラッシュメモリを書き換えるためには、Linuxまたはブートローダーが起動している必要があります。フラッシュメモリに書き込まれているブートローダーが起動しない状態になってしまった場合は、「ブートローダーが起動しなくなった場合の復旧作業」を参照してブートローダーを復旧してください。

[ティップ]

ダウンローダーを使用してユーザーランドイメージなどサイズの大きなイメージファイルを書き換えると非常に時間がかかります。これは、イメージファイルをArmadilloに転送する際にシリアルの転送速度がボトルネックとなるためです。サイズの大きなイメージファイルを書き換える場合はnetflashまたはTFTPを使用する方法を推奨します。

12.1. フラッシュメモリのパーティションについて

フラッシュメモリの書き換えは、パーティション毎に行います。パーティションは"リージョン"とも呼ばれます。

各パーティションのサイズはフラッシュメモリ内には保存されていません。ブートローダーとLinuxカーネルそれぞれが同じパーティションテーブルを保持することにより、一意的に扱うことができるようになっています。

各パーティションは、書き込みを制限することが可能です。書き込みを制限する理由は、誤動作や予期せぬトラブルにより、フラッシュメモリ上のデータが不意に破壊または消去されることを防ぐためです。

読み込みは、常時可能です。読み込みに制限を付けることはできません。

各パーティションのデフォルト状態での書き込み制限の有無と、対応するイメージファイル名を表12.2「パーティションのデフォルト状態での書き込み制限の有無と対応するイメージファイル名」に示します。

表12.2 パーティションのデフォルト状態での書き込み制限の有無と対応するイメージファイル名

パーティション書き込み制限イメージファイル名備考

bootloader

あり

loader-armadillo-iotg-std-[version].bin

ブートローダーイメージを配置するパーティションです。

kernel

なし

linux-aiotg-std-[version].bin.gz

Linuxカーネルイメージを配置するパーティションです。

userland

なし

romfs-aiotg-std-[version].img.gz

ユーザーランドイメージを配置するパーティションです。

config

なし

なし

ユーザーランドアプリケーション"flatfsd"がFlat file-system(フラッシュメモリ向けファイルシステム)を構築するパーティションです。使用方法については7章コンフィグ領域 − 設定ファイルの保存領域を参照してください。


[ティップ]

工場出荷状態でフラッシュメモリに書き込まれているイメージファイルは、最新版ではない可能性があります。最新版のブートローダー、LinuxカーネルイメージファイルはArmadilloサイトから、ユーザーランドイメージファイルはユーザーズサイトからダウンロード可能です。最新版のイメージファイルに書き換えてからのご使用を推奨します。

ダウンローダーでは、書き込みが制限されているパーティションを"ロック(locked)されている"と呼びます。このパーティションを強制的に書き換える場合は、"--force-locked"というオプションを付けます。他のオプションについては、「ダウンローダーを使用してフラッシュメモリを書き換える」を参照してください。

Linuxが動いている場合は、書き込みが制限されているパーティションを書き換えることはできません。そのため、bootloaderパーティションをnetflashで書き換えることはできません。

12.2. netflashを使用してフラッシュメモリを書き換える

Linux が動作している状態では、Linux アプリケーションの netflash を利用することでフラッシュメモリを書き換えることができます。ここでは、netflash を利用して次に示す場所に存在するイメージファイルをフラッシュメモリに書き込む手順を紹介します。

  • Webサーバー上のイメージファイル

  • ストレージ上のイメージファイル

netflashコマンドのヘルプは次の通りです。

[armadillo ~]# netflash -h
usage: netflash [-bCfFhijklntuv?] [-c console-device] [-d delay] [-o offset] [-r flash-device]
                [net-server] file-name

	-b      don't reboot hardware when done
	-C      check that image was written correctly
	-f      use FTP as load protocol
	-F      force overwrite (do not preserve special regions)
	-h      print help
	-i      ignore any version information
	-H      ignore hardware type information
	-j      image is a JFFS2 filesystem
	-k      don't kill other processes (or delays kill until
		after downloading when root filesystem is inside flash)
	-K      only kill unnecessary processes (or delays kill until
		after downloading when root filesystem is inside flash)
	-l      lock flash segments when done
	-n      file with no checksum at end (implies no version information)
	-p      preserve portions of flash segments not actually written.
	-s      stop erasing/programming at end of input data
	-t      check the image and then throw it away
	-u      unlock flash segments before programming
	-v      display version number

図12.1 netflashコマンドのヘルプ


"-r"オプションに指定するフラッシュメモリのデバイスファイルとパーティションの対応を次に示します。

表12.3 フラッシュメモリのパーティションとデバイスファイル

パーティションデバイスファイル
kernel/dev/flash/kernel
userland/dev/flash/userland
config/dev/flash/config

[注記]

bootloaderパーティションは書き込みが制限されているため、netflashで書き換えることはできません。

12.2.1. Webサーバー上のイメージファイルを書き込む

ATDEでは、標準でWebサーバー(lighttpd)が動作しており、/var/www/ディレクトリ以下に置かれたファイルはネットワーク経由でダウンロードすることができます。netflash は、HTTPによるファイルのダウンロードをサポートしています。

ここでは、ATDEとネットワーク通信ができることを前提に、ATDEからイメージファイルをダウンロードしてkernelパーティションに書き込む手順を説明します。

手順12.1 Webサーバー上のイメージファイルを書き込む

  1. ATDEの/var/www/ディレクトリにLinuxカーネルイメージファイルを置きます。

    [ATDE ~]$ ls
    linux-aiotg-std-[version].bin.gz
    [ATDE ~]$ cp linux-aiotg-std-[version].bin.gz /var/www/
  2. Webサーバー上のイメージファイルのURL(http://[ATDEのIPアドレス]/linux-aiotg-std-[version].bin.gz)を指定して netflashコマンドを実行します。次の例では、ATDEのIPアドレスが「192.0.2.1」であることを想定しています。

    [armadillo ~]# netflash -b -k -n -u -s -r /dev/flash/kernel http://192.0.2.1/linux-aiotg-std-[version].bin.gz
    ................................................................................
    ................................................................................
    (省略)
    ......................................
    netflash: got "http://192.0.2.1/linux-aiotg-std-[version].bin.gz", length=3388178
    netflash: programming FLASH device /dev/flash/kernel
    ....................
  3. Armadilloのプロンプトが表示されるとフラッシュメモリの書き換えは完了です。次回起動時から書き換えたLinuxカーネルイメージで起動します。

    [armadillo ~]# 

12.2.2. ストレージ上のイメージファイルを書き込む

ストレージ(SDカードやUSBメモリ)をマウントすることで、ストレージに保存されたイメージファイルをフラッシュメモリに書き込むことができます。

ここでは SDカードに保存されているイメージファイルを userland パーティションに書き込む手順を説明します。

手順12.2 SDカード上のイメージファイルを書き込む

  1. SDカードを/mnt/ディレクトリにリードオンリーでマウントします。

    [armadillo ~]# mount -o ro /dev/mmcblk0p1 /mnt
    kjournald starting.  Commit interval 5 seconds
    EXT3-fs (mmcblk0p1): using internal journal
    EXT3-fs (mmcblk0p1): mounted filesystem with ordered data mode
    [armadillo ~]# ls /mnt
    romfs-aiotg-std-[version].img.gz
  2. SDカード上のイメージファイルのパス(/mnt/romfs-aiotg-std-[version].img.gz)を指定して netflashコマンドを実行します。

    [armadillo ~]# netflash -b -k -n -u -s -r /dev/flash/userland /mnt/romfs-aiotg-std-[version].img.gz
    ................................................................................
    ................................................................................
    (省略)
    ..........................................................
    netflash: got "/mnt/romfs-aiotg-std-[version].img.gz", length=14176995
    netflash: programming FLASH device /dev/flash/userland
    ...............................................................................
    
  3. Armadilloのプロンプトが表示されるとフラッシュメモリの書き換えは完了です。次回起動時から書き換えたユーザーランドイメージで起動します。

    [armadillo ~]# 
  4. SDカードをアンマウントします。

    [armadillo ~]# umount /mnt

12.3. ダウンローダーを使用してフラッシュメモリを書き換える

Linuxを起動できない場合やブートローダーを更新する場合は、ダウンローダー(hermit)を使用してフラッシュメモリを書き換える必要があります。hermitはATDEに標準でインストールされています。

hermitはArmadilloのブートローダーと協調動作を行いフラッシュメモリを書き換えることができます。hermitとブートローダー間の通信には、シリアル[19]が使用されます。

hermitのヘルプは次の通りです。

[ATDE ~]# hermit
Usage: hermit [options] command [command options]
Available commands: download, erase, help, go, map, terminal, upload, md5sum
Armadillo-J command: firmupdate
Multiple commands may be given.
General options (defaults) [environment]:
	-e, --ethernet
	-i, --input-file <path>
	--netif <ifname> (eth0) [HERMIT_NETIF]
	--memory-map <path>
	--port <dev> (/dev/ttyS0) [HERMIT_PORT]
	-o, --output-file <path>
	--remote-mac <MAC address>
	-v, --verbose
	-V, --version
Download/Erase options:
	-a, --address <addr>
	-b, --baudrate <baudrate>
	--force-locked
	-r, --region <region name>
Memory map options:
	--anonymous-regions
Md5sum  options:
	-a, --address <addr>
	-r, --region <region name>
	-s, --size <size>

図12.2 hermitコマンドのヘルプ


ここでは、bootloaderパーティションを書き換える手順について説明します。

手順12.3 ダウンローダーを使用して書き換える

  1. ブートローダーが保守モードで起動するように設定します。設定方法については、「ブートローダー起動モード」を参照してください。

  2. Armadilloが保守モードで起動したことを確認するために、ATDEでminicomを起動しておきます。デバイスファイル名(/dev/ttyUSB0)は、ご使用の環境により ttyUSB1やttyS0、ttyS1 などになる場合があります。Armadilloに接続されているシリアルポートのデバイスファイルを指定してください。

    [ATDE ~]$ LANG=C minicom --noinit --wrap --device /dev/ttyUSB0
  3. Armadilloに電源を投入します。ブートローダーが保守モードで起動すると、次のように保守モードのプロンプトが表示されます。

    hermit> 
  4. minicomを終了させシリアルポート(/dev/ttyUSB0)を開放します。

  5. bootloaderパーティションと書き込むイメージファイル(loader-armadillo-iotg-std-[version].bin)を指定してhermitコマンドを実行します。bootloaderパーティションを更新する場合は、必ず"--force-locked"オプションを指定する必要があります。

    [ATDE ~]$ hermit download --input-file loader-armadillo-iotg-std-[version].bin --region bootloader --force-locked --port /dev/ttyUSB0
    serial: completed 0x0000a92c (43308) bytes.
    [注記]

    書き込みが制限されているパーティションを書き換える場合、"--force-locked"オプションを指定する必要があります。

  6. ATDEのプロンプトが表示されるとフラッシュメモリの書き換えは完了です。次回起動時から書き換えたブートローダーイメージで起動します。

    [ATDE ~]$ 

12.4. TFTPを使用してフラッシュメモリを書き換える

Hermit-At ブートローダーの tftpdl 機能を使用することで、Linuxが動いていない時でもフラッシュメモリを書き換えることができます。

tftpdl 機能は、所属するネットワークにある TFTP サーバーが公開しているファイルをダウンロードして、自分自身のフラッシュメモリを書き換えることができる機能です。

[ティップ]

ATDE5では、標準で TFTP サーバー (atftpd) が動作しています。/var/lib/tftpboot/ ディレクトリにファイルを置くことで、TFTP によるアクセスが可能になります。

tftpdl 機能を使用するには、USB シリアル変換アダプタのスライドスイッチを設定し、保守モードで起動してください。

作業用 PC のシリアル通信ソフトウェアを使用して、コマンドを入力します。図12.3「tftpdl コマンド例」は、Armadillo の IP アドレスを 192.0.2.10 に設定し、IP アドレスが 192.0.2.1 の TFTP サーバー上にある、romfs.img.gz を userland パーティションにを書き込む例です。

hermit> tftpdl 192.0.2.10 192.0.2.1 --blksize=1024 --userland=romfs.img.gz

図12.3 tftpdl コマンド例


書き込み対象となるパーティションを指定するオプションと、パーティションの対応を次に示します。

表12.4 パーティションとオプションの対応

パーティションオプション
bootloader--bootloader
kernel--kernel
userland--userland
config--config

[ティップ]

tftpdlは、TFTPプロトコルを使用してTFTPサーバーからイメージファイルをダウンロードします。デフォルトのデータブロックサイズが512Byteであるため、イメージファイルの最大サイズがブロック番号の桁溢れが発生しない33554431Byte(32MByte - 1Byte)に制限されます。これよりもサイズの大きいイメージファイルをダウンロードする場合は、"--blksize"オプションを利用してデータブロックサイズを増やす必要があります。

"--blksize"オプションには、IPフラグメンテーションが起きないデータブロックサイズを指定する必要があります。

12.5. ブートローダーが起動しなくなった場合の復旧作業

フラッシュメモリのbootloaderパーティションを誤ったイメージファイルで書き換えたり、書き換え中にArmadilloの電源を切断してしまった場合、ブートローダーが起動しなくなる場合があります。フラッシュメモリのブートローダーが起動しなくなった場合は、プロセッサ(i.MX257)のUARTブート機能を利用して復旧する必要があります。

ブートローダーの復旧手順を次に示します。

手順12.4 ブートローダーの復旧

  1. USBシリアル変換アダプタのスライドスイッチを確認します。スライドスイッチが図4.8「スライドスイッチの設定」の 1 側に設定されている事を確認してください。

  2. Armadillo-IoTに電源を投入します。

  3. ATDEでshoehornコマンドを入力し、実行しないまま次の手順に進みます。デバイスファイル名(/dev/ttyUSB0)は、ご使用の環境により ttyUSB1ttyS0ttyS1 などになる場合があります。Armadillo-IoTに接続されているシリアルポートのデバイスファイルを指定してください。

    [ATDE ~]$ shoehorn --boot --target armadillo4x0 \
    --initrd /dev/null \
    --kernel /usr/lib/hermit-3/loader-armadillo-iotg-std-boot-[version].bin \
    --loader /usr/lib/shoehorn/shoehorn-armadillo4x0.bin --initfile \
    /usr/lib/shoehorn/shoehorn-armadillo4x0.init --postfile \
    /usr/lib/shoehorn/shoehorn-armadillo4x0.post --port /dev/ttyUSB0
  4. プロセッサ(i.MX257)をUARTブートモードに設定します。起動モード設定インターフェース(Armadillo-410:CON15)の1-2ピンをショートしてください。

    [ティップ]

    金属製の工具(M2のマイナスドライバー等)で 起動モード設定インターフェース(Armadillo-410:CON15) の 1-2ピン間をショートして、UARTブートモードに設定することも可能です。その際、周囲のコネクタ等に工具が接触しないようご注意ください。

  5. Enter キーを押下し、前の手順で入力したshoehornコマンドを実行してください。コマンドを実行すると、次のようなログが表示されます。

    /usr/lib/shoehorn/shoehorn-armadillo4x0.bin: 1300 bytes (2048 bytes buffer)
    /usr/lib/hermit-3.3/loader-armadillo-iotg-std-boot-[version].bin: 51456
    bytes (51456 bytes buffer)
    /dev/null: 0 bytes (0 bytes buffer)
    Waiting for target - press Wakeup now.
    [警告]

    shoehornコマンドの実行後、以下のメッセージが出力された場合は、本手順をやり直してください。

    Failed Target Synchronizing.(-179)
  6. リセットスイッチ(SW4)を押下します。リセットスイッチを離した後、起動モード設定インターフェース(Armadillo-410:CON15)の1-2ピンをオープンします。

    Initializing target...
    Writing SRAM loader...
    Pinging loader
    Initialising hardware:
    - flushing cache/TLB
    - Switching to 115200 baud
    - Get board IDs
    - Initializing for Mobile-DDR
    Pinging loader
    Detecting DRAM
    - 16 bits wide
    - start: 0x80000000 size: 0x08000000 last: 0x87ffffff
    Total DRAM: 131072kB
    Loading /usr/lib/hermit-3/loader-armadillo-iotg-std-boot-[version].bin:
    - start: 0x80800000 size: 0x0000c900 last: 0x8080c8ff
    initrd_start is c0400000
    Moving initrd_start to c0400000
    Loading /dev/null:
    - start: 0xc0400000 size: 0x00000000
    Writing parameter area
    - nr_pages (all banks): 4096
    - rootdev: (RAMDISK_MAJOR, 0)
    - pages_in_bank[0]: 2048
    - pages_in_bank[1]: 2048
    - initrd_start: 0xc0400000
    - initrd_size: 0x0
    - ramdisk_size: 0x0
    - start: 0x80020000 size: 0x00000900 last: 0x800208ff
    Pinging loader
    Starting kernel at 0x80800000
    [ATDE ~]$ 
  7. shoehornコマンドが成功すると、Armadillo-IoTのRAM上でHermit-Atブートローダーが動作している状態になります。Armadillo-IoTの電源を切断せずに、hermitコマンドでフラッシュメモリのbootloaderパーティションにブートローダーイメージを書き込みます。

    [ATDE ~]$ hermit erase --region bootloader download --input-file loader-armadillo-iotg-std-[version].bin --region bootloader --force-locked --port /dev/ttyUSB0
    serial: completed 0x0000a92c (43308) bytes.
  8. ATDEのプロンプトが表示されるとフラッシュメモリの書き換えは完了です。次回起動時から書き換えたブートローダーイメージで起動します。

    [ATDE ~]$ 


[19] 通信速度(ボーレート)は、115200bpsです