忍者ブログ

カウンター

プロモーション

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

AntinomyMy の実験室

   私のWEBアプリ実験室です!

ブログ内検索

楽天でお買い物

twitter

最新トラックバック

最新コメント

忍者アナライズ

ウェザーニュース

バーコード

本を買う

アクセス解析

Google+

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。


  • 2024/04/26 13:03

玄箱PRO(KUROBOX-PRO)のtftpboot による初期化

玄箱PRO の調べ物

前回の続き、にもなるのですが、
玄箱PRO の初期化をTFTPプロトコルの仕組みより行ってみました。
TFTPとは、ネットワーク上のブートイメージから起動するなどに用いられているプロトコルで、
ファイルのやり取りが出来ます。

(追伸になりますが、Debian もTFTPブートでインストールできます!詳しくは後のブログ
[玄箱PRO にDebian squeeze(6系)をtftpboot コマンドよりインストールしてみた。]をご覧下さい!)

玄箱PRO(KUROBOX-PRO)公式にはかなり難解にも思える玄箱PRO とPC の
NIC(ネットワークインターフェースカード)に対してのLAN ケーブルの1対1の直付けであったのを
改善して、ルーター環境で接続できる様にして行いました。

今回はその経緯を書き記します。

まず、玄箱PRO 公式にある、マニュアル通りにしようと思うと、実は玄箱PRO とTFTPサーバーを、
交互に手動操作しなければいけないという落とし穴があり、とてもやりにくかったので説明を残します。

その落とし穴は、玄箱PRO は電源がON にならないと、相手側のNIC が能動状態にならず、
NICが能動状態でない場合はFTPサーバーのソフト側で、どのネットワークを選ぶかの選択ができないのです。

つまり、TFTPのサーバは、ネットワークが無いと、サーバーとしての設定が有効にならず、
動かすことが出来ないのです。
失敗を繰り返したり、玄箱PRO のTFTPクライアント が有効になった時に、
PC側のTFTPサーバーが動いていない状況などを繰り貸していると、とても作業効率が落ち、
面倒であり、何度も繰り返していると何をしているか分かりにくくなり時間の無駄使いです。

少なくともLAN接続に対して、スイッチングハブや、ハブがあればいいのですが、
それが無い人は、大体はルーターは持っていると思うので、ルーターが仲介すれば、
TFTPサーバーを能動状態に常にさせておくことが可能に成ります。

ハブやスイッチングハブ、ルーターがある環境としての、
必要な設定や準備などをまとめておきます。

1.TFTPサーバーソフトの準備
必要なソフトウェアは、私の場合は、Windows 環境が主体であった為、
Windows 上で動くTFTPサーバーソフト、Tftpd32 もしくは、Poor TFTP Server for WIN32
を用いました、どちらでも動きました。

今回はTFTPサーバー としてしか用いませんが、Tftpd32 の方がとても高機能です。
単純にすぐ使いたいのならばPoor TFTP Server for WIN32 を使えば良いです、
私はなんとなく前者のTftpd32方が好きなので用いています、アクセスの制限方法なども
選べます。

そして、玄箱PRO 公式の玄人志向から、
【ファームウェア(NAND型フラッシュメモリ)初期化方法F/W1.02】
ファームウェア書き換えキットと手順のダウンロード(ZIPファイル:20.2MB)
をダウンロードして、中から、initrd.buffalo と、uImage.buffalo を取り出し、
それを上記のTftpd32 か、Poor TFTP Server for WIN32 で設定した
公開するファイルを置くフォルダに入れて下さい。

2.IPアドレスの設定
まずネットワーク上でTFTPサーバー が動くPC と、玄箱PRO が同一のネットワーク上で、
お互いが見える状態でなければいけません。

つまり、例えば、192.○○○.△△△.0 /24 のネットワークなら、
例えば、同じ192.○○○.△△△.1 と192.○○○.△△△.2 は、通信できますが、
192.○○○.△△△.1 と192.○○○.■■■.2 はアドレスが違うので情報が届きません、
当たり前の事ですが、同一のネットワークにします。

次に、私の場合は、ルーター の固定DHCP の機能を用いて、
玄箱PRO の持つMACアドレス を判断し、常に固定された1つのIP を取得するように、
ルーターでも設定されているので、特に玄箱PRO と、PCのIP設定で、
固定化してDHCP を使う必要は特にありませんが、
しかし、どちらにしても、玄箱PRO がTFTPクライアント として機能するときに、
相手のTFTPサーバー を指定しなければいけないので、
もし、PCのIPが変わってしまうと思う人は、PCのIPを一時的にでも固定のものを
指定して設定しておいて下さい。

WindowsPC の方はネットワーク接続の指定した接続のプロパティから、インターネットプロトコル(TCP/IP)を
固定的に指定しておいて下さい、これは知っている物として特に詳しく書きません。

