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

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

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

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

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

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

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

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

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

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


フラッシュメモリを書き換えるためには、Linuxまたはブートローダーが起動している必要があります。フラッシュメモリに書き込まれているブートローダーが起動しない状態になってしまった場合は、15章SDブートの活用を参照してSDカードからソフトウェアを起動させてください。

[ティップ]

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

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

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

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

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

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

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

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

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

bootloader

あり

loader-armadillo840-nor-[version].bin

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

config

なし

なし

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

license

あり

なし

有償ミドルウェアなどのライセンスファイルを配置するパーティションです。

firmware

あり

squashfs-a840-firmware-[version].img

有償ミドルウェアなどのファームウェアを配置するパーティションです。

kernel

なし

linux-a840-[version].bin.gz

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

userland

なし

romfs-a840-[version].img.gz

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


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

Linuxが動いている場合、パーティションの書き込み制限をコマンドで外すことが可能です。Sysfsの MTDクラスディレクトリ以下にある"ro"というファイルに0を書き込むことで制限を外すことが可能です。逆に1を書き込めば、パーティションへの書き込みを制限する事が可能です。

MTDクラスディレクトリとパーティションの対応については、表12.3「パーティションとMTDクラスディレクトリの対応」を参照してください。

表12.3 パーティションとMTDクラスディレクトリの対応

パーティションMTDクラスディレクトリ

bootloader

/sys/class/mtd/mtd0

config

/sys/class/mtd/mtd1

license

/sys/class/mtd/mtd2

firmware

/sys/class/mtd/mtd3

kernel

/sys/class/mtd/mtd4

userland

/sys/class/mtd/mtd5


以降の説明では、任意のパーティションを示すMTDクラスディレクトリを"/sys/class/mtd/[MTD]"のように表記します。

書き込み制限を外すには、roファイルに0を書き込みます。

[armadillo ~]# echo 0 > /sys/class/mtd/[MTD]/ro

図12.1 書き込み制限を外す


書き込みを制限するには、roファイルに1を書き込みます。

[armadillo ~]# echo 1 > /sys/class/mtd/[MTD]/ro

図12.2 書き込みを制限する


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.3 netflashコマンドのヘルプ


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

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

パーティションデバイスファイル
bootloader[a]/dev/flash/bootloader
config/dev/flash/config
license[a]/dev/flash/license
firmware[a]/dev/flash/firmware
kernel/dev/flash/kernel
userland/dev/flash/userland

[a] 書き込みが制限されています。詳細については、「フラッシュメモリのパーティションについて」を参照してください。


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

    [armadillo ~]# netflash -b -k -n -u -s -r /dev/flash/kernel http://192.168.10.1/linux-a840-[version].bin.gz
    ................................................................................
    ................................................................................
    (省略)
    ......................................
    netflash: got "http://192.168.10.1/linux-a840-[version].bin.gz", length=2564696
    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-a840-[version].img.gz
  2. SDカード上のイメージファイルのパス(/mnt/romfs-a840-[version].img.gz)を指定して netflashコマンドを実行します。

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

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

    [armadillo ~]# umount /mnt

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

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

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

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.4 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-armadillo840-nor-v3.2.0.bin)を指定してhermitコマンドを実行します。bootloaderパーティションを更新する場合は、必ず"--force-locked"オプションを指定する必要があります。

    [ATDE ~]$ hermit download --input-file loader-armadillo840-nor-v3.2.0.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 機能を使用するには、ターゲットとなる Armadillo のジャンパを設定し、保守モードで起動してください。

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

hermit> tftpdl 192.168.10.10 192.168.10.1 --blksize=1024 --userland=romfs.img.gz

図12.5 tftpdl コマンド例


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

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

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

[ティップ]

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

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

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

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

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

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

  1. SDブートを行うためのブートディスクを作成します。ブートディスクの作成方法については15章SDブートの活用を参照してください。

  2. Armadilloにブートディスクを接続し、ブートローダーがSDカードから起動し、且つ保守モードとなるように設定します。Armadillo-840のJP1およびJP2をショートに設定してください。

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

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

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

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

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

    [ATDE ~]$ 


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