特集 : 作ってみよう,MyガジェットPart1

対象製品: Armadillo-9
Part 2

(株)アットマークテクノ
森島史仁
MORISHIMA Fumito

この文書は技術評論社「Software Design」2005年12月号に掲載されたものです。

本章以降では,アットマークテクノ「Armadillo-9」を使って,実際に組み込みLinux 開発を行う手順を解説していきます.本章では,実際の組み込み開発に必要となる準備を行います.

はじめに

ここからは,実際に組み込み機器を使用してマイガジェットを作成しながら,開発のポイントについて解説していきます.

今回作成するのは,最近CDショップでよく目にするようになったCD試聴システムです.これを組み込み機器で自作してみます.

概要としては,CDのバーコードを読み取ってサーバにCDの情報を要求し,受信したジャケット画像の表示と,音楽再生を行うものです(図1,2).

図1 CD視聴システム全体構成

図2 CD視聴器の構成

2章で開発環境など,開発に必要な準備に関して説明した後,3章でディスプレイへの画像表示と入力イベントの処理部分を作成し,4章ではバーコードによるCDの選択と音楽のストリーミング再生部分を作成します.

そして5 章で,3 章と4 章で作成した機能を統合して,CD試聴システムを完成させます.

また各章で作成するソースコードおよびビルドしたイメージファイルは,すべてhttp://download.atmark-techno.com/misc/softwaredesign/からダウンロード可能です.

開発前の準備

この章では,今回利用する機器と,その開発環境などに関して説明します.

CD 試聴器の構成

機器の構成は表1のようにしました.これらの機器の制御用コンピュータとしてArmadillo-9を使用します.接続すると図3のようになります.

●表1 実現したい機能と使用する機器
機能使用機器インターフェース
CDのバーコード選択 バーコードリーダ シリアル(RS-232C)
音楽の再生 サウンドデバイス USB
ジャケット画像の表示 液晶ディスプレイ VGA
音楽プレイヤーの操作 タッチパネル USB
音データの取得 音楽配信サーバ LAN(Ethernet)

図3 機器の接続図

● Armadillo-9 について


制御用コンピュータとして使用するArmadillo-9は,ARM9 コアのCPU を搭載した,アットマークテクノ製の小型CPUボードです(写真1,2).

●写真1 Armadillo-9の基板本体

●写真2 ケースに入ったところ

USB,CompactFlash,ビデオ出力,IDE,Ethernet,シリアルといった多彩なインターフェースを備えるうえ,小型なのでガジェット作るのに適してます.標準OSとしてLinuxが動作し,GNU開発環境を利用できるので,組み込み向けとはいっても手軽に開発を始めることができます.

おもな仕様を表2に示します.

●表2 Armadillo-9の主な仕様
プロセッサ CirrusLogic EP9315
(ARM920Tコア)
CPUクロック 200MHz
バスクロック 100MHz
メモリ 64Mバイト(SDRAM)
8Mバイト(フラッシュROM)
Ethernet 10BASE-T/100BASE-TX
シリアルポート 2ポート(1ポートはコネクタ非実装)
GPIO 12ビット
コンパクトフラッシュ I/Oカード,メモリカード
ハードディスク 2mmピッチ44ピンIDE(ATA33)
USB 2.0ホスト(Aタイプ,フルスピード)
VGA出力 VGA(D-Sub15ピン,解像度1024×768)
拡張バス 16ビットPC/104バス
基板サイズ 90.2ミリ×95.9ミリ
電源 5V±5%
消費電力 2.0W(Typ.)

開発環境の構築

開発用PC の準備

開発用のPCとして,LinuxもしくはWindowsが動作するPCを準備します.シリアルポートが必要なので,シリアルポートを持たないPC の場合は,USB ⇔シリアル変換ケーブルなどを用意する必要があります.

まずArmadillo-9にログインしてみます.