勿論、玄箱PRO 側の設定も、固定的に設定しておく必要があります。
玄箱は、ブート時、カウントダウンの2度目でエンターキーなどを押して、止め、
以下を自分の環境に合わせて入力します、これを設定の参考にして下さい。

まず、これはU-BOOT 時の環境設定コマンド、setenv によって設定を変える例です。
U-BOOT のコマンドは慣れないと、とても分かりにくいです、しかも資料は
英語であったり、そしてそして、メーカーによってコマンドの量も、そして独自の実行ファイルも
作れる様なので、本当に慣れないとややこしいです。

コマンドの詳細については、前回のブログから、コマンドなどが載っている資料のPDF などを探って下さい。

今回、IP について固定しているのは、
TFTPクライアント側、つまり自身である玄箱PROがsetenv ipaddr 192.168.■.△で、
TFTPサーバー側、つまりPC がsetenv serverip 192.168.■.☆のアドレス設定です。
この2行がIPアドレスを固定する為に実行しているコマンドです。
他のコマンド、例えばsetenv loads_echo 0 などもNIC を指定しているので必要です、
しかし、デフォルトで記述されていると思います、一応ですが書いてあります、参考にして下さい。

緑のsetenv 00:16:01:xx:xx:xxの部分は、自分のMACアドレスを指定します、
ネットワーク上で使う場合はここに記述する様です、私の場合はルーターの固定DHCPで使うので
記述しています、ルーターで固定しても、U-BOOTのsetenv コマンドで指定しても、
私の環境では同一のIPアドレスを玄箱PRO に割り振れるので、このままMAC アドレスを
入れたままにしていますが、必要ない場合にはカットして下さい。

setenv loads_echo 0
setenv ipaddr 192.168.■.△
setenv serverip 192.168.■.☆

setenv rootpath /nfs/arm
setenv stdin serial
setenv stdout serial
setenv stderr serial
setenv cpuName 926
setenv CASset min
setenv enaMonExt no
setenv enaFlashBuf yes
setenv enaCpuStream no
setenv MALLOC_len 4
setenv ethprime egiga0
setenv bootargs_end :::DB88FXX81:eth0:none
setenv buffalo_ver BOOTVER=1.091
setenv build_time 18:10:02
setenv initrd initrd.buffalo
setenv kernel uImage.buffalo
setenv bootargs_base console=ttyS0,115200
setenv bootargs_root root=/dev/mtdblock2 rw panic=5
setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver)
setenv nand_uImage_offset 20000
setenv default_kernel_addr 0x00100000
setenv default_initrd_addr 0x02000000
setenv bootcmd 'nboot $(default_kernel_addr) 0 $(nand_uImage_offset) ;setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver); bootm $(default_kernel_addr)'

setenv nand_boot yes
setenv bootdelay 3
setenv disaMvPnp no
setenv overEthAddr no
setenv usb0Mode host
setenv usb1Mode host
setenv ethact egiga0
setenv tftp_load_kernel tftp $(default_kernel_addr) $(kernel)
setenv tftp_load_initrd tftp $(default_initrd_addr) $(initrd)
setenv set_boot_args setenv bootargs $(bootargs_base) $(bootargs_root) initrd=0x02000040,20M $(buffalo_ver)
setenv def_tftp '$(tftp_load_kernel); $(tftp_load_initrd); $(set_boot_args); bootm $(default_kernel_addr) $(default_initrd_addr)'

setenv 00:16:01:xx:xx:xx
saveenv

実はU-BOOT のコマンドによって、指定された環境変数を用いてコマンドを実行するという設計を
している様なのですが、どうも私の玄箱PRO では動かないです。

ネットを調べていると、ハードウェアが壊れているのではないか?という説がある様です。

しかし、TFTPブートの初期設定が、どの環境変数を使っているかの本当の所が分からないので、
手動でtftpboot コマンドを使って起動する事にします。

また、TFTPブートは、U-BOOT 起動時のはじめのカウントダウンの時に、エンターキーなどを押すと、
ビープ音とエラーの赤いLED 点滅と共に起動する起動方法です、ビープ音は玄箱PRO の電源ボタンを、
短く1度押すだけで消えます、しかし今回は使わない(私の場合はどうも動かなかった)ので、
2度目のカウントダウンからU-BOOT の起動をかけて、そこから手動で起動します。

さて、手動ということですが、普通に引数無しでfttpクライアントであるコマンド、tftpboot コマンドを
使いたいのですが、引数無しだとやはり、1度目のブートの様に、何らかの理由で正常に環境変数を拾って
実行してくれないので、完全に引数も手動で行って実行します。

IPアドレスの解決だけはしっかり終わらせて確認しておいて下さい。

