RT3052のブート

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以降をメモリオフセットにサイズ分貼り付けているようです。


ソースに定義がありました。

```c
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にすべて入れるための方法と思われます。