2.5 KiB
2.5 KiB
Bootloader
How the device boots, from power-on to app. Static analysis of the IC300 SPI dump (kept local, never shipped) + TI C6748 public boot docs.
Chain
- SoC ROM (ARM9) reads boot-mode pins → SPI flash master mode.
- ROM parses the AIS image at flash
0x0(magic0x41504954,TIPA). - AIS prelude runs PLL/DDR/EMIF init (opcodes
0x5853590D×2 at file0x8/0x1C), so DDR is usable before any load. - ROM processes 10× Section Load (
0x58535901), copying code/data to0xC7074630–0xC70B0598(see table below), then JumpClose (0x58535906, file0x38660) to entryC70A28A0. - Entry is DSP code (C674x reset prelude
ZERO b0; mvc b0,ier; mvc b0,csr, stack align) — from here the DSP owns the system; ARM ROM's job is done. No AIS CRC opcodes are present.
AIS section table (file off → DDR, size)
| File | DDR | Size | Role |
|---|---|---|---|
0x000050 |
C7074630 |
0x1D0 |
header/code |
0x00022C |
C7074800 |
0x33B00 |
main code (updater lives here) |
0x033D38 |
C70A8300 |
0x28CC |
rodata (strings, vtables) |
| … | C70AABD0/C70AABE0/C70AABF0 |
C/C/D44 |
small records |
| … | C70AF000/C70AF4E8/C70AF5EC/C70AF660 |
200/104/70/F38 |
tables/tail |
Re-split any dump with tools/ais_unpack.py.
What the bootloader contains
- Full C++ application core (libc++, TI CGT):
Foundation::SystemUpdater,SystemVerify,BootLoader(Delegate), HAL drivers (N3HALSPI/I2C/UART/SD), OLED/display stack, crash dumper (Legacy NMI Exception, register dump). - Updater methods per flash section:
updateBootSection,updateMainSection(the SD.bin= SYSTEM),updatePresetSection,updateMCUSection,updateMCUBootSection, all takingCatMetaData::ROMSection. - Checksum engine: bitwise CRC-32/IEEE at
C70A0A60(NOTinit/final in/around the routine ⇒ zlib chainingF(buf,len,init)), 4 KiB-chunk driver atC708E4E4, file check atC709E7C0(16-byte header CRC seed 0 → chained0x40000chunks →CMPEQvs stored), orchestrated fromC708678C. Ghidra decompilations that proved this are described inRE-PROCESS.md§3–4 (project kept local).
Rest of IC300 flash
Past the AIS image: FF to ~0x100000, data to ~0x1EFFFF, FF gap
0x1F–0x4Fxxxx, data 0x500000–0xFC7C17 (app/data sections loaded by the
updater; exact section table not yet mapped — open question in FINDINGS.md).
IC301 is separate factory content (AILS, pattern names, 24 WAVs).