(1)開発用PC とArmadillo-9 をシリアルクロスケーブルで接続

シリアルのクロスケーブルでArmadillo-9 のCOM1とPCのシリアルポートを接続します.Armadillo-9にケーブルを接続する際には変換コネクタ(Armadillo-9に付属)を使用します.

(2)開発用PC 上でコンソールソフトウェアを起動

Linuxならminicom(https://alioth.debian.org/projects/minicom/), WindowsならTeraterm Pro(http://hp.vector.co.jp/authors/VA002416/)などが有名なコンソールソフトです.ソフトウェアを起動し,シリアルの通信設定を表3のように設定します.

●表3 シリアル通信設定
項目設定値
ビットレート 115,200
データ長 8
ストップビット 1
パリティ なし
フロー制御 なし

(3)ログインの実行

Armadillo-9ジャンパ2をオープン(ジャンパが外れている状態)であることを確認し,電源を入れるとコンソール上にLinuxの起動ログが表示されます.ログインプロンプトが表示されたら,ユーザ名とパスワードを入力します.デフォルトのユーザ名とパスワードは表4のようになっています.

開発用のPCがWindowsの場合はcoLinuxなどのLinuxエミュレータを準備してください.

●表4 ユーザ設定
ユーザ名パスワード
root root
guest なし

クロス開発環境の構築

PCと比較して一般的にプロセッサ性能の低い組み込み用コンピュータでは,セルフコンパイル(実行環境上でのコンパイル)を行うとかなりの時間がかかり,あまり現実的ではありません.より開発効率を高めるため,通常はクロスコンパイルが利用されます.

Armadillo-9 で動作するプログラムの開発を,開発用PC で行えるようにするために,ARM 用のクロス開発環境を開発用PCにインストールします.開発用PCがWindows の場合は,coLinux(http://www.colinux.org/ )が利用できます.

ログインするとシェルが起動し,一般的なコマンドが使えます.以下に記載するURLから利用しているディストリビューションにあったディレクトリ(Debian ならdeb, Red Hat系ならrpm, その他はtgz)を選択して,表5のパッケージをすべてインストールします.

http://download.atmark-techno.com/armadillo-9/cross-dev/

また必要に応じて実行パスを設定してください.ちなみに,Armadillo-9ではコンパクトフラッシュなどの外部ストレージを使用し,gccをインストールすることでセルフコンパイルも可能ですが,コンパイルの速度を考えるとやはりクロスコンパイルが妥当です.

●表5 クロス開発用パッケージ一覧
パッケージ名バージョン説明
binutils-arm-linux 2.15-6 GNUバイナリユーティリティ
cpp-3.4-arm-linux 3.4.3-13 GNU Cプリプロセッサ
g++-3.4-arm-linux 3.4.3-13 GNU C++コンパイラ
gcc-3.4-arm-linux 3.4.3-13 GNU Cコンパイラ
libc6-arm-cross 2.3.2.ds1-22 GNU Cライブラリ(共有ライブラリとTimezoneデータ)
libc6-dev-arm-cross 2.3.2.ds1-22 GNU Cライブラリ(共有ライブラリとヘッダファイル)
libc6-pic-arm-cross 2.3.2.ds1-22 GNU Cライブラリ(PICアーカイブファイル)
libc6-prof-arm-cross 2.3.2.ds1-22 GNU C Library(プロファイルリングライブラリ)
libdb1-compat-arm-cross 2.1.3-7 Berkeley databaseランタイム
libgcc1-arm-cross 3.4.3-13 GCCサポートライブラリ
libstdc++6-0-arm-cross 3.4.3-13 GNU Standard C++ Libraly v3
libstdc++6-0-dbg-arm-cross 3.4.3-13 GNU Standard C++ Libraly v3(debugging files)
libstdc++6-0-dev-arm-cross 3.4.3-13 GNU Standard C++ Libraly v3(development files)
libstdc++6-0-pic-arm-cross 3.4.3-13 GNU Standard C++ Libraly v3(shared libraly subset kit)
linux-kernel-headers-arm-cross 2.5.999-test7-bk-17 Linuxカーネルヘッダ

Atmark Distの利用

Atmark Dist とは,uClinux-dist をベースにした,アットマークテクノの製品向け組み込みLinuxディストリビューションです.今回はAtmark Dist を利用して開発を進めていきます.

Atmark Distでビルドを行うと,Linuxカーネルのイメージバイナリとユーザランドのイメージバイナリが作成されます.これらのファイルをそれぞれArmadillo-9内蔵のフラッシュメモリに書き込むことで,システムの動作を更新できます.

ビルドするためには,binutils, GCC, makeなどといった通常の開発ツールの他にも,表6に記載されているパッケージが開発用PCにインストールされている必要がるので確認してください.表中のgenext2fsはCVS版ですが,http://download.atmark-techno.com/armadillo-9/tools からもダウンロードできます.

以降の章でサンプルプログラムを作成するために,一度実際にビルドを行う必要があります.ここでは,デフォルトの設定ままイメージファイルを作成してみます.

作業は必ず一般ユーザ権限で行います.特権ユーザ(root)で行うと,作業ミスで開発用PCの環境を壊す可能性があります.

●表6 Atmark Distのビルドに必要なパッケージ一覧
パッケージ名バージョン説明
genext2fs 1.3-7.1-cvs20050225 Ext2 filesystem generator for embedded systems
file 4.12-1以降 Determines file type using "magic" number
sed 4.1.2-8以降 The GNU sed stream editor
perl 5.8.4-8以降 Larry Wall's Practical Extraction and Report Language

(1)ソースコードの取得

http://download.atmark-techno.com/distから最新のAtmark Distのソースコードアーカイブを,http://download.atmark-techno.com/armadillo-9/sourceからカーネルソースコードをダウンロードします.今回しようしているのは,Atmark Dist-20051017.tar.gzとlinux-2.6.12.3-a9-1.tar.gzです.

(2)ソースアーカイブの展開

ダウンロードしたソースコードアーカイブを,任意のディレクトリに展開します.展開に500Mバイト,ビルド後には1Gバイト近くの容量が必要になるので,ハードドライブの空き容量には注意してください.

展開後,Atmark Distディレクトリにlinux-2.4.xという名前で,カーネルのディレクトリへシンボリックリンクを作成します(図4).

●図4 ソースアーカイブの展開

$ tar xvzf atmark-dist-YYYYMMDD.tar.gz
…
$ tar xvzf linux-2.4.31-foo.tar.gz
…
$ ls
atmark-dist
linux-2.4.31-foo
$ cd atmark-dist
$ ln -s ../linux-2.4.31-foo ./linux-2.4.x
$ ls -l linux-2.4.x
lrwxrwxrwx linux-2.4.x -> ../linux-2.4.31-foo

(3)設定

Armadillo-9 用にAtmark Dist をコンフィギュレーションします.atmark-distディレクトリでmake configコマンドを実行すると使用するボードのベンダ名を聞かれるので,「AtmarkTechno」と入力します(図5).

●図5 使用するボードのベンダ名を入力

$ make config
config/mkconfig > config.in
#
# No defaults found
#
*
* Vendor/Product Selection
*
*
* Select the Vendor you wish to target
*
Vendor (3com, ADI, Akizuki, Apple, Arcturus, Arnewsh, AtmarkTechno, Atmel, Avnet, Cirrus,
Cogent, Conexant, Cwlinux, CyberGuard, Cytek, Exys, Feith, Future, GDB, Hitachi, Imt, Insi
ght, Intel, KendinMicrel, LEOX, Mecel, Midas, Motorola, NEC, NetSilicon, Netburner, Ninten
do, OPENcores, Promise, SNEHA, SSV, SWARM, Samsung, SecureEdge, Signal, SnapGear, Soekris,
Sony, StrawberryLinux, TI, TeleIP, Triscend, Via, Weiss, Xilinx, senTec)
[SnapGear] (NEW) AtmarkTechno

次にボード名を聞かれるので「Armadillo-9」と入力します(図6).

●図6 ボード名の入力

*
* Select the Product you wish to target
*
AtmarkTechno Products (Armadillo-9, SUZAKU) [Armadillo-9] (NEW) Armadillo-9

次は,使用するCライブラリを指定します(図7).ここではNone を選択します.実際には開発用PCにインストールした,ARM用のライブラリが使用されます.

●図7 使用するC ライブラリの指定

*
* Kernel/Library/Defaults Selection
*
*
* Kernel is linux-2.4.x
*
Libc Version (None, glibc, uC-libc, uClibc) [uClibc] (NEW) None

次にデフォルトの設定にするかどうか質問されるのでYesを選択します(図8).

●図8 デフォルトの設定にするかどうか

Default all settings (lose changes) (CONFIG_DEFAULTS_OVERRIDE) [N/y/?] (NEW) y

最後の3つの質問はNoと答えます(図9).設定が終わるとプロンプトが表示されます.

●図9 残りの質問

Customize Kernel Settings (CONFIG_DEFAULTS_KERNEL) [N/y/?] n
Customize Vendor/User Settings (CONFIG_DEFAULTS_VENDOR) [N/y/?] n
Update Default Vendor Settings (CONFIG_DEFAULTS_VENDOR_UPDATE) [N/y/?] n

(4)ビルド

ビルドを実行します.ビルドの途中でいくつか質問されますが,すべて[Enter]を入力します.


$ make dep all

ビルドが終了すると,images ディレクトリにユーザランドイメージファイルとカーネルのイメージファイル,そしてそれぞれのzip圧縮ファイルが作成されます.


$ ls images
linux.bin
linux.bin.gz
romfs.img
romfs.img.gz

Atmark Dist の使い方に関する詳細は,http://download.atmark-techno.com/dist/atmark-dist_developers_guide_ja-1.0.2.pdfに記載されています.Atmark Distのメニュー構成については,3章のコラムをご覧ください.

フラッシュメモリに関して

ファイルシステム

組み込み向けのCPUボードでは,記憶装置としてハードディスクドライブを使用しないのが一般的です.代わりに使用される代表的なデバイスがフラッシュメモリです.最近では価格の低下に伴い,割とサイズの大きなフラッシュメモリを搭載できるようになりました.Armadillo-9には8Mバイトのフラッシュメモリが内蔵されています.

ハードディスクドライブを搭載しない組み込みシステムで用いられるおもなファイルシステムを表7に記載します.なお,今回使用するArmadillo-9では,Ext2 over RAM diskを使用しています.

●表7 組み込みLinux で利用されるおもなファイルシステム
名称 書き込み 揮発性 耐障害機能 圧縮 概要
JFFS2 可能 不揮発 あり 保存が可能なファイルシステム.最低5ブロックの領域を 必要とするため,小さいサイズのフラッシュメモリでは 利用が難しい
cramfs 不可能 読み出し専用のファイルシステム.シンプルな構成になっている
Ext2 over NFTL 可能 不揮発 なし なし DiskOnChipデバイス向けに利用される
Ext2 over RAM disk 可能 揮発 なし なし RAM上のファイルシステム.通常ROM上に圧縮したイメージを置き,起動時に RAM 上に伸長してマウントするので.RAMのサイズが大きく, ROMのサイズが小さい場合に有効

MTD

Linux にはMTD(Memory Technology Device)と呼ばれる,メモリデバイスを扱うためのドライバが用意されていて,NAND型のフラッシュメモリもサポートされています.メモリをパーティションに分割することができるので,パーティションごとに異なるディレクトリにマウントすることが可能です.Armadillo-9 でも,8M バイトのフラッシ ュROM を表8 のように分割して使用しています.

このうちkernelとuserlandは,linuxの起動前にbootloaderによってRAMへ展開/コピーされます.

●表8 フラッシュメモリのマップ
アドレス リージョン名 サイズ 説明
0x60000000 bootloader 64K バイト Hermit ブートローダ「loader-armadillo9. bin」のイメージ
0x6000ffff ~ 0x60010000 kernel 約1.44M バイト Linux カーネル「linux.bin.gz」のイメー ジ(非圧縮イメージ,gz 圧縮イメージに 対応)
0x6017ffff ~ 0x60180000 userland 約6.44M バイト ユーザランド「romfs.img.gz」のイメー ジ(非圧縮イメージ,gz 圧縮イメージに 対応)
0x607effff ~ 0x607f0000 config 64K バイト コンフィグ領域

フラッシュROMの書き換え方法

● 2 種類の書き換え方法

Armadillo-9 の内蔵フラッシュメモリの書き換え方法には,シリアル経由とネットワーク経由の2種類あります.

通信速度はネットワークのほうが高速です.Linuxのアプリケーションでネットワーク経由の書き換えができるので,通常はこちらが良いでしょう.ただし,間違ったイメージファイルなどを書き込んでLinuxがブートしなくなった場合,この方法は使用できません.この場合は,シリアル経由で書き込むしか方法を使用します.

● netflash とは

ここでは,netflashと呼ばれるネットワーク経由のファームウェアのアップデートツールを使って,フラッシュROM を書き換える方法を説明します.(もし,Linux がブートしないなど,netflash が使用できない状況に陥ってしまった場合は,Armadillo-9のマニュアルを参照して,シリアル経由で正常なイメージファイルに書き換えてください).

netflash では,HTTP,FTP などのプロトコルを使用してネットワーク上にあるファイルを取得し,内蔵のフラッシュROMを書き換えることができるのが特長です.組み込み機器においてソフトウェアに不具合が発見された場合,ファームウェアの書き換えが必要となるため,販売店やメーカに依頼する必要があって手間がかかります.ネットワークに接続可能なききであれば,netflashのようにネットワーク経由でファームウェアを更新できる機能を盛り込むべきでしょう.

フラッシュROMを書き換える

それでは実際に,先ほど作成したカーネルイメージファイルとユーザランドイメージファイルでフラッシュROMを書き換えてみます.

最初に,HTTP かFTP でアクセス可能なディレクトリに,images/linux-bin.gz,images/romfs.img.gzをコピーしてください.

(1)ネットワークに接続する

Armadillo-9にLANケーブルを接続し,LANにアクセス可能な状態にします.DHCP が利用できる環境ならとくに問題ないですが,利用できない場合は固定のIPアドレスを設定する必要があります.

(2)ログインしてnetflash を実行

シリアルコンソールからArmadillo-9にログインし,netflashコマンドを実行します.


# netflash -n -r /dev/flash/kernel http://internal-server/html/linux.bin.gz
# netflash -n -r /dev/flash/userland http://internal-server/html/romfs.img.gz

オプション-rはリージョン指定です.ここにデバイスファイル名を入力することで,フラッシュROM上の書き込むパーティションを指定できます.カーネルの場合は/dev/flash/kernel,ユーザーランドの場合は/dev/flash/userland と指定します.

Armadillo-9 をインターネットに接続できる環境にすれば,netflashを使って今回作成するプログラムのイメージファイルをダウンロードサイトから直接フラッシュROM に書き込むことも可能です.まず,動作を試してみたい人にはお勧めです.

次章では

次章では,いよいよ開発手順の解説を行います.次に紹介するのは,ディスプレイへの画像表示とタッチパネルからのイベント入力に関する部分の開発手順です.

Part 2

Creative Commons License
この作品は、クリエイティブ・コモンズ・ライセンスの下でライセンスされています。