連載
» 2008年09月29日 00時00分 公開

山あり谷あり、非力なマイコンでuClinuxを動かすべし−ザ・組み込み−ソフトウェアのハードウェア化(3)(3/4 ページ)

[鳥海佳孝 設計アナリスト,@IT MONOist]

RedBootの動作確認

 ホストPCとAKI−H8/3069Fが、USB−シリアル変換ケーブルを介して、シリアル接続しているかどうかを確かめます。

 さらに、ネットワークケーブル(クロス)でホストPCとターゲットボードとを接続しておきます。そして、図2のように通常モードでAKI−H8/3069Fを起動します。リスト2のように表示されたら、RedBootは正常に動作しています。


+**Warning** FLASH configuration checksum error or invalid key
Use 'fconfig -i' to [re]initialize database
DP83902A - eeprom ESA: 00:02:cb:01:86:c2 ←AKI−H8/3069FのMACアドレス
... waiting for BOOTP information
Ethernet eth0: MAC address 00:02:cb:01:86:c2
Can't get BOOTP info for device!
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot> 
リスト2 RedBootが正常に動作している様子

uClinuxカーネルをロードする

 次に、uClinuxのカーネルをロードできるようにします。カーネルをロードするためには、ホストPCからAKI−H8/3069F上にカーネルを引っ張ってこなければなりません。一体どうしたらよいのでしょうか?

tftpの準備

 ホストPCからAKI−H8/3069F上にカーネルを引っ張ってくるために、今回は認証を行わないで済む「tftp」を使用します(セキュリティ的に問題はありますが)。しかし、ここでもまた問題が出てきます。先ほどと同様、Vine Linux 4.2のデフォルト状態では「tftp」が入っていません(一難去ってまた一難とはこのことですね……)。これもVine Linuxのサイトにありますので、以下の2つのファイル「tftp-0.42-3vl1.i386.rpm」と「tftp-server-0.42-3vl1.i386.rpm」をダウンロードしてください。

 まず、「rpm」コマンドでクライアント用tftp(tftp-0.42-3vl1.i386.rpm)をインストールします。

# rpm -ivh tftp-0.42-3vl1.i386.rpm
準備中...                   ############################
############### [100%]
   1:tftp                   ############################
############### [100%] 

 続いて、サーバ用tftp(tftp-server-0.42-3vl1.i386.rpm)をインストールします。

# rpm -ivh tftp-server-0.42-3vl1.i386.rpm
エラー: 依存性の欠如:
        inetd は tftp-server-0.42-3vl1.i386 に必要とされています 

 はい、またエラーですね〜。ここまでくるとちょっとくらいのエラーでは驚かなくなっているのではないでしょうか? エラーメッセージを確認してみると、どうも「inetd」が必要なようです。しかし、これもまたVine Linux 4.2のディストリビューションではデフォルトでインストールされていません(うぅ、確かに/etc/inetd.confのファイルがない……)。というわけで、これもVine Linuxのサイトから「inetd-0.17-0vl4.i386.rpm」をダウンロードします。

 ダウンロードしたら、以下のコマンドでinetd(inetd-0.17-0vl4.i386.rpm)とサーバ用tftp(tftp-server-0.42-3vl1.i386.rpm)をインストールします。

# rpm -ivh inetd-0.17-0vl4.i386.rpm
準備中...                   #############################
############## [100%]
   1:inetd                  #############################
############## [100%]  
# rpm -ivh tftp-server-0.42-3vl1.i386.rpm
準備中...                   #############################
############## [100%]
   1:tftp-server            #############################
############## [100%] 

 インストールが完了すると「/etc/inetd.conf」が作成されますので、このファイルの中にある「tftp」の記述部分のコメントを外します。

#tftp   dgram   udp     wait    root    /usr/sbin/tcpd  in.tftpd 
tftp   dgram   udp     wait    root    /usr/sbin/tcpd  in.tftpd 

 ファイルを上書き保存したら、以下のコマンドでinetdを起動します。

