A PyQt6 GUI for flashing Qualcomm devices — supports parallel multi-device flashing, EDL mode, and an automated factory pipeline.
- Multi-device — flash multiple devices simultaneously from a single window
- EDL & ADB support — works in both Emergency Download (EDL) and debug/user boot modes
- USB port tracking — identifies which physical port each device is connected to
- Factory pipeline — automated 3-stage flash sequence with boot verification and per-device pass/fail reports
- Live progress — per-device progress bars and inline log viewer
- Python 3.10+
- PyQt6
- QDL binary at
~/aio/qdl/qdl
pip install -r requirements.txtEDL devices (05c6:9008) require udev access. Create the rule:
sudo nano /etc/udev/rules.d/99-qualcomm.rulesSUBSYSTEM=="usb", ATTR{idVendor}=="05c6", ATTR{idProduct}=="9008", MODE="0666"
Reload and replug:
sudo udevadm control --reload-rules && sudo udevadm triggerVerify with ~/aio/qdl/qdl list — you should see device serials without needing sudo.
FW_PATH=/path/to/firmware python flash.pyPoint FW_PATH at a directory containing:
prog*.elf— Qualcomm firehose programmerrawprogram*.xmlpatch*.xml
FACTORY_FW_PATH=/path/to/factory_fw \
PROD_DEBUG_FW_PATH=/path/to/prod_debug_fw \
FACTORY_REPORTS_DIR=~/factory_reports \
python factory_app.pyThe factory pipeline runs automatically when a device is detected:
- Flash 1/3 — initial firmware flash over EDL
- Boot — device boots, build ID is verified against
AQ3A.250226.002 - Flash 3/3 — reboots to EDL and flashes final image
Results are saved as JSON reports in FACTORY_REPORTS_DIR (default: ~/factory_reports).
| Env var | Default | Description |
|---|---|---|
FW_PATH |
— | Firmware directory (standard mode) |
FACTORY_FW_PATH |
— | Factory firmware directory |
PROD_DEBUG_FW_PATH |
— | Production debug firmware directory |
BOOT_TIMEOUT_SEC |
120 |
Seconds to wait for device to boot |
FACTORY_REPORTS_DIR |
~/factory_reports |
Output directory for flash reports |