Files
2026-09-30 22:48:06 +02:00

2.5 KiB
Raw Permalink Blame History

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

  1. SoC ROM (ARM9) reads boot-mode pins → SPI flash master mode.
  2. ROM parses the AIS image at flash 0x0 (magic 0x41504954, TIPA).
  3. AIS prelude runs PLL/DDR/EMIF init (opcodes 0x5853590D ×2 at file 0x8/0x1C), so DDR is usable before any load.
  4. ROM processes 10× Section Load (0x58535901), copying code/data to 0xC7074630–0xC70B0598 (see table below), then JumpClose (0x58535906, file 0x38660) to entry C70A28A0.
  5. 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 (N3HAL SPI/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 taking CatMetaData::ROMSection.
  • Checksum engine: bitwise CRC-32/IEEE at C70A0A60 (NOT init/final in/around the routine ⇒ zlib chaining F(buf,len,init)), 4 KiB-chunk driver at C708E4E4, file check at C709E7C0 (16-byte header CRC seed 0 → chained 0x40000 chunks → CMPEQ vs stored), orchestrated from C708678C. Ghidra decompilations that proved this are described in RE-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).