Skip to main content

Lightweight CLI tool for flashing Ingenic SoCs via USB boot mode

Project description

ingenic-flash-tool

Lightweight Python CLI tool for flashing Ingenic T-series SoCs (T20/T21/T23/T30/T31/T40/T41) via USB boot mode.

Installation

pip install ingenic-flash-tool

Requires libusb on your system:

  • Linux: sudo apt install libusb-1.0-0 or sudo pacman -S libusb
  • macOS: brew install libusb

udev rules (Linux)

To use without sudo, add a udev rule:

echo 'SUBSYSTEM=="usb", ATTR{idVendor}=="a108", MODE="0666"' | sudo tee /etc/udev/rules.d/99-ingenic.rules
sudo udevadm control --reload-rules && sudo udevadm trigger

Usage

Detect device

Check if an Ingenic device is connected in USB boot mode:

$ ingenic-flash-tool detect
Device found!
  USB PID:  0xc309 (T-series)
  CPU info: b'T 3 1 V ' (hex: 5420332031205620)

Flash firmware

Flash a firmware image to SPI NOR flash:

$ ingenic-flash-tool -v flash prj008 firmware.bin
INFO: Boot ROM CPU info: 5420332031205620
INFO: Loading ginfo (324 bytes) to 0x80001000
INFO: Loading SPL (32384 bytes) to 0x80001800
INFO: SPL running: 5420332031205620
INFO: Loading stage2 (417656 bytes) to 0x80100000
INFO: Stage2 running: b'PRJ\x00\x00\x00\x00\x00'
INFO: Flash JEDEC ID: 0xef7018 (W25Q128JVSM, 16384KB)
INFO: Initializing flash...
INFO: Writing 232652 bytes (227K) at offset 0x0
  [########################################] 100% (232652/232652)
Flash complete!

Options:

  • -v / -vv — increase verbosity
  • --offset 0x40000 — write at a specific flash offset
  • --erase-all — full chip erase before writing (default: sector erase only)
  • --no-reboot — don't reboot the device after flashing

Boot device

Boot the device into the stage2 burner without flashing (useful for debugging):

$ ingenic-flash-tool boot prj008
Device booted into stage2: b'PRJ\x00\x00\x00\x00\x00' (50524a0000000000)

Show chip info

$ ingenic-flash-tool info
Supported chips:
  prj008      PID=0xc309  ginfo=0x80001000 [bundled]
  t20         PID=0xc309  ginfo=0x80001000 [bundled]
  t21         PID=0xc309  ginfo=0x80001000 [bundled]
  ...

$ ingenic-flash-tool info --chip prj008
Chip:        PRJ008 [bundled]
ginfo addr:  0x80001000
SPL addr:    0x80001800
Stage2 addr: 0x80100000
d2i_len:     0x7000
USB PID:     0xc309

Supported Hardware

Chip/Board Boot Flash Notes
PRJ008 Yes Yes Full support (T31/T33 camera board, SPI NOR)
T20–T41 Yes No Boot only — need board-specific ginfo + config
40 chips Yes All Ingenic SoCs with bundled SPL/U-Boot

Full flash support requires board-specific firmware files (ginfo.bin, spl.bin, uboot.bin). The flash configuration is auto-generated from the detected flash JEDEC ID using a built-in database of 55+ SPI flash chips.

How It Works

The tool implements the Ingenic USB boot protocol, reverse-engineered from USB packet captures:

  1. Boot ROM — The SoC enters USB boot mode. The tool sends a DDR configuration block (ginfo) and first-stage bootloader (SPL) via vendor USB requests.

  2. SPL — The SPL initializes DDR memory, then stays resident and re-implements USB. It does not return to the boot ROM. The tool sends the stage2 burner firmware (U-Boot) via the SPL's USB interface.

  3. Stage2 Burner — A specialized U-Boot build that handles flash operations. The tool auto-detects the flash chip via JEDEC ID, sends board configuration, then writes firmware in 64KB chunks with CRC verification.

Protocol details

Boot ROM requests: GET_CPU_INFO(0x00), SET_DATA_ADDR(0x01), SET_DATA_LEN(0x02),
                   PROGRAM_START1(0x04)
SPL requests:      FLUSH_CACHES(0x03), PROGRAM_START2(0x05)
Stage2 requests:   GET_ACK(0x10), INIT(0x11), WRITE(0x12), UPDATE_CFG(0x14),
                   REBOOT(0x16), GET_FLASH_INFO(0x26)

Key discovery: FLUSH_CACHES and PROGRAM_START2 are only supported by the resident SPL, not the boot ROM (contrary to the JZ4760 documentation). The boot ROM only supports requests 0x000x02 and 0x04.

Development

git clone https://github.com/will-tm/ingenic-flash-tool.git
cd ingenic-flash-tool
python -m venv .venv
source .venv/bin/activate
pip install -e .

License

MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ingenic_flash_tool-0.3.0.tar.gz (8.4 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ingenic_flash_tool-0.3.0-py3-none-any.whl (8.5 MB view details)

Uploaded Python 3

File details

Details for the file ingenic_flash_tool-0.3.0.tar.gz.

File metadata

  • Download URL: ingenic_flash_tool-0.3.0.tar.gz
  • Upload date:
  • Size: 8.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for ingenic_flash_tool-0.3.0.tar.gz
Algorithm Hash digest
SHA256 400b0004076f9a3b628a253e620057bcf58d8d832ae20e12739129e9fc225169
MD5 17d2b3905fd8b8132b07e2760d0fecbe
BLAKE2b-256 72c5924ae364b6f31cd97aad952347c8559c866cf65d209a4c17d9a3ead82867

See more details on using hashes here.

File details

Details for the file ingenic_flash_tool-0.3.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ingenic_flash_tool-0.3.0-py3-none-any.whl
Algorithm Hash digest
SHA256 5712420f1da044ff8e878385d6ae300e841a06cd7c23641bed9115fedf2e65db
MD5 9e7d18c2b1f2a00b85f585a1c8bbf90a
BLAKE2b-256 fca9087fa3d4f0d06a61da58aa33ce37ea3aefe5e4aca510248e6be027ceaf8d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page