{"id":48156414,"url":"https://github.com/fuchskurt/keychron_q1_pro_rmk","last_synced_at":"2026-04-04T17:18:11.679Z","repository":{"id":331961607,"uuid":"1131617772","full_name":"fuchskurt/keychron_q1_pro_rmk","owner":"fuchskurt","description":"Custom RMK firmware for the Keychron Q1 Pro ISO in Rust","archived":false,"fork":false,"pushed_at":"2026-03-31T15:39:03.000Z","size":170,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-03-31T17:31:07.009Z","etag":null,"topics":["embassy","firmware","keyboard","keychron","rmk","rust","stm32"],"latest_commit_sha":null,"homepage":"https://fuchskurt.github.io/keychron_q1_pro_rmk/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fuchskurt.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-APACHE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-01-10T11:19:58.000Z","updated_at":"2026-03-31T15:39:07.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/fuchskurt/keychron_q1_pro_rmk","commit_stats":null,"previous_names":["fuchskurt/keychron_q1_pro_rmk"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/fuchskurt/keychron_q1_pro_rmk","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuchskurt%2Fkeychron_q1_pro_rmk","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuchskurt%2Fkeychron_q1_pro_rmk/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuchskurt%2Fkeychron_q1_pro_rmk/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuchskurt%2Fkeychron_q1_pro_rmk/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fuchskurt","download_url":"https://codeload.github.com/fuchskurt/keychron_q1_pro_rmk/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fuchskurt%2Fkeychron_q1_pro_rmk/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31407644,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T10:20:44.708Z","status":"ssl_error","status_checked_at":"2026-04-04T10:20:06.846Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["embassy","firmware","keyboard","keychron","rmk","rust","stm32"],"created_at":"2026-04-04T17:18:11.048Z","updated_at":"2026-04-04T17:18:11.661Z","avatar_url":"https://github.com/fuchskurt.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Keychron Q1 Pro ISO — RMK Firmware\n\n[![Docs](https://img.shields.io/badge/docs-latest-blue?style=flat-square)](https://fuchskurt.github.io/keychron_q1_pro_rmk/rmk_q1_pro_iso/)\n[![Release](https://img.shields.io/github/v/release/fuchskurt/keychron_q1_pro_rmk?style=flat-square)](https://github.com/fuchskurt/keychron_q1_pro_rmk/releases)\n[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue?style=flat-square)](#license)\n\n![Keychron Q1 Pro](https://cdn.shopify.com/s/files/1/0059/0630/1017/t/5/assets/keychronq1proqmkviacustommechanicalkeyboard--edited-1669962623486.jpg)\n\nCustom firmware for the Keychron Q1 Pro ISO, written in Rust using the\n[RMK](https://github.com/HaoboGu/rmk) keyboard framework and\n[Embassy](https://embassy.dev) async runtime. Replaces the stock QMK firmware\nwith a fully open, Rust-native implementation that retains Vial compatibility\nfor keymap editing.\n\n|                         |                                                                                                                                                                       |\n|-------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| **Keyboard Maintainer** | [Kurt Fuchs](https://github.com/fuchskurt)                                                                                                                            |\n| **Hardware**            | Keychron Q1 Pro ISO                                                                                                                                                   |\n| **MCU**                 | STM32L432KB (Cortex-M4F, 80 MHz, 128K Flash, 64K RAM)                                                                                                                 |\n| **Availability**        | [Keychron Q1 Pro QMK/VIA Wireless Custom Mechanical Keyboard](https://www.keychron.com/products/keychron-q1-pro-qmk-custom-mechanical-keyboard-iso-layout-collection) |\n\n---\n\n## Table of Contents\n\n- [How it works](#how-it-works)\n- [Building](#building)\n- [Flashing](#flashing)\n- [Keymap editing](#keymap-editing)\n- [Project structure](#project-structure)\n- [License](#license)\n\n---\n\n## How it works\n\n### Matrix scanning\n\nThe Q1 Pro uses a standard mechanical switch matrix. Column selection is driven\nby a 74HC595 shift register clocked via GPIO bit-bang, with 6 row inputs read\nas active-low GPIO EXTI pins. For each column the firmware:\n\n1. Shifts out a 16-bit mask via the HC595, driving the selected column low\n2. Waits a short settle delay for the signal lines to stabilise\n3. Reads all 6 row pins\n4. Passes each reading through a debouncer before emitting a key event\n\n### Debouncing\n\nKey state transitions are filtered through RMK's built-in `DefaultDebouncer`\nbefore a `KeyboardEvent` is emitted. Scanning resumes from the last recorded\nposition after an event is returned, so no transitions are missed while the\nevent is being processed upstream.\n\n### Backlight\n\nRGB backlighting is driven by two CKLED2001 LED driver chips over I²C, each\ncontrolling half the keyboard. The firmware applies gamma 2.2 correction and\nbrightness scaling to all LED writes. The Caps Lock indicator is driven as a\ndistinct colour via an async channel from the key event processor to the\nbacklight task.\n\n### Layers and input devices\n\nThe firmware supports two layers (Mac and Windows base layers) switchable via\na physical panel toggle switch. A rotary encoder provides volume control. Both\nuse async edge-interrupt input with debouncing.\n\n---\n\n## Building\n\nRequires a nightly Rust toolchain and the `thumbv7em-none-eabihf` target.\n\n```sh\nrustup toolchain install nightly\nrustup target add thumbv7em-none-eabihf\nrustup component add rust-src\ncargo install flip-link\n```\n\nBuild the firmware:\n\n```sh\ncargo build --release\n```\n\nProduce a `.bin` artifact:\n\n```sh\ncargo make objcopy\n```\n\n---\n\n## Flashing\n\n### DFU (recommended)\n\nPut the keyboard into DFU mode by holding the reset button, then:\n\n```sh\ndfu-util -l  # note the serial number\ndfu-util -a 0 -s 0x08000000:mass-erase:force:leave \\\n  -D rmk.bin \\\n  -S \u003cSerialNumber\u003e\n```\n\n### probe-rs (debug probe)\n\n```sh\nprobe-rs run --chip STM32L432KB target/thumbv7em-none-eabihf/release/rmk-q1_pro\n```\n\n---\n\n## Keymap editing\n\nThe firmware is Vial-compatible. Download [Vial](https://get.vial.today) and\nconnect the keyboard to remap keys and configure behaviour without reflashing.\n\n---\n\n## Project structure\n\n```\nsrc/\n├── main.rs                        # Entry point, peripheral init, task startup\n├── keymap.rs                      # Default keymap and encoder map\n├── vial.rs                        # Generated Vial keyboard definition\n├── matrix/\n│   ├── hc595_cols.rs              # 74HC595 shift register column driver\n│   ├── shiftreg_matrix.rs         # Shift register matrix scanner\n│   └── layer_toggle.rs            # Physical layer toggle switch\n├── backlight/\n│   ├── init.rs                    # Backlight task and soft-start ramp\n│   ├── gamma_correction.rs        # Gamma 2.2 LUT\n│   ├── lock_indicator.rs          # Caps lock indicator processor\n│   └── mapping/\n│       └── iso_knob.rs            # LED index to CKLED channel mapping\n└── ckled2001/\n    ├── driver.rs                  # CKLED2001 I²C driver\n    ├── led_address.rs             # LED channel address constants\n    └── registers.rs               # CKLED2001 register definitions\n```\n\n---\n\n## License\n\nLicensed under either of [MIT](LICENSE-MIT) or [Apache 2.0](LICENSE-APACHE) at your option.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuchskurt%2Fkeychron_q1_pro_rmk","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffuchskurt%2Fkeychron_q1_pro_rmk","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffuchskurt%2Fkeychron_q1_pro_rmk/lists"}