# /etc/init.d/inet start 

 これで「tftp」がうまく動作するはずです。それを確かめるためには、まずホストPCのネットワークのIPアドレスがきちんと割り当てられていなければなりませんので、それを設定します。今回は図1で示したとおり、ホストPCとターゲットボードは「1対1」で接続しますので、図3を参考にスタティックなアドレス(192.168.0.1)をホストPCに割り当ててください(皆さんのネットワーク環境に合わせて、スタティックかDHCPによる取得などを設定してください)。

ホストPCのネットワークの設定 図3 ホストPCのネットワークの設定

 それでは念のため、以下のコマンドで確認しておきましょう。

# ifconfig -a
eth0      リンク方法:イーサネット  ハードウェアアドレス 00:1E:33:15:A0:5E
          inetアドレス:192.168.0.1 ブロードキャスト:192.168.0.255  マスク:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RXパケット:0 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)
          割り込み:5 ベースアドレス:0xcd00 

 上記のように「inetアドレス:192.168.0.1」が見つかればOKです。それから今回は図1のようにホストPCとターゲットボードを1対1で接続しますので、図4のようにファイアウォールの設定を「無効」にしておきます(さまざまなネットワーク接続でもうまくいくようにするための処置です)。

ファイアウォールの設定 図4 ファイアウォールの設定

 ここで、「tftp」のローカルな実験を行ってみましょう。一般的に「tftp」のプロトコルを用いてファイルを送信するには、「/tftpboot」のディレクトリを作成し、そこに転送したいファイルを置いて転送します。

 それでは以下のコマンドを実行してください。

# cd
# mkdir /tftpboot
# chmod 777 /tftpboot
# echo "The Embedded" > /tftpboot/test.txt 

 これでテスト用のファイル(The Embeddedと書かれたtest.txt)を「/tftpboot」の下に置くことができました。次に、「/tmp」に移動してファイルがきちんと転送されるかどうかを確かめます。

# cd /tmp
# tftp 192.168.0.1
tftp> get test.txt
Error code 2: Only absolute filenames allowed
tftp> quit
# ls -l test.txt
-rw-r--r-- 1 root root 0  9月13日 00:29 test.txt 

 いかがですか? 「/tmp」の下にファイル(test.txt)が作成されており、成功したように思えますが、サイズをよく見ると「0」になっていますね(つまり、うまく転送できていない模様です……)。表示されたエラーメッセージを見てみると「Only absolute filenames allowed」となっているので、今回持ってきたtftp-serverの設定では、転送するファイルを“フルパスで指定する必要がある”ようです。試しに、上記の「get」コマンド部分をフルパスに変更してみると、

# tftp 192.168.0.1
tftp> get /tftpboot/test.txt
tftp> quit
# ls -l test.txt
-rw-r--r-- 1 root root 13  9月13日 00:31 test.txt
# diff /tftpboot/test.txt test.txt 

「/tftpboot」以下に作成した「test.txt」というファイルがtftpを通じて、「/tmp」の下に運ばれていることが分かります。もし、ここでうまくいかない場合は、「/etc/inetd.conf」の設定や「tftp」を起動したときに実行する「get」コマンドでのファイル指定を再度確認してみてください。

 これでようやく「tftp」サーバの準備ができました。

ターゲットボードにもIPアドレスを割り当てる

 次に、H8マイコンにもIPアドレスを割り当てる必要があります。どのように割り当てたらよいのでしょうか?

 今回、H8マイコンのフラッシュROMに書き込んだRedBootは、デフォルトでDHCPサーバを見にいく、つまりDHCPのクライアント機能が実行できるように設定されています。ということは、ホストPCをDHCPサーバにしないといけないということです。

 ホストPCをDHCPサーバにするのが面倒な人は、RedBootの「fconfig -i」でスタティックなIPアドレスを直接割り当ててください。IPアドレスを割り当てたら念のためAKI−H8/3069Fの電源を入れ直すか、リセットボタンを押してRedBootを再起動します。

+**Warning** FLASH configuration checksum error or invalid key
Use 'fconfig -i' to [re]initialize database
DP83902A - eeprom ESA: 00:02:cb:01:86:c2 ←AKI−H8/3069FのMACアドレス
... waiting for BOOTP information
Ethernet eth0: MAC address 00:02:cb:01:86:c2
Can't get BOOTP info for device!
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot> 

 RedBootが起動したら、シリアル通信ソフトのシェル上から以下のコマンドを実行します。

