# matu6968/apxtool architecture

> Architecture diagram of the GitHub repository matu6968/apxtool, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-09). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/matu6968/apxtool
- Repository: https://github.com/matu6968/apxtool

## Overview

apxtool is experimental host-side loader, debugging, and SPI-flash tooling for the AppoTech JT5295 Action Vision camera. The main workflow begins at the CLI, communicates with the camera over SCSI to enter its loader or read RAM, then either accesses flash through a payload or launches an SDK for APXD debugging and SD-card operations. Separate branches cover forced-BootROM rescue and Silvergear bring-up/recovery. README and source-index references establish the main routes; some unsampled subsystem details are represented without speculative internal links.

Main entry points: [`src/apxtool/cli.py`](https://github.com/matu6968/apxtool/blob/main/src/apxtool/cli.py) (Command interface), [`src/apxtool/debug_cli.py`](https://github.com/matu6968/apxtool/blob/main/src/apxtool/debug_cli.py) (Debug commands), [`src/apxtool/rom_rescue.py`](https://github.com/matu6968/apxtool/blob/main/src/apxtool/rom_rescue.py) (BootROM rescue), [`src/apxtool/flash.py`](https://github.com/matu6968/apxtool/blob/main/src/apxtool/flash.py) (Flash management)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_entry["CLI and transport"]
  node_cli["Command interface<br/>[cli.py]"]
  node_debug_cli["Debug commands<br/>[debug_cli.py]"]
  node_transport["SCSI transport<br/>[transport.py]"]
  node_scsi_backend["SCSI backend<br/>[common.py]"]
  node_protocol["SCSI protocol<br/>[protocol.py]"]
end

subgraph group_loader["Loader and SDK"]
  node_device_entry["Loader transition<br/>[devices.py]"]
  node_ram["RAM access<br/>[ram.py]"]
  node_sdk_launch["SDK takeover<br/>[sdk.py]"]
end

subgraph group_flash["Flash operations"]
  node_flash_ops["Flash management<br/>[flash.py]"]
  node_payload_flash["Loader flasher<br/>[flasher.py]"]
  node_sdk_flash["SDK flash access<br/>[sdk_flash.py]"]
end

subgraph group_debug["SDK device services"]
  node_debug_client["APXD client<br/>[debug.py]"]
  node_storage["SD and FatFs<br/>[storage.py]"]
  node_camera_services["Camera services<br/>[camera.py]"]
  node_audio["Audio services<br/>[audio.py]"]
end

subgraph group_recovery["Recovery and variants"]
  node_rom_rescue["BootROM rescue<br/>[rom_rescue.py]"]
  node_trace["Boot trace decode<br/>[trace.py]"]
  node_silvergear["Silvergear workflow<br/>[silvergear.py]"]
  node_silvergear_bringup["Silvergear bring-up"]
  node_silvergear_install["Silvergear install"]
  node_silvergear_recovery["Silvergear recovery"]
end

node_user(("Operator"))
node_camera["JT5295 camera"]

node_user -->|"runs commands"| node_cli
node_cli -->|"opens device"| node_transport
node_transport -->|"uses backend"| node_scsi_backend
node_cli -->|"enters loader"| node_device_entry
node_device_entry -->|"builds commands"| node_protocol
node_cli -->|"reads RAM"| node_ram
node_cli -->|"runs flash actions"| node_flash_ops
node_flash_ops -->|"uses backend"| node_payload_flash
node_cli -->|"dispatches rescue"| node_rom_rescue
node_rom_rescue -->|"runs payload"| node_payload_flash
node_rom_rescue -->|"decodes trace"| node_trace
node_cli -->|"launches SDK"| node_sdk_launch
node_sdk_launch -->|"enters loader"| node_device_entry
node_debug_cli -->|"sends APXD requests"| node_debug_client
node_debug_cli -->|"runs SD commands"| node_storage
node_debug_cli -->|"controls camera"| node_camera_services
node_debug_cli -->|"runs audio commands"| node_audio
node_debug_cli -->|"runs SDK flash"| node_sdk_flash
node_sdk_launch -->|"enables SDK commands"| node_debug_cli
node_cli -->|"dispatches workflow"| node_silvergear
node_silvergear -->|"coordinates bring-up"| node_silvergear_bringup
node_silvergear -->|"uses rescue"| node_rom_rescue
node_silvergear_install -->|"uses flash operations"| node_flash_ops
node_silvergear_recovery -->|"uses flash operations"| node_flash_ops
node_transport -->|"communicates over SCSI"| node_camera

click node_cli "https://github.com/matu6968/apxtool/blob/main/src/apxtool/cli.py"
click node_debug_cli "https://github.com/matu6968/apxtool/blob/main/src/apxtool/debug_cli.py"
click node_transport "https://github.com/matu6968/apxtool/blob/main/src/apxtool/transport.py"
click node_scsi_backend "https://github.com/matu6968/apxtool/blob/main/src/apxtool/scsiio/common.py"
click node_protocol "https://github.com/matu6968/apxtool/blob/main/src/apxtool/protocol.py"
click node_device_entry "https://github.com/matu6968/apxtool/blob/main/src/apxtool/devices.py"
click node_ram "https://github.com/matu6968/apxtool/blob/main/src/apxtool/ram.py"
click node_sdk_launch "https://github.com/matu6968/apxtool/blob/main/src/apxtool/sdk.py"
click node_debug_client "https://github.com/matu6968/apxtool/blob/main/src/apxtool/debug.py"
click node_storage "https://github.com/matu6968/apxtool/blob/main/src/apxtool/storage.py"
click node_camera_services "https://github.com/matu6968/apxtool/blob/main/src/apxtool/camera.py"
click node_audio "https://github.com/matu6968/apxtool/blob/main/src/apxtool/audio.py"
click node_flash_ops "https://github.com/matu6968/apxtool/blob/main/src/apxtool/flash.py"
click node_payload_flash "https://github.com/matu6968/apxtool/blob/main/src/apxtool/flasher.py"
click node_sdk_flash "https://github.com/matu6968/apxtool/blob/main/src/apxtool/sdk_flash.py"
click node_rom_rescue "https://github.com/matu6968/apxtool/blob/main/src/apxtool/rom_rescue.py"
click node_trace "https://github.com/matu6968/apxtool/blob/main/src/apxtool/trace.py"
click node_silvergear "https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear.py"
click node_silvergear_bringup "https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_bringup.py"
click node_silvergear_install "https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_install.py"
click node_silvergear_recovery "https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_recovery.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_cli,node_debug_cli,node_transport,node_scsi_backend,node_protocol toneBlue
class node_device_entry,node_ram,node_sdk_launch toneAmber
class node_flash_ops,node_payload_flash,node_sdk_flash toneMint
class node_debug_client,node_storage,node_camera_services,node_audio toneRose
class node_rom_rescue,node_trace,node_silvergear,node_silvergear_bringup,node_silvergear_install,node_silvergear_recovery,node_user,node_camera toneIndigo
```

## Components

### CLI and transport

- [Command interface](https://github.com/matu6968/apxtool/blob/main/src/apxtool/cli.py): `src/apxtool/cli.py`
- [Debug commands](https://github.com/matu6968/apxtool/blob/main/src/apxtool/debug_cli.py): `src/apxtool/debug_cli.py`
- [SCSI transport](https://github.com/matu6968/apxtool/blob/main/src/apxtool/transport.py): `src/apxtool/transport.py`
- [SCSI backend](https://github.com/matu6968/apxtool/blob/main/src/apxtool/scsiio/common.py): `src/apxtool/scsiio/common.py`
- [SCSI protocol](https://github.com/matu6968/apxtool/blob/main/src/apxtool/protocol.py): `src/apxtool/protocol.py`

### Loader and SDK

- [Loader transition](https://github.com/matu6968/apxtool/blob/main/src/apxtool/devices.py): `src/apxtool/devices.py`
- [RAM access](https://github.com/matu6968/apxtool/blob/main/src/apxtool/ram.py): `src/apxtool/ram.py`
- [SDK takeover](https://github.com/matu6968/apxtool/blob/main/src/apxtool/sdk.py): `src/apxtool/sdk.py`

### Flash operations

- [Flash management](https://github.com/matu6968/apxtool/blob/main/src/apxtool/flash.py): `src/apxtool/flash.py`
- [Loader flasher](https://github.com/matu6968/apxtool/blob/main/src/apxtool/flasher.py): `src/apxtool/flasher.py`
- [SDK flash access](https://github.com/matu6968/apxtool/blob/main/src/apxtool/sdk_flash.py): `src/apxtool/sdk_flash.py`

### SDK device services

- [APXD client](https://github.com/matu6968/apxtool/blob/main/src/apxtool/debug.py): `src/apxtool/debug.py`
- [SD and FatFs](https://github.com/matu6968/apxtool/blob/main/src/apxtool/storage.py): `src/apxtool/storage.py`
- [Camera services](https://github.com/matu6968/apxtool/blob/main/src/apxtool/camera.py): `src/apxtool/camera.py`
- [Audio services](https://github.com/matu6968/apxtool/blob/main/src/apxtool/audio.py): `src/apxtool/audio.py`

### Recovery and variants

- [BootROM rescue](https://github.com/matu6968/apxtool/blob/main/src/apxtool/rom_rescue.py): `src/apxtool/rom_rescue.py`
- [Boot trace decode](https://github.com/matu6968/apxtool/blob/main/src/apxtool/trace.py): `src/apxtool/trace.py`
- [Silvergear workflow](https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear.py): `src/apxtool/silvergear.py`
- [Silvergear bring-up](https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_bringup.py): `src/apxtool/silvergear_bringup.py`
- [Silvergear install](https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_install.py): `src/apxtool/silvergear_install.py`
- [Silvergear recovery](https://github.com/matu6968/apxtool/blob/main/src/apxtool/silvergear_recovery.py): `src/apxtool/silvergear_recovery.py`

### Other components

- **Operator**
- **JT5295 camera**

## Connections

- Operator → Command interface: runs commands (evidence: `README.md`)
- Command interface → SCSI transport: opens device (evidence: `src/apxtool/cli.py`)
- SCSI transport → SCSI backend: uses backend (evidence: `src/apxtool/transport.py`)
- Command interface → Loader transition: enters loader (evidence: `README.md`)
- Loader transition → SCSI protocol: builds commands (evidence: `src/apxtool/devices.py`)
- Command interface → RAM access: reads RAM (evidence: `src/apxtool/cli.py`)
- Command interface → Flash management: runs flash actions (evidence: `src/apxtool/cli.py`)
- Flash management → Loader flasher: uses backend (evidence: `README.md`)
- Command interface → BootROM rescue: dispatches rescue (evidence: `src/apxtool/cli.py`)
- BootROM rescue → Loader flasher: runs payload (evidence: `src/apxtool/rom_rescue.py`)
- BootROM rescue → Boot trace decode: decodes trace (evidence: `src/apxtool/rom_rescue.py`)
- Command interface → SDK takeover: launches SDK (evidence: `README.md`)
- SDK takeover → Loader transition: enters loader (evidence: `src/apxtool/sdk.py`)
- Debug commands → APXD client: sends APXD requests (evidence: `src/apxtool/debug_cli.py`)
- Debug commands → SD and FatFs: runs SD commands (evidence: `README.md`)
- Debug commands → Camera services: controls camera (evidence: `src/apxtool/debug_cli.py`)
- Debug commands → Audio services: runs audio commands (evidence: `src/apxtool/debug_cli.py`)
- Debug commands → SDK flash access: runs SDK flash (evidence: `src/apxtool/debug_cli.py`)
- SDK takeover → Debug commands: enables SDK commands (evidence: `README.md`)
- Command interface → Silvergear workflow: dispatches workflow (evidence: `src/apxtool/cli.py`)
- Silvergear workflow → Silvergear bring-up: coordinates bring-up (evidence: `src/apxtool/silvergear.py`)
- Silvergear workflow → BootROM rescue: uses rescue (evidence: `src/apxtool/silvergear.py`)
- Silvergear install → Flash management: uses flash operations (evidence: `src/apxtool/silvergear_install.py`)
- Silvergear recovery → Flash management: uses flash operations (evidence: `src/apxtool/silvergear_recovery.py`)
- SCSI transport → JT5295 camera: communicates over SCSI (evidence: `README.md`)
