A minimalist, clean-slate RC transmitter firmware for the FlySky FS-i6X, written in no_std Rust.
See the codeA minimalist, clean-slate RC transmitter firmware for the FlySky FS-i6X, written in no_std Rust.
Focused on the built-in A7105 2.4 GHz RF transceiver (AFHDS2A protocol), i-BUS telemetry, and the 128×64 LCD interface.
The FS-i6X open-source journey was pioneered by the remarkable work of the OpenI6X project, which successfully brought OpenTX/EdgeTX to this hardware and reverse-engineered the radio architecture.
flysky-i6x-rs explores a complementary design philosophy: an experimental, clean-slate firmware written in bare-metal no_std Rust designed with:
no_std).TIM16 260 Hz packet sync, EXTI2 RF ready) paired with a high-rate decoupled flight pipeline and throttled 30 Hz display loop.| Peripheral | Controller / Spec | MCU Pins & Ports | Notes |
|---|---|---|---|
| MCU | STM32F072VB (Cortex-M0 @ 48 MHz) | ARMv6-M (thumbv6m-none-eabi) | 128 KB Flash, 16 KB SRAM |
| RF Transceiver | Amiccom A7105 2.4 GHz | SPI1 + GPIOs | SPI1 (SCK, MOSI, MISO) |
| Chip Select (CSN) | PE12 (Active Low) | Fast GPIO output | |
| Antenna Switch | PE10 (RF0), PE11 (RF1) | Diversity / TR switch | |
| Packet Ready IRQ | PB2 (EXTI2) | GIO2 line from A7105 (Tx/Rx done) | |
| RF Timer | TIM16 | Periodic packet scheduling (~3.8ms–7.5ms) | |
| Display | ST7567 (128×64 Monochrome LCD) | 8-bit 6800 Parallel Bus | 1024-byte framebuffer in RAM; 30 Hz refresh (~33 ms); Electronic Volume (EV) contrast (15..55) |
| Data Bus (D0..D7) | PE0 .. PE7 | Full-byte ODR write (GPIOE->ODR[7:0]) | |
| Command/Data (RS) | PB3 | Low = Command, High = Data | |
| Reset (RST) | PB4 | Active Low hardware reset | |
| Read/Write (RW) | PB5 | Kept Low for write mode | |
| Chip Select (CS) | PD2 | Active Low (held Low for bus access) | |
| Strobe (RD / E) | PD7 | 6800-series latch strobe (High -> Low pulse) | |
| Backlight (Stock) | PF3 | Active HIGH (drives NPN transistor base) | |
| Backlight (Modded) | PC9 | TIM3_CH4 PWM dimming mod (pioneered by OpenI6X) | |
| Analog Inputs | 12-bit ADC1 via DMA | 11 Channels scanned | Continuous circular DMA1 Ch1 buffer |
| Sticks (RH, RV, LV, LH) | PA0, PA1, PA2, PA3 | Channels 0 (Roll), 1 (Pitch), 2 (Thr), 3 (Yaw) | |
| Potentiometers (VRA, VRB) | PA6, PA7 | Channels 6 (VR1 / Left), 7 (VR2 / Right) | |
| Switches (SA, SB, SC, SD) | PA4, PA5, PB0, PB1 | Channels 4 (2-pos), 5 (3-pos), 8 (3-pos), 9 (2-pos) | |
| Battery Sense | PC0 | Channel 10 (voltage divider: (raw * 100) / 421 + 20) | |
| Digital Keys | 3 Columns × 4 Rows Matrix | Keypad & Trims | Polled at ~50–100 Hz |
| Matrix Columns (R1..R3) | PC6, PC7, PC8 | Driven Low sequentially | |
| Matrix Rows (L1..L4) | PD12, PD13, PD14, PD15 | Inputs with internal pull-ups | |
| Inward Trim Keys | PC6+PD13 & PC7+PD14 | Roll Left (RHL) + Yaw Right (LHR) | |
| Dedicated Bind Key | PF2 | Active Low (pull-up enabled) | |
| Storage | On-chip Flash (Pages 62 & 63) | 0x0801_F000 .. 0x0801_FFFF (4 KB) | 20 models + radio settings (2688 bytes) |
| Telemetry / Serial | UART Interfaces | USART2 (PD5 Tx / PA15 Rx) | External telemetry / i-BUS mirror |
| Audio | Piezo Buzzer | TIM1_CH1 (PA8) | Hardware PWM frequency & tone generator |
flowchart TD
subgraph Core ["FlySky FS-i6X Reactive Architecture (48 MHz)"]
SCHED["Deterministic Hardware Interrupt & Concurrency Model"]
end
subgraph P3 ["Priority 3: Critical RF Sync (TIM16 & EXTI2_3 IRQ)"]
RF1["A7105 State Machine"]
RF2["AFHDS 2A 260 Hz Packet Tx (3.850 ms)"]
RF3["i-BUS Downlink Telemetry Rx"]
end
subgraph P2 ["Priority 2: Autonomous DMA Engine"]
ADC1["Autonomous 11-Ch DMA Scan (0.23 ms)"]
ADC2["Continuous Circular Buffer in SRAM"]
end
subgraph P1 ["Priority 1: Decoupled High-Rate Flight Pipeline (Multi-kHz)"]
FL1["MMA & Deadband Bypass Stick Filter"]
FL2["Dual Rates & Integer Cubic Expo Math"]
FL3["14-Ch Matrix Mixer & Aircraft Templates"]
FL4["Catmull-Rom Spline Throttle Curves"]
FL5["Double-Buffered PENDING_CHANNELS Update (sub-30 µs)"]
end
subgraph P0 ["Priority 0: Throttled UI & Display Loop (30 Hz / ~33 ms)"]
UI1["Keypad & Trim Matrix Scan (90ms Repeat)"]
UI2["Buzzer Tone State Machine (TIM1 PWM)"]
UI3["ST7567 Parallel LCD Framebuffer Render"]
UI4["Non-Volatile Flash Persistence (Pages 62-63)"]
end
SCHED --> P3
SCHED --> P2
SCHED --> P1
SCHED --> P0
cortex-m, cortex-m-rt: Core ARM runtime and interrupt vector tables.stm32f0xx-hal: Embedded HAL implementation for STM32F0 peripherals.embedded-graphics: Monochrome UI primitive rendering, fonts, lines, and bitmaps.embedded-hal: Trait abstractions for SPI, I2C, and GPIO.AFHDS2A distributes transmission across 16 pseudo-random frequencies generated from the transmitter's unique silicon ID:
UID (at 0x1FFFF7AC) -> LCG Random Seed -> 16 Unique Channels (1..164 with min spacing >= 5)
0xBB / 0xBC): Broadcasts TX ID and hopping table to allow receivers (e.g. FS-iA6B) to sync.0x58): 38-byte frame containing up to 14 channels encoded as microsecond pulses (1000–2000 µs).0xAA): Directs receiver output mode (PWM, PPM, i-BUS, or S.BUS).The ST7567 parallel LCD driver maintains a 1024-byte framebuffer in SRAM (128 * 64 / 8). Updating the entire screen takes < 1.2 ms via direct 8-bit GPIO port writes (GPIOE->ODR).
time::millis()) to a steady 30 Hz (~33 ms). This completely decouples graphical drawing from the multi-kHz flight control loop, eliminating servo latency and stutter.15..=55, default 37 / 0x25) in Radio Setup with instant live hardware preview and Flash persistence.[BIND]:
TX/RX), battery voltages (RX/TX), and session extremes (mRSS/mRX).Comprehensive technical documentation is maintained in the docs/ directory:
STM32F072VB and APM32F072VB (UID & DFU mapping).GPIOE (ODR write) + control lines with embedded-graphics.PF3).PC0) to stabilize hundredths digit.SA..SD), rotary pots (VRA, VRB), and battery voltage (PC0).PA0 Roll, PA1 Pitch, PA2 Throttle, PA3 Yaw).PE10/PE11/PE12).TIM16 timer (PSC = 47, ARR = 3849) for exact 3850.0 µs (259.74 Hz) frame sync.[ESC] (Cancel key) and support for one-way receivers (FS-A8S, Fli14).PA8 (TIM1_CH1, 48 MHz / PSC 47) with distinct audio tones.src/menu.rs) navigated via UP, DOWN, OK, and ESC.PC9 (TIM3_CH4, 1 kHz PWM) supporting the popular backlight hardware mod while keeping stock PF3 supported.1000..2000 µs).Diag Anas) split into 2 graphic pages with 40px fill bars matching Channel Monitor.M01..M20), each allocated an exact 128-byte profile.0x0801_F000..0x0801_FFFF, 4 KB) with automatic legacy migration.rx_id per model profile with dynamic RF switching on model change.Pts: 1..5 vs Pts: 1..9) in throttle curve editor.Radio Setup (4.0V–5.0V), flashing status bar display, and periodic audio alarm.Dual Rate/Expo, Wing/Mixer (with mix line editor), and Aux Channels.src/time.rs).diff >= 6) for instantaneous step-response.__aeabi_ldivmod) across all mixing and expo math.RadioStorage::sanitize) enforcing valid operating limits.STANDBY before loading payload, preventing FIFO pointer corruption.RF_MODE_OFF).src/storage.rs.PA11 / PA12 with internal 1.5 kΩ pull-up resistor.ndjson) telemetry at 20 Hz and interactive CLI commands (help, status, channels, telem, reboot).Radio Setup (SE0 disconnect pulse + hardware APB1 reset without requiring reboot). Default mode: OFF.U:SIM status indicator.USB Mode setting in Radio Setup (OFF, JOYSTICK, SERIAL, COMPOSITE).Protocol Setup supporting AFHDS 2A internal RF and preparatory support for external CRSF / ELRS transmitter modules..data 1,776B + .bss 604B) out of 16 KB available (>85% SRAM free).| Action | Control | Notes |
|---|---|---|
| Cycle Flight Pages | Tap BIND button | Cycles through Page 1/4 (Gimbals), Page 2/4 (14-CH Monitor), Page 3/4 (Model Dashboard), and Page 4/4 (Telemetry Dashboard) |
| Open Settings Menu | Hold OK for 1.2s | Opens 13 submenus: Model Select, Model Setup, D/R & Expo, Thr Curve, Wing/Mixer, Aux Channels, Ch Reverse, Radio Setup, Protocol Setup, Monitors, Calib, Diag, & Info |
| Rapid Menu / Value Scroll | Hold UP or DOWN | Auto-repeats every 70 ms after 300 ms hold across all menus, character editing, and curve points |
| Direct Calibration (Boot) | Hold OK during Power-On | Launches 2-step calibration wizard immediately on boot |
| Initiate Receiver Binding | Hold BIND (>= 1.0s) | Starts AFHDS 2A binding from any flight page (or hold during power-on) |
| Abort / Cancel Binding | Press Cancel (ESC) | Exits binding mode immediately and restores normal RF |
| Tab / Advance Cursor | OK or BIND in Editors | Advances character cursor in naming editor, point selection in curve editor, and field toggle in Protocol Setup |
| Enter DFU Bootloader (Boot) | Inward Trims + Power ON | Push Roll Left & Yaw Right inward while switching on (Primary hardware recovery/flashing mode) |
| Digital Trims | 4 Trim Rockers | Single click + 90ms auto-repeat with audio pitch scaling |
The stock FlySky FS-i6X features a built-in Micro-USB port wired directly to the microcontroller. Flashing or backing up requires no soldering, no ST-Link probe, and no disassembly:
0483:df11 (STM32 BOOTLOADER in permanent factory ROM).Before flashing any custom firmware, pilots can pull their complete 128 KB on-chip Flash memory (including stock firmware, factory calibration, and existing model data) directly to a file for 100% safe, instant reversion:
# Pull complete 128 KB on-chip Flash to a local backup file:
dfu-util -a 0 -s 0x08000000:131072 -U stock_backup.bin
Flash the compiled release binary via USB DFU:
dfu-util -a 0 -s 0x08000000:leave -D flysky-i6x.bin
Because the hardware DFU bootloader is stored in permanent, read-only system ROM by STMicroelectronics, the transmitter is unbrickable. You can restore your full flash backup at any time:
dfu-util -a 0 -s 0x08000000:leave -D stock_backup.bin
This project was built through a human-directed, AI-assisted development workflow ("vibe-coding" with rigorous physical hardware bench testing). Having previously contributed to OpenI6X, domain knowledge of the FS-i6X hardware, pinouts, and protocol timings was used to direct LLM pair-programming tools to rapidly implement the no_std Rust architecture.
Every subsystem (DMA ADC scanning, A7105 SPI/RF state machine, ST7567 parallel bus LCD, USB HID/CDC descriptors, USART2 CRSF/ELRS engine, and Flash storage) has been deployed and verified on real FlySky FS-i6X hardware. We welcome community code review, contributions, and PRs to continue refining and hardening the codebase!
This project stands on the shoulders of the open-source RC community and owes special gratitude to:
PC9 backlight PWM dimming mod. Without their pioneering work and generous sharing of hardware research, this project would not have been possible.62 commits
Rust
99.9%
A minimalist, clean-slate RC transmitter firmware for the FlySky FS-i6X, written in no_std Rust.
See the codeA minimalist, clean-slate RC transmitter firmware for the FlySky FS-i6X, written in no_std Rust.
Focused on the built-in A7105 2.4 GHz RF transceiver (AFHDS2A protocol), i-BUS telemetry, and the 128×64 LCD interface.
The FS-i6X open-source journey was pioneered by the remarkable work of the OpenI6X project, which successfully brought OpenTX/EdgeTX to this hardware and reverse-engineered the radio architecture.
flysky-i6x-rs explores a complementary design philosophy: an experimental, clean-slate firmware written in bare-metal no_std Rust designed with:
no_std).TIM16 260 Hz packet sync, EXTI2 RF ready) paired with a high-rate decoupled flight pipeline and throttled 30 Hz display loop.| Peripheral | Controller / Spec | MCU Pins & Ports | Notes |
|---|---|---|---|
| MCU | STM32F072VB (Cortex-M0 @ 48 MHz) | ARMv6-M (thumbv6m-none-eabi) | 128 KB Flash, 16 KB SRAM |
| RF Transceiver | Amiccom A7105 2.4 GHz | SPI1 + GPIOs | SPI1 (SCK, MOSI, MISO) |
| Chip Select (CSN) | PE12 (Active Low) | Fast GPIO output | |
| Antenna Switch | PE10 (RF0), PE11 (RF1) | Diversity / TR switch | |
| Packet Ready IRQ | PB2 (EXTI2) | GIO2 line from A7105 (Tx/Rx done) | |
| RF Timer | TIM16 | Periodic packet scheduling (~3.8ms–7.5ms) | |
| Display | ST7567 (128×64 Monochrome LCD) | 8-bit 6800 Parallel Bus | 1024-byte framebuffer in RAM; 30 Hz refresh (~33 ms); Electronic Volume (EV) contrast (15..55) |
| Data Bus (D0..D7) | PE0 .. PE7 | Full-byte ODR write (GPIOE->ODR[7:0]) | |
| Command/Data (RS) | PB3 | Low = Command, High = Data | |
| Reset (RST) | PB4 | Active Low hardware reset | |
| Read/Write (RW) | PB5 | Kept Low for write mode | |
| Chip Select (CS) | PD2 | Active Low (held Low for bus access) | |
| Strobe (RD / E) | PD7 | 6800-series latch strobe (High -> Low pulse) | |
| Backlight (Stock) | PF3 | Active HIGH (drives NPN transistor base) | |
| Backlight (Modded) | PC9 | TIM3_CH4 PWM dimming mod (pioneered by OpenI6X) | |
| Analog Inputs | 12-bit ADC1 via DMA | 11 Channels scanned | Continuous circular DMA1 Ch1 buffer |
| Sticks (RH, RV, LV, LH) | PA0, PA1, PA2, PA3 | Channels 0 (Roll), 1 (Pitch), 2 (Thr), 3 (Yaw) | |
| Potentiometers (VRA, VRB) | PA6, PA7 | Channels 6 (VR1 / Left), 7 (VR2 / Right) | |
| Switches (SA, SB, SC, SD) | PA4, PA5, PB0, PB1 | Channels 4 (2-pos), 5 (3-pos), 8 (3-pos), 9 (2-pos) | |
| Battery Sense | PC0 | Channel 10 (voltage divider: (raw * 100) / 421 + 20) | |
| Digital Keys | 3 Columns × 4 Rows Matrix | Keypad & Trims | Polled at ~50–100 Hz |
| Matrix Columns (R1..R3) | PC6, PC7, PC8 | Driven Low sequentially | |
| Matrix Rows (L1..L4) | PD12, PD13, PD14, PD15 | Inputs with internal pull-ups | |
| Inward Trim Keys | PC6+PD13 & PC7+PD14 | Roll Left (RHL) + Yaw Right (LHR) | |
| Dedicated Bind Key | PF2 | Active Low (pull-up enabled) | |
| Storage | On-chip Flash (Pages 62 & 63) | 0x0801_F000 .. 0x0801_FFFF (4 KB) | 20 models + radio settings (2688 bytes) |
| Telemetry / Serial | UART Interfaces | USART2 (PD5 Tx / PA15 Rx) | External telemetry / i-BUS mirror |
| Audio | Piezo Buzzer | TIM1_CH1 (PA8) | Hardware PWM frequency & tone generator |
flowchart TD
subgraph Core ["FlySky FS-i6X Reactive Architecture (48 MHz)"]
SCHED["Deterministic Hardware Interrupt & Concurrency Model"]
end
subgraph P3 ["Priority 3: Critical RF Sync (TIM16 & EXTI2_3 IRQ)"]
RF1["A7105 State Machine"]
RF2["AFHDS 2A 260 Hz Packet Tx (3.850 ms)"]
RF3["i-BUS Downlink Telemetry Rx"]
end
subgraph P2 ["Priority 2: Autonomous DMA Engine"]
ADC1["Autonomous 11-Ch DMA Scan (0.23 ms)"]
ADC2["Continuous Circular Buffer in SRAM"]
end
subgraph P1 ["Priority 1: Decoupled High-Rate Flight Pipeline (Multi-kHz)"]
FL1["MMA & Deadband Bypass Stick Filter"]
FL2["Dual Rates & Integer Cubic Expo Math"]
FL3["14-Ch Matrix Mixer & Aircraft Templates"]
FL4["Catmull-Rom Spline Throttle Curves"]
FL5["Double-Buffered PENDING_CHANNELS Update (sub-30 µs)"]
end
subgraph P0 ["Priority 0: Throttled UI & Display Loop (30 Hz / ~33 ms)"]
UI1["Keypad & Trim Matrix Scan (90ms Repeat)"]
UI2["Buzzer Tone State Machine (TIM1 PWM)"]
UI3["ST7567 Parallel LCD Framebuffer Render"]
UI4["Non-Volatile Flash Persistence (Pages 62-63)"]
end
SCHED --> P3
SCHED --> P2
SCHED --> P1
SCHED --> P0
cortex-m, cortex-m-rt: Core ARM runtime and interrupt vector tables.stm32f0xx-hal: Embedded HAL implementation for STM32F0 peripherals.embedded-graphics: Monochrome UI primitive rendering, fonts, lines, and bitmaps.embedded-hal: Trait abstractions for SPI, I2C, and GPIO.AFHDS2A distributes transmission across 16 pseudo-random frequencies generated from the transmitter's unique silicon ID:
UID (at 0x1FFFF7AC) -> LCG Random Seed -> 16 Unique Channels (1..164 with min spacing >= 5)
0xBB / 0xBC): Broadcasts TX ID and hopping table to allow receivers (e.g. FS-iA6B) to sync.0x58): 38-byte frame containing up to 14 channels encoded as microsecond pulses (1000–2000 µs).0xAA): Directs receiver output mode (PWM, PPM, i-BUS, or S.BUS).The ST7567 parallel LCD driver maintains a 1024-byte framebuffer in SRAM (128 * 64 / 8). Updating the entire screen takes < 1.2 ms via direct 8-bit GPIO port writes (GPIOE->ODR).
time::millis()) to a steady 30 Hz (~33 ms). This completely decouples graphical drawing from the multi-kHz flight control loop, eliminating servo latency and stutter.15..=55, default 37 / 0x25) in Radio Setup with instant live hardware preview and Flash persistence.[BIND]:
TX/RX), battery voltages (RX/TX), and session extremes (mRSS/mRX).Comprehensive technical documentation is maintained in the docs/ directory:
STM32F072VB and APM32F072VB (UID & DFU mapping).GPIOE (ODR write) + control lines with embedded-graphics.PF3).PC0) to stabilize hundredths digit.SA..SD), rotary pots (VRA, VRB), and battery voltage (PC0).PA0 Roll, PA1 Pitch, PA2 Throttle, PA3 Yaw).PE10/PE11/PE12).TIM16 timer (PSC = 47, ARR = 3849) for exact 3850.0 µs (259.74 Hz) frame sync.[ESC] (Cancel key) and support for one-way receivers (FS-A8S, Fli14).PA8 (TIM1_CH1, 48 MHz / PSC 47) with distinct audio tones.src/menu.rs) navigated via UP, DOWN, OK, and ESC.PC9 (TIM3_CH4, 1 kHz PWM) supporting the popular backlight hardware mod while keeping stock PF3 supported.1000..2000 µs).Diag Anas) split into 2 graphic pages with 40px fill bars matching Channel Monitor.M01..M20), each allocated an exact 128-byte profile.0x0801_F000..0x0801_FFFF, 4 KB) with automatic legacy migration.rx_id per model profile with dynamic RF switching on model change.Pts: 1..5 vs Pts: 1..9) in throttle curve editor.Radio Setup (4.0V–5.0V), flashing status bar display, and periodic audio alarm.Dual Rate/Expo, Wing/Mixer (with mix line editor), and Aux Channels.src/time.rs).diff >= 6) for instantaneous step-response.__aeabi_ldivmod) across all mixing and expo math.RadioStorage::sanitize) enforcing valid operating limits.STANDBY before loading payload, preventing FIFO pointer corruption.RF_MODE_OFF).src/storage.rs.PA11 / PA12 with internal 1.5 kΩ pull-up resistor.ndjson) telemetry at 20 Hz and interactive CLI commands (help, status, channels, telem, reboot).Radio Setup (SE0 disconnect pulse + hardware APB1 reset without requiring reboot). Default mode: OFF.U:SIM status indicator.USB Mode setting in Radio Setup (OFF, JOYSTICK, SERIAL, COMPOSITE).Protocol Setup supporting AFHDS 2A internal RF and preparatory support for external CRSF / ELRS transmitter modules..data 1,776B + .bss 604B) out of 16 KB available (>85% SRAM free).| Action | Control | Notes |
|---|---|---|
| Cycle Flight Pages | Tap BIND button | Cycles through Page 1/4 (Gimbals), Page 2/4 (14-CH Monitor), Page 3/4 (Model Dashboard), and Page 4/4 (Telemetry Dashboard) |
| Open Settings Menu | Hold OK for 1.2s | Opens 13 submenus: Model Select, Model Setup, D/R & Expo, Thr Curve, Wing/Mixer, Aux Channels, Ch Reverse, Radio Setup, Protocol Setup, Monitors, Calib, Diag, & Info |
| Rapid Menu / Value Scroll | Hold UP or DOWN | Auto-repeats every 70 ms after 300 ms hold across all menus, character editing, and curve points |
| Direct Calibration (Boot) | Hold OK during Power-On | Launches 2-step calibration wizard immediately on boot |
| Initiate Receiver Binding | Hold BIND (>= 1.0s) | Starts AFHDS 2A binding from any flight page (or hold during power-on) |
| Abort / Cancel Binding | Press Cancel (ESC) | Exits binding mode immediately and restores normal RF |
| Tab / Advance Cursor | OK or BIND in Editors | Advances character cursor in naming editor, point selection in curve editor, and field toggle in Protocol Setup |
| Enter DFU Bootloader (Boot) | Inward Trims + Power ON | Push Roll Left & Yaw Right inward while switching on (Primary hardware recovery/flashing mode) |
| Digital Trims | 4 Trim Rockers | Single click + 90ms auto-repeat with audio pitch scaling |
The stock FlySky FS-i6X features a built-in Micro-USB port wired directly to the microcontroller. Flashing or backing up requires no soldering, no ST-Link probe, and no disassembly:
0483:df11 (STM32 BOOTLOADER in permanent factory ROM).Before flashing any custom firmware, pilots can pull their complete 128 KB on-chip Flash memory (including stock firmware, factory calibration, and existing model data) directly to a file for 100% safe, instant reversion:
# Pull complete 128 KB on-chip Flash to a local backup file:
dfu-util -a 0 -s 0x08000000:131072 -U stock_backup.bin
Flash the compiled release binary via USB DFU:
dfu-util -a 0 -s 0x08000000:leave -D flysky-i6x.bin
Because the hardware DFU bootloader is stored in permanent, read-only system ROM by STMicroelectronics, the transmitter is unbrickable. You can restore your full flash backup at any time:
dfu-util -a 0 -s 0x08000000:leave -D stock_backup.bin
This project was built through a human-directed, AI-assisted development workflow ("vibe-coding" with rigorous physical hardware bench testing). Having previously contributed to OpenI6X, domain knowledge of the FS-i6X hardware, pinouts, and protocol timings was used to direct LLM pair-programming tools to rapidly implement the no_std Rust architecture.
Every subsystem (DMA ADC scanning, A7105 SPI/RF state machine, ST7567 parallel bus LCD, USB HID/CDC descriptors, USART2 CRSF/ELRS engine, and Flash storage) has been deployed and verified on real FlySky FS-i6X hardware. We welcome community code review, contributions, and PRs to continue refining and hardening the codebase!
This project stands on the shoulders of the open-source RC community and owes special gratitude to:
PC9 backlight PWM dimming mod. Without their pioneering work and generous sharing of hardware research, this project would not have been possible.62 commits
Rust
99.9%