RedBoot> fconfig -i
Initialize non-volatile configuration - continue (y/n)? y
Run script at boot: false
Use BOOTP for network configuration: true
Default server IP address: 192.168.0.1 ←tftpサーバのアドレスを入力
GDB connection port: 9000
Force console for special debug messages: false
linux boot command:
Network debug at boot time: false
Default network device: dp83902a_eth0
Update RedBoot non-volatile configuration - continue (y/n)? y
... Erase from 0x00070000-0x00080000: .
... Program from 0x005e4000-0x005f4000 at 0x00070000: .
RedBoot> 

 上記のようにサーバとなるホストPCのIPアドレスを入力します。ホストPCをDHCPサーバにするのが面倒な方は、以下のRedBootの「fconfig -i」でスタティックなIPアドレスを直接割り当ててください。

Use BOOTP for network configuration: false 

 そして、以下を参考に必要事項を入力してください。

RedBoot> fconfig -i
Initialize non-volatile configuration - continue (y/n)? y
Run script at boot: false
Use BOOTP for network configuration: false
Gateway IP address: 192.168.0.1 ←適当なゲートウェイのアドレスを入力
Local IP address: 192.168.0.2 ←AKI−H8/3069FのIPアドレスを入力
Local IP address mask: 255.255.255.0 ←ネットマスクを入力
Default server IP address: 192.168.0.1 ←tftpサーバのアドレスを入力
GDB connection port: 9000
Force console for special debug messages: false
linux boot command:
Network debug at boot time: false
Default network device: dp83902a_eth0
Update RedBoot non-volatile configuration - continue (y/n)? y 

 次に、ホストPCをDHCPサーバに設定します。ここで「/etc/dhcpd.conf」というファイルにリスト3の内容を書き込みます。

ddns-update-style ad-hoc;
allow bootp;
subnet 192.168.0.0 netmask 255.255.255.0 {
        host AKI3069F.koudo.net {
                hardware Ethernet 00:02:cb:01:86:c2;
                fixed-address 192.168.0.2;
        }
}
リスト3 /etc/dhcpd.conf

 リスト3の「00:02:cb:01:86:c2」という記述が、AKI−H8/3069FのMACアドレスです。RedBoot起動時に出力されますので、その値を書き込んでください。ここまでの準備ができたところで、DHCPサーバのサービスを起動します。

# /etc/init.d/dhcpd start
dhcpdを起動中:                                             [  OK  ] 

 ここでもう一度AKI−H8/3069Fを再起動して、以下のようにIPアドレスが割り当てられていればDHCPサーバは正常に動作していることになります。

+DP83902A - eeprom ESA: 00:02:cb:01:86:c2
Ethernet eth0: MAC address 00:02:cb:01:86:c2
IP: 192.168.0.2/255.255.255.0, Gateway: 0.0.0.0 ←IPアドレスの割り当て
Default server: 192.168.0.1 ←tftpサーバのアドレス
RedBoot(tm) bootstrap and debug environment [ROM]
Non-certified release, version UNKNOWN - built 14:54:02, Dec 21 2006
Platform: Akizuki H8/3068 Network micom (H8/300H)
Copyright (C) 2000, 2001, 2002, 2003, 2004 Red Hat, Inc.
RAM: 0x00400000-0x005f4000, [0x00400000-0x005e1000] available
FLASH: 0x00000000 - 0x80000, 8 blocks of 0x00010000 bytes each.
RedBoot> 

 念のためホストPCから以下のコマンドで、ネットワーク接続を試してみましょう。

# ping 192.168.0.2
PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=14.9 ms
64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=2.84 ms
64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=4.22 ms
--- 192.168.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 2.842/7.345/14.970/5.421 ms 

 上記のように反応が返ってくればOKです。もしダメな場合には、クロスのネットワークケーブルの接続やDHCPの設定ファイルをもう一度見直す、あるいは「fconfig -i」で書き込んだサーバやAKI−H8/3069FのIPアドレスが正しいかどうかなどを確かめてください。

Copyright © ITmedia, Inc. All Rights Reserved.