3.TFTPでのイメージ取得と実行
では、実際にPC側でTFTPサーバーを起動した後に、玄箱PRO の2度目のカウントダウンより、
tftpboot コマンドを打ち込み、イメージを読み込みます。

実は、玄箱PRO 標準で入力されている環境変数をprintenv で確認すると、
setenv def_tftp '$(tftp_load_kernel); $(tftp_load_initrd); $(set_boot_args); bootm $(default_kernel_addr) $(default_initrd_addr)'
などの様に、太線と分かりやすく記述しましたが、これには訳があります。

これらは、例えばコマンドを実行するときに、環境変数から環境変数を参照する様な書き方がされています。

分かりにくいので例えば、
setenv tftp_load_kernel tftp $(default_kernel_addr) $(kernel)
は、
環境変数の中に、default_kernel_addrと、kernelという環境変数を指定しています。

これは実際の値を見てみると、
default_kernel_addr は0x00100000
kernel はuImage.buffalo
になります。

つまり、
setenv tftp_load_kernel tftp $(default_kernel_addr) $(kernel) は
setenv tftp_load_kernel tftp 0x00100000 uImage.buffalo で、
tftp_load_kernel に、tftp 0x00100000 uImage.buffalo を実行時に与えていることになります。

そうやって見ていくと、
setenv def_tftp '$(tftp_load_kernel); $(tftp_load_initrd); $(set_boot_args); bootm $(default_kernel_addr) $(default_initrd_addr)' は
少し長いので改行やスペースを入れますが
setenv
     tftp $(default_kernel_addr) $(kernel);
     
tftp $(default_initrd_addr) $(initrd);
     
setenv bootargs $(bootargs_base) $(bootargs_root) initrd=0x02000040,20M $(buffalo_ver);
     
bootm 0x00100000 0x02000000;
となり、これらをもう少し、実行時に必要に置き換えられる環境変数のみ完全に置き換えてみると、
setenv
     tftpboot 0x00100000 uImage.buffalo;

     tftpboot 0x02000000 initrd.buffalo;
     setenv bootargs $(bootargs_base) $(bootargs_root) initrd=0x02000040,20M $(buffalo_ver);
     bootm 0x00100000 0x02000000;

つまり、tftpboot を行いたい時、
デフォルトで行っているのは、
上記のコマンドということに成ると思います。

なので、tftpboot でしたいことは、
     tftpboot 0x00100000 uImage.buffalo;
     tftpboot 0x02000000 initrd.buffalo;

になり、
つまりは、各メモリの場所に初期化インストーラーのイメージと、ファームウェアのイメージを
配置していることになります。

そして
     setenv bootargs $(bootargs_base) $(bootargs_root) initrd=0x02000040,20M $(buffalo_ver);
で実行すると環境変数も変えてしまっていますが、私の場合は、
     setenv bootargs $(bootargs_base) $(bootargs_root) $(buffalo_ver);
となっていますから、これを実行して、saveenvを行えば、環境変数は再起動しても
元に戻らず、保存されてしまいます。
setenv def_tftp の中でsetenv をした後に、saveenvをしていないので、この場合は再起動すると
元の設定値に戻ることになります。

つまり、この前のftpboot コマンドで取得したイメージを、次のbootm コマンドで実行する前に、
環境変数によって環境を一時的に変えたいのでしょう。

最後に、その、bootm コマンドで、メモリ上に保存したイメージが保管されているアドレスを与えて、
インストーラーを実行します。

     bootm 0x00100000 0x02000000;

さて、今説明したのは、setenv def_tftpの説明でした。
しかし実は、これこそが、U-BOOT の初期化プロセスだったのです。

つまり、今回、玄箱PRO のアドレス割り当てをU-BOOT から行って再起動後の
2度目のカウントダウンから再びU-BOOT に入ったら、

tftpboot 0x00100000 uImage.buffalo;
tftpboot 0x02000000 initrd.buffalo;
setenv bootargs $(bootargs_base) $(bootargs_root) initrd=0x02000040,20M $(buffalo_ver);
bootm 0x00100000 0x02000000;



をシリアルコンソールから打ち込めばアップデートは終了します。
Windows 標準のハイパーターミナルであれば、「ホストに貼り付け」という方法でコピーすれば
打ち込む必要も無かったです。

最後に私の場合は、Windows 標準のターミナルからの接続設定を残します。
ポートの設定
ビット/秒:115200
データ ビット:8
パリティ:なし
ストップ ビット:1
フロー制御:なし


次回(その次回はこちら)は、TFTPよりインストールが成功したdebian squeeze についてのメモを載せようと思います。


以上、今回はファームウェアアップデート作業のメモでした。

                                                      お粗末<_ _>

拍手[0回]

PR


  • 2012/04/15 17:55

コメント一覧

  • お名前
  • Email

  • コメント

  • Vodafone絵文字 i-mode絵文字 Ezweb絵文字
  • パスワード
[PR]