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

52 lines
2.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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).