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

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

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

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

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

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

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

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


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

[ティップ]

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

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

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

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

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

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

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

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

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

bootloader

あり

loader-armadillo810-nor-[version].bin

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

config

なし

なし

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

license

あり

なし

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

firmware

あり

squashfs-a810-firmware-[version].img

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

kernel

なし

linux-a810-[version].bin.gz

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

userland

なし

romfs-a810-[version].img.gz

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


[注記]

Linux v3.4-at3から、書き込みの制限を外す仕組みを導入しています。また、これに合わせ、hermit-at v3.2.2およびLinux v3.4-at3から、デフォルト状態で、"license"と"firmware"の両パーティションへの書き込みを制限することにしました。

[ティップ]

licenseパーティションにはボードごとに固有なイメージが出荷時に書き込まれています。本パーティションを書き換えてライセンスファイルが消えてしまった場合、AVコーデックミドルウェアを使用できなくなります。特別な理由がない限り、licenseパーティションは書き換えないでください。万一、ライセンスファイルが消えてしまった場合、弊社営業部へご相談ください。

[ティップ]

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

ダウンローダーでは、書き込みが制限されているパーティションを"ロック(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によるファイルのダウンロードをサポートしています。

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

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

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

    [ATDE ~]$ ls
    linux-a810-v1.00.bin.gz
    [ATDE ~]$ cp linux-a810-v1.00.bin.gz /var/www/
  2. Webサーバー上のイメージファイルのURL(http://atde5.local/linux-a810-v1.00.bin.gz)を指定して netflashコマンドを実行します。

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

    [armadillo ~]# netflash -b -k -n -u -s -r /dev/flash/userland /mnt/romfs-a810-v1.00.img.gz
    ................................................................................
    ................................................................................
    (省略)
    ..........................................................
    netflash: got "/mnt/romfs-a810-v1.00.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とブートローダー間の通信には、シリアル[22]が使用されます。

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を起動しておきます。

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

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

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

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

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

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

    [ATDE ~]$ 

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

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

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

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

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

  2. Armadilloにブートディスクを接続し、ブートローダーがSDカードから起動し、且つ保守モードとなるように設定します。拡張ボード01 (Aコネクタ用)のJP1およびJP3をショートに設定してください。

  3. Armadilloが保守モードで起動したことを確認するために、ATDEでminicomを起動しておきます。

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

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

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

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

    [ATDE ~]$ 


[21] イーサネットガジェットの詳細については、「イーサネットガジェット」を参照してください。

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