U-Bootの起動中に買ってにキー入力がされてブートが止まってしまう
Cosmo-Z Mini2を出荷しているのですが、中の1台で、USBを挿さずに電源を入れたところ、いつまでたっても起動しないという現象が見つかりました。
起動しないときにUSBを挿してUARTのコンソールを見てみると、どうやらU-Bootで止まってしまっているようです。
Hit any key to stop autoboot:
のところで何らかのキーが押されて止まってしまっているようです。
この"Hit any key to stop autoboot:"という文字列をfgrepしてU-bootのソースを調べてみると、common/autoboot.cというソースの中で処理されていることがわかりました。
その中で、static int abortboot_single_key(int bootdelay) という関数があって、tstc()という関数を2か所で呼び出し、Hit any keyの判定を行っているようでした。
何かキーが押されたら止めるという判定ではなくENTERキー(0x0d)が押されたら止めるというふうにプログラムを書き換えてみたのですが、それでも止まってしまいます。どうやら、UARTに送られてくるキーにはENTERが含まれているようです。仕方がないので、tstc()の後ろのgetchar()で取得した内容がCTRL+C(0x03)だったらautobootを止めるというようにしたら、起動中に止まらないようになりました。
これだと止めたいときに止まらず不便なので、boot.scrで制御できないかなと考えました。
ソースを読むと、bootdelayという環境変数が-2のときにはカウントダウンせずに自動起動し、-1のときには自動起動をしない、0以上の場合は指定された秒数だけ待つという仕様になっていました。
しかし、boot.scrで環境変数を書き換えようとしても、なかなかうまくいきません。そもそもboot.scrの元になるテキストファイルをどのように書けばよいのかがよくわからないのです。
bootdelay=-2
とすればよいのか、
setenv bootdelay -2
なのか、
または
setenv bootdelay -2;
なのか、
setenv bootdelay -2 && ・・・
なのか。
どの方法を試してもダメでした。環境変数bootdelayは書き換わりません。ビルド時に埋め込まれた値が使用されてしまいます。
| 固定リンク
コメント