FON2601Eのu-bootヘッダは少し注意
2015年7月24日(金) 00:42 JST
閲覧数 5,542
FON2601Eのu-bootヘッダは少し注意が必要です。
FON2601EのベースはOpenWRTではなくSDKなのですが、そのSDKからもu-bootヘッダが異なる為、いつもの感覚でビルドしたイメージを受け付けてくれません。
Bad Header Checksumが発生します。
で、おそらく知りたいだろうヘッダ構造なのですが、まずu-bootのヘッダなのですが、こういう構造になっているのが通常です。
SDKのヘッダでも、OpenWRTのヘッダでもこの構造をしている訳ですが。。。
最後のImage Nameは32バイトが標準的なサイズ。
次にSPI Flashに書き込まれたデータを見てみます。
まるっと吸い出したデータから該当箇所を取り出してみます。
ブートログから位置は、0x50000だとわかるので、その箇所から見てみます。
u-bootイメージの開始は、27051956なので該当箇所が見つかるかと思います。
バイナリエディタで見ると、この様なデータになります。
ih_name[IH_NMLEN]の長さが倍の64バイトあります。
赤文字箇所がih_nameにあたります。
つまりヘッダーのCRC(青文字箇所)が狂う訳です。
ヘッダーの足りない分は0で足して、CRCを計算し直した値を入れる事で起動できる様になります。
まぁ、IH_NMLENを書換えた環境用意した方が早いきもしますが。。。
FON2601EのベースはOpenWRTではなくSDKなのですが、そのSDKからもu-bootヘッダが異なる為、いつもの感覚でビルドしたイメージを受け付けてくれません。
Bad Header Checksumが発生します。
################################################################# ################################################################# ################### done Bytes transferred = 4420086 (4371f6 hex) NetBootFileXferSize= 004371f6 raspi_read: from:30000 len:10000 Erasing SPI Flash... raspi_erase: offs:30000 len:10000 . Writing to SPI Flash... raspi_write: to:30000 len:10000 . done Automatic boot of image at addr 0x80A00000 ... ## Booting image at 80a00000 ... raspi_read: from:30000 len:10000 Erasing SPI Flash... raspi_erase: offs:30000 len:10000 . Writing to SPI Flash... raspi_write: to:30000 len:10000 . done Bad Header Checksum raspi_read: from:40028 len:6 Trying Eth0 (10/100-M) Waitting for RX_DMA_BUSY status Start... done FON BootLoad start httpserver.....ここで辞めてしまった人もいるかもしれないトラップですが、完全に独自形式を作成している訳ではなくヘッダーが少しいじられているだけなので回避可能です。
で、おそらく知りたいだろうヘッダ構造なのですが、まずu-bootのヘッダなのですが、こういう構造になっているのが通常です。
SDKのヘッダでも、OpenWRTのヘッダでもこの構造をしている訳ですが。。。
最後のImage Nameは32バイトが標準的なサイズ。
typedef struct image_header { uint32_t ih_magic; /* Image Header Magic Number */ uint32_t ih_hcrc; /* Image Header CRC Checksum */ uint32_t ih_time; /* Image Creation Timestamp */ uint32_t ih_size; /* Image Data Size */ uint32_t ih_load; /* Data Load Address */ uint32_t ih_ep; /* Entry Point Address */ uint32_t ih_dcrc; /* Image Data CRC Checksum */ uint8_t ih_os; /* Operating System */ uint8_t ih_arch; /* CPU architecture */ uint8_t ih_type; /* Image Type */ uint8_t ih_comp; /* Compression Type */ uint8_t ih_name[IH_NMLEN]; /* Image Name */ } image_header_t;
次にSPI Flashに書き込まれたデータを見てみます。
まるっと吸い出したデータから該当箇所を取り出してみます。
ブートログから位置は、0x50000だとわかるので、その箇所から見てみます。
u-bootイメージの開始は、27051956なので該当箇所が見つかるかと思います。
バイナリエディタで見ると、この様なデータになります。
00010203 04050607 08090A0B 0C0D0E0F 0123456789ABCDEF 050000 27051956 6EF2EBC5 5282EA21 005303D0 '..Vn...R..!.S.. 050010 80000000 8000C310 797E68E6 05050203 ........y~h..... 000020 6A313868 3133302E 30302E76 30373035 j18h130.00.v0705 050030 302E3230 31333131 31332E66 6F78636F 0.20131113.foxco 050040 6E6E0000 00000000 00000000 00000000 nn.............. 050050 00000000 00000000 00000000 00000000 ................ 050060 5D000000 02F80579 00000000 0000006F ]......y.......o 050070 FDFFFFA3 B7FF473E 48157239 6151B892 ......G>H.r9aQ.. 050080 28E6A386 07F9EEE4 1E82D32F C53A3C01 (........../.:<.もぅ解ってしまいましたね。
ih_name[IH_NMLEN]の長さが倍の64バイトあります。
赤文字箇所がih_nameにあたります。
つまりヘッダーのCRC(青文字箇所)が狂う訳です。
ヘッダーの足りない分は0で足して、CRCを計算し直した値を入れる事で起動できる様になります。
まぁ、IH_NMLENを書換えた環境用意した方が早いきもしますが。。。