follow me

FON2601Eのu-bootヘッダは少し注意

FON2601Eのu-bootヘッダは少し注意が必要です。
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を書換えた環境用意した方が早いきもしますが。。。

関連情報

FON2601Eのu-bootヘッダは少し注意 | 3 件のコメント | アカウント登録
サイト管理者はコメントに関する責任を負いません。
FON2601Eのu-bootヘッダは少し注意
投稿者: drvlabo on 2019年2月18日(月) 07:40 JST

相当に周回遅れですが、MT7620A, 11ac(PCIe), USBあり, UARTがハンダで埋まってない、で探していたらこいつにぶち当たったので、買って移植作業を進めています。
この記事を見かけて買うことにしたのですが、すごく助かりました。

UART無しでファームウェアをファイルで投入する手段が見つかっていないんですよね。
改造しなければ書き換えできないんでは意義が1/10程度になってしまいますので、そこが残念なところ。

FON2601Eのu-bootヘッダは少し注意
投稿者: Tochiro on 2019年2月21日(木) 13:23 JST

管理画面からの書き換えも試してた記憶があるけど、どこまでやったか記憶があやふや。
あと、Ethernetの片方がアップしてくれなかった記憶。
放置してしまってるので、なんとかしたいですね。
愉しみにしています。

FON2601Eのu-bootヘッダは少し注意
投稿者: drvlabo on 2019年2月27日(水) 06:39 JST

> あと、Ethernetの片方がアップしてくれなかった
外付けGbE PHY(RTL8211E)の方ですね
それについては原因を見つけました
内蔵Switch(Ether MAC?)のauto-poll機能のレジスタ設定不具合です

そのリンク不能対策の件と、FON2601のサポートのための改変(uImageヘッダの水増し処理含む)をpull-requestで提起済みです。

内蔵switchについてはMDIOで外付けするPHY/switchの構成がまた別のケースの場合の対策差分も出ていて、私が出した差分がそのままacceptされることはたぶん無いだろうと。
何にしても現状の実装のままでは対処できないケースがあるので見直しが必要な箇所であろうと思います。