FONなどで使われているRalinkのRT3052はSPI Flashが使われているケースがあります。
これをダンプしてみると、
00000000 27 05 19 56 fc 71 4e ed 4b 44 29 63 00 00 ed 87 |'..V.qN.KD)c....|
00000010 80 10 00 00 80 10 00 00 6b 5b 17 20 05 05 01 00 |........k[. ....|
00000020 66 6f 6e 6c 6f 61 64 65 72 00 00 00 00 00 00 00 |fonloader.......|
00000030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000040 ff 00 00 10 00 00 00 00 fd 00 00 10 00 00 00 00 |................|
00000050 06 01 00 10 00 00 00 00 04 01 00 10 00 00 00 00 |................|
00000060 02 01 00 10 00 00 00 00 00 01 00 10 00 00 00 00 |................|
00000070 fe 00 00 10 00 00 00 00 fc 00 00 10 00 00 00 00 |................|
00000080 fa 00 00 10 00 00 00 00 f8 00 00 10 00 00 00 00 |................|
00000090 f6 00 00 10 00 00 00 00 f4 00 00 10 00 00 00 00 |................|
000000a0 f2 00 00 10 00 00 00 00 f0 00 00 10 00 00 00 00 |................|
0x0-0x2fがヘッダーで、0x30-0x3fはパディングで、その後がベクターのように見えます。
他の物のダンプ
00000000 27 05 19 56 d8 58 3d 89 4e f1 5a ea 00 01 aa fc |'..V.X=.N.Z.....|
00000010 80 20 00 00 80 20 00 00 25 4b f4 00 05 05 01 00 |. ... ..%K......|
00000020 53 50 49 20 46 6c 61 73 68 20 49 6d 61 67 65 00 |SPI Flash Image.|
00000030 04 5a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |.Z..............|
00000040 ff 00 00 10 00 00 00 00 fd 00 00 10 00 00 00 00 |................|
00000050 e1 01 00 10 00 00 00 00 df 01 00 10 00 00 00 00 |................|
00000060 dd 01 00 10 00 00 00 00 db 01 00 10 00 00 00 00 |................|
00000070 d9 01 00 10 00 00 00 00 d7 01 00 10 00 00 00 00 |................|
00000080 d5 01 00 10 00 00 00 00 d3 01 00 10 00 00 00 00 |................|
00000090 d1 01 00 10 00 00 00 00 cf 01 00 10 00 00 00 00 |................|
0xcバイト目から4バイトがサイズで、0x10から4バイトがメモリオフセットのようです。0x40以降をメモリオフセットにサイズ分貼り付けているようです。
ソースに定義がありました。
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 */
dram_header_t ih_dram;
} image_header_t;
このヘッダーは以下のようにして作られるようです。
./tools/mkimage -A mips -T standalone -C none \
-a 0x80200000 -e 0x80200000 \
-n "SPI Flash Image" \
-r SDR -s 32 -t 32 -u 16 \
-y 0xFF -z 0xFF -w 0xFF -d uboot.bin uboot.img
Image Name: SPI Flash Image
Created: Sun Jan 7 11:13:21 2024
Image Type: MIPS Linux Standalone Program (uncompressed)
Data Size: 107172 Bytes = 104.66 kB = 0.10 MB
Load Address: 0x80200000
Entry Point: 0x80200000
DRAM Parameter: 16 (Parm0=0 Parm1=0)
ベクターが続き、このあたりからコードのように見えます。
00000410 16 00 00 10 00 00 00 00 14 00 00 10 00 00 00 00 |................|
00000420 12 00 00 10 00 00 00 00 10 00 00 10 00 00 00 00 |................|
00000430 0e 00 00 10 00 00 00 00 0c 00 00 10 00 00 00 00 |................|
00000440 40 00 04 3c 00 00 00 00 40 80 08 3c 00 00 1d 25 |@..<....@..<...%|
00000450 02 00 11 04 00 00 00 00 80 1b 10 80 00 00 fc 8f |................|
00000460 44 00 99 8f 08 00 20 03 00 00 00 00 ff ff 00 10 |D..... .........|
00000470 ff ff 00 10 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0
その後、ここまで続きます。
00001bf0 6c 18 10 80 d8 15 10 80 f0 1a 10 80 48 19 10 80 |l...........H...|
00001c00 f4 1b 10 80 88 05 10 80 e0 1a 10 80 e0 17 10 80 |................|
00001c10 a0 19 10 80 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001c20 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00002040 5d 00 00 80 00 ff ff ff ff ff ff ff ff 00 7f 80 |]...............|
00002050 2c 20 00 ca f2 a5 f4 09 42 10 c8 20 03 c1 a0 14 |, ......B.. ....|
00002060 a4 c5 0d 45 90 65 d6 07 92 85 62 2b f6 64 f6 42 |...E.e....b+.d.B|
00002070 b7 aa 5b 4a af 3c f3 79 e9 d8 6d d2 27 82 66 35 |..[J.<.y..m.'.f5|
おそらく0x2040移行がu-boot本体で、文字列などが確認できないので圧縮されているものと思われます。
SOCのROMに焼かれたコードで00001c13までのコードをscrachpadのようなSOC内部のRAMに貼り付けて、実行を移し、その後SDRAMの初期化を行い、SPI Flashから0x2040の圧縮イメージを解凍してSDRAMに貼り付けていると想像されます。
圧縮されたubootはここまでです。
0000eda0 89 43 ea 48 cc 21 1c ac 3d 63 e0 de 63 ff a6 59 |.C.H.!..=c..c..Y|
0000edb0 8f 79 65 77 a6 53 48 b2 b6 48 95 ed c8 05 f9 47 |.yew.SH..H.....G|
0000edc0 bb 87 ff fe 57 9e 53 00 00 00 00 00 00 00 00 00 |....W.S.........|
0000edd0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00010000 50 30 00 01 00 18 84 42 75 d0 ff ff ff ff ff ff |P0.....Bu.......|
00010010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
uboot本体が64Kで設定が64Kとコンパクトに収めていて、2M Flashに押し込めるため、けっこう複雑な事やってるみたいです。
RalinkのSDKにUbootのコードが含まれていますが、このバイナリの再構築は不可能と思われます。
FONのu-bootは自己解凍タイプになっていて、いったんメモリに貼り付けて実行が移り、その後メモリの後半部分を展開して、展開してほんちゃんのu-bootに実行を移しているようです。通常のu-bootは384K必要ですが、FONはこの仕組みで128Kですませているようです。2M Flashにすべて入れるための方法と思われます。