山あり谷あり、非力なマイコンでuClinuxを動かすべし:−ザ・組み込み−ソフトウェアのハードウェア化(3)(3/4 ページ)
H8マイコンでLinuxを動かすことに挑戦。待ち受けるいくつもの試練を乗り越え、組み込みの“真の面白さ”を実感しよう!!
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」をダウンロードしてください。
- クライアント用tftp(→ダウンロードはこちら)
- サーバ用tftp(→ダウンロードはこちら)
まず、「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(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による取得などを設定してください)。
それでは念のため、以下のコマンドで確認しておきましょう。
# 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のようにファイアウォールの設定を「無効」にしておきます(さまざまなネットワーク接続でもうまくいくようにするための処置です)。
ここで、「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.