1
0

Compare commits

..

257 Commits

Author SHA1 Message Date
Nick Brassel
76cf8dff93 Branch point for 2025-05-25 Breaking Change 2025-05-26 21:43:45 +10:00
Nick Brassel
75a037d2f0 Merge remote-tracking branch 'upstream/develop' 2025-05-26 21:41:49 +10:00
Joel Challis
3703699757 2025 Q2 changelog (#25297)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2025-05-26 21:04:52 +10:00
Joel Challis
c97a798af7 Configure boards to use development_board - T (#25294) 2025-05-24 21:20:16 +01:00
Joel Challis
dd871d0105 Configure boards to use development_board - S (#25293) 2025-05-24 21:19:52 +01:00
Joel Challis
ba5c707327 salicylic_acid3/getta25 - Fix oled keymap (#25295) 2025-05-24 19:04:01 +01:00
Joel Challis
8b7c351e56 [Docs] Fix tap_hold code blocks (#25298) 2025-05-24 19:00:22 +01:00
Joel Challis
196285c59c Configure boards to use development_board - UVWXYZ (#25288) 2025-05-23 01:27:00 +01:00
Stefan Kerkmann
f3b974f216 [Fix] lib8tion: enable fixed scale8 and blend functions (#25272)
lib8tion: enable fixed scale8 and blend functions

These FastLED derived lib8tion functions have been fixed and enabled by
default in FastLED. QMK just never set these defines, there is no reason
to keep the buggy implementation. It is assumed that nobody relied on
the buggy behavior.
2025-05-22 22:52:45 +01:00
Joel Challis
243c21568a Configure boards to use development_board - 0-9 (#25287) 2025-05-22 20:49:22 +01:00
Pablo Martínez
955809bd5a Add compiler_support.h (#25274) 2025-05-22 23:31:15 +10:00
Nick Brassel
fa24b0fcce Remove outdated nix support due to bit-rot. (#25280) 2025-05-21 07:17:58 +10:00
Stefan Kerkmann
4f0a0f32f2 [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides (#25271) 2025-05-20 19:23:20 +01:00
ivan
24895c46f3 Move rookiebwoy to ivndbt (#25142) 2025-05-19 22:15:19 +01:00
QMK Bot
190e0eff23 Merge remote-tracking branch 'origin/master' into develop 2025-05-19 20:53:40 +00:00
ClownFish
28720c4d34 add doio/kb03 (#24815)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2025-05-19 13:53:02 -07:00
Nick Brassel
919e2a4f5c Use relative paths for schemas, instead of $id. Enables VScode validation. (#25251) 2025-05-19 22:10:39 +10:00
Stefan Kerkmann
f686ad9e63 [Core] STM32G0x1 support (#24301) 2025-05-19 15:51:28 +10:00
Nick Brassel
a4ef1ae736 gcc15 AVR compilation fixes (#25238) 2025-05-19 09:22:31 +10:00
Florent Linguenheld
81355045cc Chew folders (#24785) 2025-05-18 18:53:00 +01:00
QMK Bot
bcd06f03a5 Merge remote-tracking branch 'origin/master' into develop 2025-05-18 15:43:21 +00:00
Joel Challis
02517bd806 Update PR checklist notes on custom matrix (#25240) 2025-05-18 16:42:43 +01:00
QMK Bot
6b25bfb0ff Merge remote-tracking branch 'origin/master' into develop 2025-05-18 15:29:20 +00:00
Joel Challis
0f948fe039 Add Waveshare RP2040-Keyboard-3 support (#25269) 2025-05-18 16:28:42 +01:00
QMK Bot
fffa553c25 Merge remote-tracking branch 'origin/master' into develop 2025-05-18 03:29:00 +00:00
Infos
e73b3c08a0 Add Zeropad (#24737)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2025-05-17 20:28:24 -07:00
Joel Challis
fa35be5135 Resolve miscellaneous keyboard lint warnings (#25268) 2025-05-16 17:35:17 +01:00
Joel Challis
0b6a460b7f Remove duplicate of SPI default config from keyboards (#25266) 2025-05-16 17:35:05 +01:00
QMK Bot
15e45b1d4b Merge remote-tracking branch 'origin/master' into develop 2025-05-16 16:09:52 +00:00
Danny
40d0de39b7 Add BDN9 Rev. 3 (#25261) 2025-05-16 12:08:51 -04:00
Joel Challis
05ff5443b1 Deprecate usb.force_nkro/FORCE_NKRO (#25262) 2025-05-14 22:02:43 +10:00
QMK Bot
e553cf7214 Merge remote-tracking branch 'origin/master' into develop 2025-05-14 12:01:11 +00:00
Joel Challis
cd95294a25 Remove more USB only branches from NKRO handling (#25263) 2025-05-14 22:01:08 +10:00
Joel Challis
8c108efb0d dlip/haritev2 - Post merge fixes (#25264) 2025-05-14 22:00:33 +10:00
QMK Bot
b4f0314b35 Merge remote-tracking branch 'origin/master' into develop 2025-05-14 10:13:34 +00:00
Dane Lipscombe
59c3612590 Add Harite v2 keyboard (#24975) 2025-05-14 11:12:59 +01:00
QMK Bot
55e4a1c7dc Merge remote-tracking branch 'origin/master' into develop 2025-05-14 03:23:53 +00:00
Wasteland Fluttershy
e0b037c2cd Fixes the numlock indicator for Magic Force MF17 numpad (#25260) 2025-05-13 20:23:16 -07:00
Matti Hiljanen
070dea4a9c Fix OS_DETECTION_KEYBOARD_RESET (#25015)
Co-authored-by: Nick Brassel <nick@tzarc.org>
2025-05-12 12:15:40 +10:00
Pascal Getreuer
f4171412a6 Enable community modules to define LED matrix and RGB matrix effects. (#25187)
Co-authored-by: Joel Challis <git@zvecr.com>
2025-05-12 09:30:19 +10:00
art-was-here
7f42a5bc03 [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" (#25203) 2025-05-12 08:50:36 +10:00
Joel Challis
3e7ce54902 Fix Wear Leveling compilation (#25254) 2025-05-12 08:39:38 +10:00
Joel Challis
88c094908b Add raw_hid support to host driver (#25255) 2025-05-12 08:38:48 +10:00
QMK Bot
c045c3e00c Merge remote-tracking branch 'origin/master' into develop 2025-05-11 05:58:16 +00:00
cyxae
6b1a376aee [Keyboard] Add Jason Hazel’s Bad Wings v2 (#25252)
Co-authored-by: Florent Allard <florent.allard@savoirfairelinux.com>
2025-05-10 22:57:40 -07:00
HorrorTroll
02525f683e Allow LVGL onekey keymap to be able compile for other board (#25005) 2025-05-10 19:26:50 +01:00
Drashna Jaelre
5a57d2115b [Docs] Fix typos introduced by PR #25050 (#25250)
It isn't a drashna PR if there aren't some typos in it somewhere.
2025-05-09 07:18:30 +10:00
Joel Challis
660d248549 Add debounce to duplicated defaults check (#25246) 2025-05-08 01:12:58 +01:00
QMK Bot
1bc3494494 Merge remote-tracking branch 'origin/master' into develop 2025-05-07 17:38:45 +00:00
muge
33a12ca0b6 CXT Studio 12E3: Fix encoder resolutions not applying (#25242)
* add resolution to encoders so they apply

* Tweak default keymap

* replace KC_UNDO with C(KC_Z) as well
2025-05-07 11:38:10 -06:00
QMK Bot
084ed078d6 Merge remote-tracking branch 'origin/master' into develop 2025-05-07 14:42:14 +00:00
Nathan Cain
32204095e5 Docs update for installing qmk with uv (#24995) 2025-05-07 15:41:37 +01:00
QMK Bot
b76bf29d25 Merge remote-tracking branch 'origin/master' into develop 2025-05-07 14:39:04 +00:00
VeyPatch
396fb4dde7 Fix Aurora sweep default keymap configuration (#25148) 2025-05-07 15:38:29 +01:00
QMK Bot
4836fcf831 Merge remote-tracking branch 'origin/master' into develop 2025-05-07 07:09:37 +00:00
dabstractor
1becbaefbe Fixed print statement after enabling 32-bit layers (#25027) 2025-05-07 00:09:01 -07:00
QMK Bot
e3c613c79c Merge remote-tracking branch 'origin/master' into develop 2025-05-06 06:23:47 +00:00
Duncan Sutherland
04fbcdc68d Layout corrections: Zed60 (#25003) 2025-05-05 23:23:10 -07:00
Drashna Jaelre
55909141ef [Keyboard] Update Tractyl Manuform and add F405 (weact) variant (#24764) 2025-05-05 23:19:38 -07:00
QMK Bot
cd6e065f6e Merge remote-tracking branch 'origin/master' into develop 2025-05-06 06:04:11 +00:00
Silvino R.
bb2b7ce7e4 [Keyboard] Add Binepad KnobX1 (#25222)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-05-05 23:03:30 -07:00
QMK Bot
2fbc222bb0 Merge remote-tracking branch 'origin/master' into develop 2025-05-06 05:56:06 +00:00
yiancar
a1469abc8d Keycult 60 (#25213)
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: jack <jack@pngu.org>
2025-05-05 22:55:31 -07:00
Joel Challis
ab1332bb6c Remove force disable of NKRO when Bluetooth enabled (#25201) 2025-05-06 06:47:44 +01:00
Nick Brassel
ac991405d0 Deprecate qmk generate-compilation-database. (#25237) 2025-05-06 09:52:41 +10:00
Joel Challis
842c840145 Bind Bluetooth driver to host_driver_t (#25199) 2025-05-05 04:05:04 +01:00
Joel Challis
614b631ee2 Ensure qmk_userspace_paths maintains detected order (#25204) 2025-05-05 03:43:14 +01:00
Joel Challis
5611a40064 Add battery changed callbacks (#25207) 2025-05-05 03:28:33 +01:00
QMK Bot
11c8b2841e Merge remote-tracking branch 'origin/master' into develop 2025-05-05 01:46:48 +00:00
Silvino R.
0c0d038a40 [Keyboard] Add Binepad KN01 (#25224)
* Add Binepad NeoKnob KN01

* post @waffle87 recommendations
2025-05-04 19:46:11 -06:00
Joel Challis
5f31d5cc80 Resolve alias for qmk new-keymap keyboard prompts (#25210) 2025-05-05 11:14:40 +10:00
Joel Challis
dbe30a1b6f Generate versions to keycode headers (#25219) 2025-05-05 10:44:08 +10:00
QMK Bot
a992e32bd5 Merge remote-tracking branch 'origin/master' into develop 2025-05-05 00:23:26 +00:00
Joel Challis
cf5ce64b1b Workaround for resolving keyboard alias for config file values (#25228) 2025-05-05 10:22:51 +10:00
Drashna Jaelre
12caf0be4e Add additional hooks for Community modules (#25050) 2025-05-05 10:21:47 +10:00
Nick Brassel
bb9dd05c6a [Bug] Minimise force-included files (#25194) 2025-05-05 10:07:53 +10:00
QMK Bot
59f607b963 Merge remote-tracking branch 'origin/master' into develop 2025-05-02 01:53:11 +00:00
Christopher Hoage
60ac859852 Fix Spleeb compile when pointing device is enabled (#25016) 2025-05-01 18:52:36 -07:00
Joel Challis
4fb3cf0712 Remove redundant keyboard headers (#25208) 2025-05-01 15:02:17 +01:00
QMK Bot
e98c41c02f Merge remote-tracking branch 'origin/master' into develop 2025-04-30 18:09:14 +00:00
takashicompany
45091b0473 [Keyboard] Add Gravity-45(#25206)
* add gravity-45

* readme.md

* fix readme

* Update keyboards/green_keys/gravity_45/keyboard.json

Co-authored-by: jack <0x6a73@protonmail.com>

* run qmk format-json -i keyboards/green_keys/gravity_45/keyboard.json

* add url

* Update keyboards/green_keys/gravity_45/keyboard.json

Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>

* Update keyboard.json

* Update keyboard.json

* Update keyboards/green_keys/gravity_45/keyboard.json

Co-authored-by: Drashna Jaelre <drashna@live.com>

---------

Co-authored-by: jack <0x6a73@protonmail.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-30 12:08:37 -06:00
Joel Challis
3cf328c644 amptrics/0422 - Prevent OOB in update_leds_for_layer (#25209) 2025-04-28 14:37:50 -07:00
Pascal Getreuer
c26449e64f [Core] Enhance Flow Tap to work better for rolls over multiple tap-hold keys. (#25200)
* Flow Tap revision for rolling press.

* Remove debugging cruft.

* Formatting fix.
2025-04-28 09:52:20 +02:00
zvecr
7fa65aa877 Merge remote-tracking branch 'origin/master' into develop 2025-04-28 07:24:00 +01:00
vchowl
4e2191ce20 Amptrics 0420 keyboard addition (#24744)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2025-04-27 23:08:13 -07:00
josephawilliamsiv
3de04e0386 Add Umbra keyboard (#24569)
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-27 23:02:30 -07:00
Cipulot
2e648d7e48 Addition of OK-1 (#24646)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-27 22:55:51 -07:00
hen-des
1fd0139b91 Added new keyboard epssp75 (#24756)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-27 22:28:22 -07:00
mizma
3478ae5795 [Keyboard] mzmkb/slimdash/rev1 (#24804)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2025-04-27 22:26:47 -07:00
VeyPatch
01354fffb4 [Keyboard] Add splitkb.com's Halcyon Elora rev2 (#24790)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-27 22:25:09 -07:00
Jeremy Cook
92c4f0095d Add jcpm2 (JC Pro Macro 2) (#24816)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2025-04-27 21:03:50 -07:00
LucasMateijsen
ac8b914a11 Add handwired 4x14 LuMaWing keyboard (#24885) 2025-04-27 20:58:47 -07:00
Matheus Marques
de598ac8f0 [Keymap] Sofle RGB - fixed stuck on numpad layer and layout comments (#24942) 2025-04-27 11:42:11 -07:00
QMK Bot
142952cac8 Merge remote-tracking branch 'origin/master' into develop 2025-04-27 18:19:53 +00:00
takashicompany
a07360e0f1 Add new keyboard MirageiX (#25054)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: jack <0x6a73@protonmail.com>
2025-04-27 11:19:19 -07:00
QMK Bot
1fc7066713 Merge remote-tracking branch 'origin/master' into develop 2025-04-26 00:40:58 +00:00
Michał Kopeć
ca425971d5 keyboards/annepro2/ld: Add per-variant linker scripts (#24999)
C18 has an MCU with 16K SRAM, up from C15's 8K.

Split the linker script into C15 and C18 variants to make use of the
larger RAM capacity of C18.
2025-04-26 01:40:17 +01:00
QMK Bot
dffa59dca5 Merge remote-tracking branch 'origin/master' into develop 2025-04-26 00:32:07 +00:00
Aidan Gauland
3319474c5c Add Lemokey X0 keyboard (#24994) 2025-04-26 01:31:25 +01:00
QMK Bot
802e2f54c6 Merge remote-tracking branch 'origin/master' into develop 2025-04-26 00:29:24 +00:00
Álvaro A. Volpato
12d70ab1a4 First TypeK support (#22876) 2025-04-26 01:28:49 +01:00
Joel Beckmeyer
4ae24004b7 modelh: add prerequisites for via support (#24932) 2025-04-24 13:04:30 -07:00
Joel Challis
8244659b44 Extend lint checks to reject duplication of defaults (#25149) 2025-04-24 05:39:56 +01:00
Joel Challis
0bd02952ea Remove "command":false from keyboards (#25193) 2025-04-24 10:28:13 +10:00
jack
5ea7283159 Fix boardsource/beiwagon RGB Matrix coordinates (#25018) 2025-04-23 04:06:17 +01:00
QMK Bot
acedfc3fcb Merge remote-tracking branch 'origin/master' into develop 2025-04-23 02:26:26 +00:00
dependabot[bot]
e5466df800 Bump vite from 5.4.15 to 5.4.18 in /builddefs/docsgen (#25192)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-04-23 12:25:47 +10:00
Joel Challis
ce1801aeda Align new-keyboard template to current standards (#25191) 2025-04-23 12:14:11 +10:00
Joel Challis
11cb5cf347 Remove more duplication of defaults (#25189) 2025-04-23 12:11:28 +10:00
QMK Bot
24d896ca06 Merge remote-tracking branch 'origin/master' into develop 2025-04-23 02:10:54 +00:00
Joel Challis
da2e897f55 Update 'qmk generate-api' to only publish pure DD keymaps (#24782) 2025-04-23 12:10:14 +10:00
Joel Challis
07684bcc99 Remove "console":false from keyboards (#25190) 2025-04-23 12:09:56 +10:00
QMK Bot
847bef3177 Merge remote-tracking branch 'origin/master' into develop 2025-04-23 02:03:39 +00:00
Joel Challis
c6a93b5a56 Bump rlespinasse/github-slug-action from 3 to 5 (#25021) 2025-04-23 12:03:02 +10:00
Joel Challis
8cd71917ce Avoid duplication in generated community modules rules.mk (#25135) 2025-04-23 10:27:47 +10:00
eynsai
7a2cd0fa96 High resolution scrolling (without feature report parsing) (#24423)
* hires scrolling without feature report parsing

* fix valid range for exponent

* fix incorrect minimum exponent value documentation
2025-04-23 00:04:31 +02:00
Joel Challis
83818d1d6f Prompt for converter when creating new keymap (#25116) 2025-04-22 17:59:16 +01:00
Joel Challis
960c4969a5 Remove empty url fields (#25181) 2025-04-22 17:59:00 +01:00
Pascal Getreuer
73e2ef486a [Bug][Core] Fix for Flow Tap: fix handling of distinct taps and timer updates. (#25175)
* Flow Tap bug fix.

As reported by @amarz45 and @mwpardue, there is a bug where if two
tap-hold keys are pressed in distinct taps back to back, then Flow Tap
is not applied on the second tap-hold key, but it should be.

In a related bug reported by @NikGovorov, if a tap-hold key is held
followed by a tap of a tap-hold key, then Flow Tap updates its timer on
the release of the held tap-hold key, but it should be ignored.

The problem common to both these bugs is that I incorrectly assumed
`tapping_key` is cleared to noevent once it is released, when actually
`tapping_key` is still maintained for `TAPPING_TERM` ms after release
(for Quick Tap). This commit fixes that. Thanks to @amarz45, @mwpardue,
and @NikGovorov for reporting!

Details:

* Logic for converting the current tap-hold event to a tap is extracted
  to `flow_tap_key_if_within_term()`, which is now invoked also in the
  post-release "interfered with other tap key" case. This fixes the
  distinct taps bug.

* The Flow Tap timer is now updated at the beginning of each call to
  `process_record()`, provided that there is no unsettled tap-hold key
  at that time and that the record is not for a mod or layer switch key.
  By moving this update logic to `process_record()`, it is conceptually
  simpler and more robust.

* Unit tests extended to cover the reported scenarios.

* Fix formatting.

* Revision to fix @NikGovorov's scenario.

The issue is that when another key is pressed while a layer-tap hasn't
been settled yet, the `prev_keycode` remembers the keycode from before
the layer switched. This can then enable Flow Tap for the following key
when it shouldn't, or vice versa.

Thanks to @NikGovorov for reporting!

This commit revises Flow Tap in the following ways:

* The previous key and timer are both updated from `process_record()`.
  This is slightly later in the sequence of processing than before, and
  by this point, a just-settled layer-tap should have taken effect so
  that the keycode from the correct layer is remembered.

* The Flow Tap previous key and timer are updated now also on key
  release events, except for releases of modifiers and held layer
  switches.

* The Flow Tap previous key and timer are now updated together, for
  simplicity. This makes the logic easier to think about.

* A few additional unit tests, including @NikGovorov's scenario as
  "layer_tap_ignored_with_disabled_key_complex."
2025-04-22 09:59:49 +02:00
Joel Challis
b5f8f4d6a2 Align ChibiOS USB_WAIT_FOR_ENUMERATION implementation (#25184) 2025-04-22 14:31:42 +10:00
QMK Bot
0c4124c1c0 Merge remote-tracking branch 'origin/master' into develop 2025-04-22 04:15:10 +00:00
Nick Brassel
9f04023d35 Decrease firmware size for anavi/macropad8. (#25185)
Preparation for bootstrapper.
2025-04-22 14:14:28 +10:00
QMK Bot
43e3831df9 Merge remote-tracking branch 'origin/master' into develop 2025-04-21 23:56:44 +00:00
CJ Pais
ebfa3cdd5c Add handwired/footy (#25151)
Co-authored-by: jack <jack@pngu.org>
2025-04-21 16:56:10 -07:00
Joel Challis
c7cb7ba976 Implement connection keycode logic (#25176) 2025-04-21 22:27:56 +01:00
Joel Challis
ec324af22e Add lint warning for empty url (#25182) 2025-04-21 20:07:05 +01:00
Eric Molitor
2c54ff3e63 Update develop branch to Pico SDK 1.5.1 (#25178) 2025-04-21 15:05:22 +01:00
QMK Bot
402b5ba6d7 Merge remote-tracking branch 'origin/master' into develop 2025-04-21 14:03:22 +00:00
Nick Brassel
53f1f3b6d7 Fix for .clangd. (#25180) 2025-04-22 00:02:47 +10:00
QMK Bot
b779c5f567 Merge remote-tracking branch 'origin/master' into develop 2025-04-20 09:42:05 +00:00
Jan Bláha
a1cb822861 DOCS: qmk-hid missing in bootloaders list? (#25177) 2025-04-20 19:41:30 +10:00
Nick Brassel
a4aabea511 Fixup eeconfig lighting reset. (#25166) 2025-04-19 23:10:33 +01:00
QMK Bot
c8763c9fdb Merge remote-tracking branch 'origin/master' into develop 2025-04-19 22:10:27 +00:00
Joel Challis
edf34315af Fix 'Would you like to clone the submodules?' prompt under msys (#24958) 2025-04-20 08:09:54 +10:00
Joel Challis
ce8b8414d9 Remove bluefruit_le_read_battery_voltage function (#25129) 2025-04-19 22:52:25 +01:00
Less/Rikki
7e68cfc6fa [keyboard] ymdk/id75/rp2040 (#25157)
Co-authored-by: tao heihei <>
2025-04-19 13:11:08 -07:00
Nick Brassel
5c39722ab9 Allow for disabling EEPROM subsystem entirely. (#25173) 2025-04-19 20:20:00 +01:00
Pascal Getreuer
ea85ace4a9 Ignore the Layer Lock key in Repeat Key and Caps Word. (#25171) 2025-04-19 11:57:00 -07:00
Joel Challis
88453acc6a Remove duplication of RGBLight defaults (#25169) 2025-04-19 11:56:45 -07:00
QMK Bot
988d81581d Merge remote-tracking branch 'origin/master' into develop 2025-04-18 09:05:59 +00:00
lsh4711
800bc78d26 Fix missing and extra commas in JSON schema (#25057) 2025-04-18 19:05:25 +10:00
Joel Challis
b43fc33be3 Remove duplication of RGB Matrix defaults (#25146)
* Remove duplication of RGB Matrix defaults

* Remove more duplication of defaults

* fix
2025-04-17 20:59:59 -06:00
QMK Bot
d33aa82c51 Merge remote-tracking branch 'origin/master' into develop 2025-04-17 18:51:15 +00:00
JamesWilson1996
576325e2f4 [Keyboard] Add voidhhkb-hotswap (#25007)
* Added files for voidhhkb-hotswap

* Updated keyboard name to resolve build errors

* Implement suggestions from PR. Use 60_hhkb community layout.

* Update keyboards/void/voidhhkb_hotswap/readme.md

Co-authored-by: Ryan <fauxpark@gmail.com>

* Apply suggestions from code review

Co-authored-by: jack <jack@pngu.org>

---------

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: jack <jack@pngu.org>
2025-04-17 12:50:41 -06:00
QMK Bot
642c169bc3 Merge remote-tracking branch 'origin/master' into develop 2025-04-17 16:24:18 +00:00
ClownFish
7641359240 [Docs] Unify lighting step descriptions (#25167)
unify lighting step descriptions and defaults across docs
2025-04-17 10:23:16 -06:00
QMK Bot
944a206d1f Merge remote-tracking branch 'origin/master' into develop 2025-04-17 02:41:54 +00:00
Nick Brassel
e83b709169 [Keyboard] Kobold r1 (#25161)
* Kobold r1

* Apply suggestions from code review

Co-authored-by: jack <jack@pngu.org>

* `board_init` => `early_hardware_init_post`.

---------

Co-authored-by: jack <jack@pngu.org>
2025-04-16 20:41:20 -06:00
QMK Bot
00f07ec343 Merge remote-tracking branch 'origin/master' into develop 2025-04-14 17:28:26 +00:00
Daniel Reisch
80612c8ec0 Added Keyboard LumPy27 (#24967)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-14 10:27:52 -07:00
jack
32b9d33bbb Remove Sofle rgb_default keymap & tidy readme's (#25010) 2025-04-14 09:58:14 -07:00
QMK Bot
9208fb5adb Merge remote-tracking branch 'origin/master' into develop 2025-04-14 16:54:03 +00:00
Andrew Kannan
af141d1a5c Add Link keyboard (#25058)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-04-14 09:52:51 -07:00
Pascal Getreuer
8d8dcb089e [Core] Flow Tap tap-hold option to disable HRMs during fast typing (#25125)
aka Global Quick Tap, Require Prior Idle
2025-04-14 09:46:24 -07:00
Stefan Kerkmann
a7bf8e64a5 [chore]: move and rename mouse/scroll min/max defines (#25141)
* protocol: move {XY/HV}_REPORT_{MIN,MAX} into report.h

..to allow easier re-use in other code implementations.

* protocol: rename {XY/HV}_REPORT_{MIN/MAX} to MOUSE_REPORT_{XY/HV}_{MIN/MAX}

..to avoid naming collisions.
2025-04-13 18:36:13 +02:00
QMK Bot
d0611b0468 Merge remote-tracking branch 'origin/master' into develop 2025-04-13 16:25:00 +00:00
suikagiken
1388daa0cc [Keyboard] Add suika83opti (#24991) 2025-04-13 10:20:42 -06:00
Sylvain Huguet
d99eb01ee4 Update shuguet/shu89 (#24780)
* Update keyboard.json

Update mod keys location in RGB layout.

* Update keyboard.json

* Update keyboards/shuguet/shu89/keyboard.json

Co-authored-by: Ryan <fauxpark@gmail.com>

---------

Co-authored-by: Ryan <fauxpark@gmail.com>
2025-04-13 10:19:12 -06:00
Olivier Mehani
e17878ad15 kradoindustries_promenade: add LAYOUT_1x2u (#25090) 2025-04-13 10:14:34 -06:00
Christian C. Berclaz
ba72094b69 New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) (#24690)
* Added a default firmware and layout for the WindStudio Wind X R1
keyboard.

* Wind X R1: cleaned-up the folders to make clear that this firmware is
for the release 1 of this keyboard.

* Delete keyboards/windstudio/wind_x/R1 directory

Removing the uppercase R1 folder

* feat(cannonkeys/savage65): Added layout to keyboard.json
- Added the layout LAYOUT_65_ansi_blocker_tsangan_split_bs to the
  community layouts.
2025-04-13 10:11:18 -06:00
QMK Bot
0d7d75d3d5 Merge remote-tracking branch 'origin/master' into develop 2025-04-11 16:26:48 +00:00
Luis Garcia
daf6968947 fix: Fix startup sound for Preonic (#25132) (#25133)
Add `AUDIO_INIT_DELAY ` to config.h to resolve
2025-04-11 17:26:13 +01:00
Joel Challis
e27dd0f26f Exclude external userspace from lint checking (#24680) 2025-04-11 22:19:02 +10:00
QMK Bot
6624671a60 Merge remote-tracking branch 'origin/master' into develop 2025-04-11 05:26:44 +00:00
Luis Garcia
f549b30760 chore: Allow disabling underglow on Work Louder devices (#25123) (#25120)
* Allow disabling Underglow on Work Louder devices

Allows disabling Underglow on Work Louder devices by using `RGBLIGHT_ENABLE = no` on rules.mk

* Update keyboards/work_louder/rgb_functions.c

Suggested by @zvecr on review.

Co-authored-by: Joel Challis <git@zvecr.com>

---------

Co-authored-by: Joel Challis <git@zvecr.com>
2025-04-10 23:26:11 -06:00
Nick Brassel
6b8670fe8f Cater for use of __errno_r() in ChibiOS syscalls.c with newer picolibc revisions (#25121) 2025-04-10 01:43:25 +01:00
QMK Bot
dc26e99dd5 Merge remote-tracking branch 'origin/master' into develop 2025-04-09 14:29:06 +00:00
Nick Brassel
a0f40d9410 Include math.h where necessary. (#25122) 2025-04-09 15:28:30 +01:00
QMK Bot
4dc846f21c Merge remote-tracking branch 'origin/master' into develop 2025-04-09 00:15:49 +00:00
Nick Brassel
575abc48a3 More Windows->Unix style path fixes. (#25119) 2025-04-09 10:15:14 +10:00
QMK Bot
4643681888 Merge remote-tracking branch 'origin/master' into develop 2025-04-08 22:13:51 +00:00
Andrew Kannan
0ec96ddd52 Add Vida to QMK (#24225)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2025-04-09 08:13:16 +10:00
QMK Bot
35019fe136 Merge remote-tracking branch 'origin/master' into develop 2025-04-08 02:36:21 +00:00
Joel Challis
2645751ce1 Add warning when deprecated 'promicro_rp2040' is used (#25112) 2025-04-08 12:35:43 +10:00
QMK Bot
f35f4ee933 Merge remote-tracking branch 'origin/master' into develop 2025-04-08 02:31:52 +00:00
Joel Challis
ca84b57042 Remove direct docs.qmk.fm links from docs (#25113) 2025-04-08 12:31:17 +10:00
Joel Challis
06610c3da6 Remove CTPC/CONVERT_TO_PROTON_C options (#25111) 2025-04-08 01:55:49 +01:00
QMK Bot
ca635876ce Merge remote-tracking branch 'origin/master' into develop 2025-04-07 17:03:39 +00:00
sudo pacman -Syu
5f222a3e02 Fix coban pad9a wrong layout in keyboard.json (#25100) 2025-04-07 11:03:05 -06:00
QMK Bot
bca0aca8c5 Merge remote-tracking branch 'origin/master' into develop 2025-04-07 06:30:11 +00:00
Ivan Gromov
f94c8fd766 [Keyboard] Add Ortho Slayer (#25099)
* Add Ortho Slayer

* Update keyboards/keyten/ortho_slayer/keymaps/default/keymap.c

Co-authored-by: jack <jack@pngu.org>

* Update keyboards/keyten/ortho_slayer/readme.md

Co-authored-by: jack <jack@pngu.org>

---------

Co-authored-by: jack <jack@pngu.org>
2025-04-07 00:29:37 -06:00
QMK Bot
73ec19f0cb Merge remote-tracking branch 'origin/master' into develop 2025-04-07 04:03:57 +00:00
nonameCCC
a7ac6e4e68 [Keyboard] Add PHDesign PH60/Multi Keyboard PCB (#25086)
* Add PH60/Multi Support

* Add PCB PIcture for README

* Remove MO(_FN2)

* README Typo Fix

* Layout and README Adjustment

* Add README for PHDesign Main Folder

* Keymap Improvement

* Update README.md
2025-04-06 22:03:24 -06:00
QMK Bot
0da4c26d9c Merge remote-tracking branch 'origin/master' into develop 2025-04-06 18:03:03 +00:00
Dam Vu Duy
9e775b8e9d Add Coban Pad 12A (#25039)
Co-authored-by: jack <jack@pngu.org>
2025-04-06 10:56:19 -07:00
Pham Duc Minh
30c0036db1 Refactor Deemen17 Works DE60 (#25088) 2025-04-06 10:53:13 -07:00
QMK Bot
4d3726050e Merge remote-tracking branch 'origin/master' into develop 2025-04-05 21:22:08 +00:00
Ivan Gromov
0f1dcc0592 Add kt60HS-T v2 PCB (#25080)
* Add kt60HS-Tv2

* Update keyboards/keyten/kt60hs_t/readme.md

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Update keyboards/keyten/kt60hs_t/v1/readme.md

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Update keyboards/keyten/kt60hs_t/v2/keyboard.json

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Update keyboards/keyten/kt60hs_t/v2/readme.md

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Update keyboards/keyten/kt60hs_t/info.json

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Change of structure

* Moving the keyboard

* Update data/mappings/keyboard_aliases.hjson

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>

* Update keyboards/keyten/kt60hs_t/v1/keyboard.json

Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>

* Update keyboards/keyten/kt60hs_t/v2/keyboard.json

Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>

---------

Co-authored-by: Sergey Vlasov <sigprof@gmail.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2025-04-03 12:51:25 -06:00
Pascal Getreuer
da166d4d8b Add "license" field to Community Module JSON schema. (#25085)
Add "license" field to community module schema.
2025-04-01 16:06:42 +11:00
QMK Bot
3cd2924985 Merge remote-tracking branch 'origin/master' into develop 2025-03-30 00:18:16 +00:00
QMK Bot
7adb4dc6fb Merge remote-tracking branch 'origin/master' into develop 2025-03-29 13:20:13 +00:00
QMK Bot
a8fb9e1462 Merge remote-tracking branch 'origin/master' into develop 2025-03-29 02:48:02 +00:00
QMK Bot
0682cf9242 Merge remote-tracking branch 'origin/master' into develop 2025-03-28 13:38:59 +00:00
QMK Bot
cbe48b67df Merge remote-tracking branch 'origin/master' into develop 2025-03-28 10:04:33 +00:00
QMK Bot
d61798169d Merge remote-tracking branch 'origin/master' into develop 2025-03-28 09:19:41 +00:00
QMK Bot
b9e4d22765 Merge remote-tracking branch 'origin/master' into develop 2025-03-28 08:56:42 +00:00
QMK Bot
bc110b1533 Merge remote-tracking branch 'origin/master' into develop 2025-03-28 08:28:10 +00:00
QMK Bot
183b093698 Merge remote-tracking branch 'origin/master' into develop 2025-03-28 06:26:12 +00:00
yiancar
a02ed6a36d Update keymap for keycult 1800 (#25070)
Update keymap

Co-authored-by: yiancar <yiancar@gmail.com>
2025-03-27 17:25:46 -06:00
QMK Bot
c130b08f8e Merge remote-tracking branch 'origin/master' into develop 2025-03-26 19:24:00 +00:00
Nick Brassel
1a6a9a7c77 [Modules] Provide access to current path in rules.mk. (#25061) 2025-03-26 10:30:45 +00:00
jack
86c22a15ab Fix outdated GPIO control function usage (#25060) 2025-03-26 07:51:56 +00:00
QMK Bot
558b074c93 Merge remote-tracking branch 'origin/master' into develop 2025-03-23 05:17:37 +00:00
jack
2d37e80ac9 Migrate remaining split.soft_serial_pin to split.serial.pin (#25046)
* Migrate keyboards/bastardkb

* Migrate keyboards/handwired

* Migrate keyboards/helix

* Fix duplicate serial key
2025-03-22 09:58:33 -06:00
QMK Bot
38825610a5 Merge remote-tracking branch 'origin/master' into develop 2025-03-21 18:01:05 +00:00
Nick Brassel
2b00b846dc Non-volatile memory data repository pattern (#24356)
* First batch of eeconfig conversions.

* Offset and length for datablocks.

* `via`, `dynamic_keymap`.

* Fix filename.

* Commentary.

* wilba leds

* satisfaction75

* satisfaction75

* more keyboard whack-a-mole

* satisfaction75

* omnikeyish

* more whack-a-mole

* `generic_features.mk` to automatically pick up nvm repositories

* thievery

* deferred variable resolve

* whitespace

* convert api to structs/unions

* convert api to structs/unions

* convert api to structs/unions

* fixups

* code-side docs

* code size fix

* rollback

* nvm_xxxxx_erase

* Updated location of eeconfig magic numbers so non-EEPROM nvm drivers can use them too.

* Fixup build.

* Fixup compilation error with encoders.

* Build fixes.

* Add `via_ci` keymap to onekey to exercise VIA bindings (and thus dynamic keymap et.al.), fixup compilation errors based on preprocessor+sizeof.

* Build failure rectification.
2025-03-21 23:38:34 +11:00
Stefan Kerkmann
c9d62ddc78 [Core] use keycode_string in unit tests (#25042)
* tests: use keycode_string feature

With a proper keycode to string implementation in qmk there is no need
to use the unit tests only implementation anymore.

Signed-off-by: Stefan Kerkmann <karlk90@pm.me>

* tests: remove keycode_util feature

This feature is no longer used as we switched the tests to the
keycode string implementation.

Signed-off-by: Stefan Kerkmann <karlk90@pm.me>
2025-03-21 08:47:22 +01:00
QMK Bot
d603fb0913 Merge remote-tracking branch 'origin/master' into develop 2025-03-20 22:34:52 +00:00
QMK Bot
b84ab51343 Merge remote-tracking branch 'origin/master' into develop 2025-03-20 22:22:52 +00:00
QMK Bot
ad20f8287a Merge remote-tracking branch 'origin/master' into develop 2025-03-20 22:21:55 +00:00
QMK Bot
0be239b45c Merge remote-tracking branch 'origin/master' into develop 2025-03-20 22:13:25 +00:00
QMK Bot
54dbde68e1 Merge remote-tracking branch 'origin/master' into develop 2025-03-20 22:01:02 +00:00
QMK Bot
add459f0ac Merge remote-tracking branch 'origin/master' into develop 2025-03-20 21:55:29 +00:00
Ramon Imbao
ea238d5a8a Add the plywrks ply8x hotswap variant. (#23558)
* Add hotswap variant

* Update RGB matrix

* Move files around to target develop

* Revert rules.mk for keyboards/jaykeeb/joker/rules.mk

* Update keyboards/plywrks/ply8x/hotswap/keyboard.json

Co-authored-by: Drashna Jaelre <drashna@live.com>

* Apply suggestions from code review

Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>

* Add missing community layouts

* Delete keyboards/plywrks/ply8x/rules.mk

* Update missing keys in RGB matrix

* Add missing key in RGB matrix for hotswap ver

* Remove via keymaps

* Add keyboard alias for plywrks/ply8x to plywrks/ply8x/solder

* Fix typo

* Fix another typo

---------

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Duncan Sutherland <dunk2k_2000@hotmail.com>
2025-03-21 08:53:27 +11:00
Duncan Sutherland
14ef6c9830 Add Community Layout support to daskeyboard4 (#23884)
add ansi CL
2025-03-21 08:44:59 +11:00
QMK Bot
fd1d4d71aa Merge remote-tracking branch 'origin/master' into develop 2025-03-20 21:36:32 +00:00
QMK Bot
61479c4bf2 Merge remote-tracking branch 'origin/master' into develop 2025-03-20 05:07:29 +00:00
Joel Challis
f820a186d4 Align to latest CLI dependencies (#24553)
* Align to latest CLI dependencies

* Update docs
2025-03-20 14:04:10 +11:00
Pascal Getreuer
3484f0a0df [Core] get_keycode_string(): function to format keycodes as strings, for more readable debug logging. (#24787)
* keycode_string(): Format keycodes as strings.

This adds the `keycode_string()` function described in
https://getreuer.info/posts/keyboards/keycode-string/index.html
as a core feature.

* Fix formatting.

* keycode_string review revisions.

* Rename keycode_string() -> get_keycode_string() for consistency with
  existing string utils like get_u8_str().

* Revise custom keycode names with separate _user and _kb tables.

* Correct indent in builddefs/generic_features.mk.

Co-authored-by: Ryan <fauxpark@gmail.com>

* Add KC_NUHS, KC_NUBS, and KC_CAPS.

* Fix linking error with custom names.

* Attempt at simplifying interface.

* Formatting fix.

* Several fixes and revisions.

* Don't use PSTR in KEYCODE_STRING_NAME, since this fails to build on
  AVR. Store custom names in RAM.
* Revise the internal table of common keycode names to use its own
  storage representation, still in PROGMEM, and now more efficiently
  stored flat in 8 bytes per entry.
* Support Swap Hands keycodes and a few other keycodes.

* Revert "Formatting fix."

This reverts commit 2a2771068c.

* Revert "Attempt at simplifying interface."

This reverts commit 8eaf67de76.

* Simplify custom names API by sigprof's suggestion.

* Support more keycodes.

* Add QK_LOCK keycode.
* Add Secure keycodes.
* Add Joystick keycodes.
* Add Programmable Button keycodes.
* Add macro MC_ keycodes.
* For remaining keys in known code ranges, stringify them as
  "QK_<feature>+<number>". For instance, "QK_MIDI+7".

* Bug fix and a few improvements.

* Fix missing right-hand bit when displaying 5-bit mods numerically.
* Support KC_HYPR, KC_MEH, HYPR_T(kc), MEH_T(kc).
* Exclude one-shot keycodes when NO_ACTION_ONESHOT is defined.

---------

Co-authored-by: Ryan <fauxpark@gmail.com>
2025-03-19 20:45:56 +01:00
QMK Bot
40a446a0ec Merge remote-tracking branch 'origin/master' into develop 2025-03-19 16:34:27 +00:00
QMK Bot
d6850bab3f Merge remote-tracking branch 'origin/master' into develop 2025-03-19 01:46:02 +00:00
QMK Bot
80b16f688c Merge remote-tracking branch 'origin/master' into develop 2025-03-18 15:49:02 +00:00
QMK Bot
40fafad6bc Merge remote-tracking branch 'origin/master' into develop 2025-03-17 19:07:56 +00:00
QMK Bot
e6dcdf2d65 Merge remote-tracking branch 'origin/master' into develop 2025-03-16 08:45:02 +00:00
QMK Bot
4f257711e0 Merge remote-tracking branch 'origin/master' into develop 2025-03-13 21:05:09 +00:00
QMK Bot
27b115151f Merge remote-tracking branch 'origin/master' into develop 2025-03-13 21:01:31 +00:00
QMK Bot
fab39d49e6 Merge remote-tracking branch 'origin/master' into develop 2025-03-13 19:21:29 +00:00
QMK Bot
3306d78bbd Merge remote-tracking branch 'origin/master' into develop 2025-03-11 09:43:13 +00:00
Duncan Sutherland
808c4d4e38 add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon (#22459)
* expand mechlovin/olly/octagon

* Update info.json

* Rename info.json to keyboard.json

* correct matrix position for key

* remove VIA
2025-03-10 00:48:35 -07:00
Joel Challis
67934546ea Only configure STM32_HSECLK within board.h (#25001) 2025-03-09 23:41:24 +00:00
Joel Challis
21c1fd5e5b Require 'x'/'y' properties for LED/RGB Matrix layout (#24997) 2025-03-09 23:40:59 +00:00
Matthijs Muller
30daeaf09f Add Icebreaker keyboard (#24723)
Co-authored-by: jack <jack@pngu.org>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2025-03-09 00:51:29 -08:00
QMK Bot
21f7c915df Merge remote-tracking branch 'origin/master' into develop 2025-03-09 07:59:37 +00:00
QMK Bot
7cc18f2b11 Merge remote-tracking branch 'origin/master' into develop 2025-03-06 23:17:53 +00:00
Joel Challis
6e1d3d6d07 Add EOL to non-keyboard files (#24990) 2025-03-06 23:17:51 +00:00
QMK Bot
12f9f34fc8 Merge remote-tracking branch 'origin/master' into develop 2025-03-04 23:40:42 +00:00
QMK Bot
4d3a9ce13a Merge remote-tracking branch 'origin/master' into develop 2025-03-03 19:23:41 +00:00
QMK Bot
a0a999976f Merge remote-tracking branch 'origin/master' into develop 2025-03-03 19:22:27 +00:00
QMK Bot
40f08b47ae Merge remote-tracking branch 'origin/master' into develop 2025-03-03 19:19:08 +00:00
QMK Bot
a052adb659 Merge remote-tracking branch 'origin/master' into develop 2025-03-03 05:34:50 +00:00
QMK Bot
3968f5b370 Merge remote-tracking branch 'origin/master' into develop 2025-03-03 03:32:59 +00:00
QMK Bot
c46cefa898 Merge remote-tracking branch 'origin/master' into develop 2025-03-02 21:33:36 +00:00
QMK Bot
d0153368b8 Merge remote-tracking branch 'origin/master' into develop 2025-03-02 21:05:06 +00:00
QMK Bot
a076412b2b Merge remote-tracking branch 'origin/master' into develop 2025-03-02 01:00:30 +00:00
QMK Bot
37c581690c Merge remote-tracking branch 'origin/master' into develop 2025-03-02 00:49:36 +00:00
QMK Bot
ac70b81d3f Merge remote-tracking branch 'origin/master' into develop 2025-03-01 22:24:49 +00:00
QMK Bot
107f9a4cb3 Merge remote-tracking branch 'origin/master' into develop 2025-03-01 21:50:43 +00:00
QMK Bot
2f69eb5f8f Merge remote-tracking branch 'origin/master' into develop 2025-03-01 21:27:15 +00:00
QMK Bot
5151abc298 Merge remote-tracking branch 'origin/master' into develop 2025-03-01 21:02:04 +00:00
QMK Bot
cbfbd173d3 Merge remote-tracking branch 'origin/master' into develop 2025-03-01 21:00:36 +00:00
QMK Bot
8606e78920 Merge remote-tracking branch 'origin/master' into develop 2025-03-01 20:48:45 +00:00
QMK Bot
665a12b50e Merge remote-tracking branch 'origin/master' into develop 2025-03-01 20:47:51 +00:00
QMK Bot
53e61900fe Merge remote-tracking branch 'origin/master' into develop 2025-02-28 19:08:29 +00:00
Pablo Martínez
e62352e606 [Cleanup] Handling of optional *.mk files (#24952)
replace check + `include` with `-include`
2025-02-28 17:39:43 +00:00
Joel Challis
6ee806f376 Implement battery level interface (#24666)
Co-authored-by: Nick Brassel <nick@tzarc.org>
2025-02-28 16:46:14 +11:00
Nick Brassel
312f42945d Branch point for 2025q2 breaking change. 2025-02-28 09:26:13 +11:00
Nick Brassel
40b9dada5c Merge remote-tracking branch 'upstream/master' into develop 2025-02-28 09:24:51 +11:00
3476 changed files with 24492 additions and 11500 deletions

View File

@@ -1,4 +1,4 @@
CompileFlags: CompileFlags:
Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option] Add: [-Wno-unknown-attributes, -Wno-maybe-uninitialized, -Wno-unknown-warning-option]
Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues] Remove: [-W*, -mmcu=*, -mcpu=*, -mfpu=*, -mfloat-abi=*, -mno-unaligned-access, -mno-thumb-interwork, -mcall-prologues, -D__has_include*]
Compiler: clang Compiler: clang

View File

@@ -39,7 +39,7 @@ jobs:
qmk format-text -a qmk format-text -a
git diff git diff
- uses: rlespinasse/github-slug-action@v3.x - uses: rlespinasse/github-slug-action@v5
- name: Become QMK Bot - name: Become QMK Bot
run: | run: |

View File

@@ -26,7 +26,7 @@ jobs:
util/regen.sh util/regen.sh
git diff git diff
- uses: rlespinasse/github-slug-action@v3.x - uses: rlespinasse/github-slug-action@v5
- name: Become QMK Bot - name: Become QMK Bot
run: | run: |

27
.vscode/settings.json vendored
View File

@@ -10,6 +10,13 @@
"**/*.uf2": true "**/*.uf2": true
}, },
"files.associations": { "files.associations": {
// QMK Filetypes
"keyboard.json": "jsonc",
"info.json": "jsonc",
"keymap.json": "jsonc",
"qmk.json": "jsonc",
"qmk_module.json": "jsonc",
// Standard filetypes
"*.h": "c", "*.h": "c",
"*.c": "c", "*.c": "c",
"*.inc": "c", "*.inc": "c",
@@ -28,7 +35,23 @@
"[json]": { "[json]": {
"editor.formatOnSave": false "editor.formatOnSave": false
}, },
"clangd.arguments": [ "clangd.arguments": ["--header-insertion=never"],
"--header-insertion=never" "json.schemas": [
{
"fileMatch": ["qmk.json"],
"url": "./data/schemas/user_repo_v1_1.jsonschema"
},
{
"fileMatch": ["qmk_module.json"],
"url": "./data/schemas/community_module.jsonschema"
},
{
"fileMatch": ["keyboard.json", "info.json"],
"url": "./data/schemas/keyboard.jsonschema"
},
{
"fileMatch": ["keymap.json"],
"url": "./data/schemas/keymap.jsonschema"
}
] ]
} }

View File

@@ -59,6 +59,7 @@ ifeq ($(ROOT_DIR),)
endif endif
include paths.mk include paths.mk
include $(BUILDDEFS_PATH)/support.mk
TEST_OUTPUT_DIR := $(BUILD_DIR)/test TEST_OUTPUT_DIR := $(BUILD_DIR)/test
ERROR_FILE := $(BUILD_DIR)/error_occurred ERROR_FILE := $(BUILD_DIR)/error_occurred

View File

@@ -25,8 +25,6 @@ $(TEST_OUTPUT)_SRC := \
tests/test_common/test_driver.cpp \ tests/test_common/test_driver.cpp \
tests/test_common/keyboard_report_util.cpp \ tests/test_common/keyboard_report_util.cpp \
tests/test_common/mouse_report_util.cpp \ tests/test_common/mouse_report_util.cpp \
tests/test_common/keycode_util.cpp \
tests/test_common/keycode_table.cpp \
tests/test_common/test_fixture.cpp \ tests/test_common/test_fixture.cpp \
tests/test_common/test_keymap_key.cpp \ tests/test_common/test_keymap_key.cpp \
tests/test_common/test_logger.cpp \ tests/test_common/test_logger.cpp \

View File

@@ -11,6 +11,7 @@ endif
.DEFAULT_GOAL := all .DEFAULT_GOAL := all
include paths.mk include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk include $(BUILDDEFS_PATH)/message.mk
# Helper to add defines with a 'QMK_' prefix # Helper to add defines with a 'QMK_' prefix
@@ -97,21 +98,12 @@ endif
# Pull in rules.mk files from all our subfolders # Pull in rules.mk files from all our subfolders
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/rules.mk)","") -include $(KEYBOARD_PATH_5)/rules.mk
include $(KEYBOARD_PATH_5)/rules.mk -include $(KEYBOARD_PATH_4)/rules.mk
endif -include $(KEYBOARD_PATH_3)/rules.mk
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/rules.mk)","") -include $(KEYBOARD_PATH_2)/rules.mk
include $(KEYBOARD_PATH_4)/rules.mk -include $(KEYBOARD_PATH_1)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/rules.mk)","")
include $(KEYBOARD_PATH_3)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/rules.mk)","")
include $(KEYBOARD_PATH_2)/rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/rules.mk)","")
include $(KEYBOARD_PATH_1)/rules.mk
endif
# Create dependencies on DD keyboard config - structure validated elsewhere # Create dependencies on DD keyboard config - structure validated elsewhere
DD_CONFIG_FILES := DD_CONFIG_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","") ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
@@ -260,6 +252,9 @@ generated-files: $(INTERMEDIATE_OUTPUT)/src/config.h $(INTERMEDIATE_OUTPUT)/src/
endif endif
# Community modules # Community modules
COMMUNITY_RULES_MK = $(shell $(QMK_BIN) generate-community-modules-rules-mk -kb $(KEYBOARD) --quiet --escape --output $(INTERMEDIATE_OUTPUT)/src/community_rules.mk $(KEYMAP_JSON))
include $(COMMUNITY_RULES_MK)
$(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES) $(INTERMEDIATE_OUTPUT)/src/community_modules.h: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD) @$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON)) $(eval CMD=$(QMK_BIN) generate-community-modules-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(KEYMAP_JSON))
@@ -280,10 +275,19 @@ $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h: $(KEYMAP_JSON) $(D
$(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON)) $(eval CMD=$(QMK_BIN) generate-community-modules-introspection-h -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(KEYMAP_JSON))
@$(BUILD_CMD) @$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-led-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
$(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc: $(KEYMAP_JSON) $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-rgb-matrix-community-modules-inc -kb $(KEYBOARD) --quiet --output $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc $(KEYMAP_JSON))
@$(BUILD_CMD)
SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c SRC += $(INTERMEDIATE_OUTPUT)/src/community_modules.c
generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h generated-files: $(INTERMEDIATE_OUTPUT)/src/community_modules.h $(INTERMEDIATE_OUTPUT)/src/community_modules.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.c $(INTERMEDIATE_OUTPUT)/src/community_modules_introspection.h $(INTERMEDIATE_OUTPUT)/src/led_matrix_community_modules.inc $(INTERMEDIATE_OUTPUT)/src/rgb_matrix_community_modules.inc
include $(BUILDDEFS_PATH)/converters.mk include $(BUILDDEFS_PATH)/converters.mk
@@ -487,21 +491,11 @@ ifneq ("$(CONVERTER)","")
endif endif
# Pull in post_rules.mk files from all our subfolders # Pull in post_rules.mk files from all our subfolders
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/post_rules.mk)","") -include $(KEYBOARD_PATH_1)/post_rules.mk
include $(KEYBOARD_PATH_1)/post_rules.mk -include $(KEYBOARD_PATH_2)/post_rules.mk
endif -include $(KEYBOARD_PATH_3)/post_rules.mk
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/post_rules.mk)","") -include $(KEYBOARD_PATH_4)/post_rules.mk
include $(KEYBOARD_PATH_2)/post_rules.mk -include $(KEYBOARD_PATH_5)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/post_rules.mk)","")
include $(KEYBOARD_PATH_3)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/post_rules.mk)","")
include $(KEYBOARD_PATH_4)/post_rules.mk
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_rules.mk)","")
include $(KEYBOARD_PATH_5)/post_rules.mk
endif
define post_rules_mk_community_module_includer define post_rules_mk_community_module_includer
ifneq ("$(wildcard $(1)/post_rules.mk)","") ifneq ("$(wildcard $(1)/post_rules.mk)","")

View File

@@ -7,6 +7,7 @@ endif
OPT = g OPT = g
include paths.mk include paths.mk
include $(BUILDDEFS_PATH)/support.mk
include $(BUILDDEFS_PATH)/message.mk include $(BUILDDEFS_PATH)/message.mk
TARGET=test/$(TEST_OUTPUT) TARGET=test/$(TEST_OUTPUT)

View File

@@ -30,6 +30,8 @@ QUANTUM_SRC += \
$(QUANTUM_DIR)/logging/sendchar.c \ $(QUANTUM_DIR)/logging/sendchar.c \
$(QUANTUM_DIR)/process_keycode/process_default_layer.c \ $(QUANTUM_DIR)/process_keycode/process_default_layer.c \
include $(QUANTUM_DIR)/nvm/rules.mk
VPATH += $(QUANTUM_DIR)/logging VPATH += $(QUANTUM_DIR)/logging
# Fall back to lib/printf if there is no platform provided print # Fall back to lib/printf if there is no platform provided print
ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","") ifeq ("$(wildcard $(PLATFORM_PATH)/$(PLATFORM_KEY)/printf.mk)","")
@@ -169,80 +171,82 @@ endif
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling legacy_stm32_flash
EEPROM_DRIVER ?= vendor EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) ifneq ($(strip $(EEPROM_DRIVER)),none)
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver) $(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
else else
OPT_DEFS += -DEEPROM_ENABLE OPT_DEFS += -DEEPROM_ENABLE
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
COMMON_VPATH += $(DRIVER_PATH)/eeprom COMMON_VPATH += $(DRIVER_PATH)/eeprom
COMMON_VPATH += $(PLATFORM_COMMON_DIR) COMMON_VPATH += $(PLATFORM_COMMON_DIR)
ifeq ($(strip $(EEPROM_DRIVER)), custom) ifeq ($(strip $(EEPROM_DRIVER)), custom)
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block # Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
SRC += eeprom_driver.c SRC += eeprom_driver.c
else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling) else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
# Wear-leveling EEPROM implementation # Wear-leveling EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c SRC += eeprom_driver.c eeprom_wear_leveling.c
else ifeq ($(strip $(EEPROM_DRIVER)), i2c) else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
# External I2C EEPROM implementation # External I2C EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
I2C_DRIVER_REQUIRED = yes I2C_DRIVER_REQUIRED = yes
SRC += eeprom_driver.c eeprom_i2c.c SRC += eeprom_driver.c eeprom_i2c.c
else ifeq ($(strip $(EEPROM_DRIVER)), spi) else ifeq ($(strip $(EEPROM_DRIVER)), spi)
# External SPI EEPROM implementation # External SPI EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
SPI_DRIVER_REQUIRED = yes SPI_DRIVER_REQUIRED = yes
SRC += eeprom_driver.c eeprom_spi.c SRC += eeprom_driver.c eeprom_spi.c
else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash) else ifeq ($(strip $(EEPROM_DRIVER)), legacy_stm32_flash)
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
COMMON_VPATH += $(DRIVER_PATH)/flash COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient) else ifeq ($(strip $(EEPROM_DRIVER)), transient)
# Transient EEPROM implementation -- no data storage but provides runtime area for it # Transient EEPROM implementation -- no data storage but provides runtime area for it
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
SRC += eeprom_driver.c eeprom_transient.c SRC += eeprom_driver.c eeprom_transient.c
else ifeq ($(strip $(EEPROM_DRIVER)), vendor) else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
# Vendor-implemented EEPROM # Vendor-implemented EEPROM
OPT_DEFS += -DEEPROM_VENDOR OPT_DEFS += -DEEPROM_VENDOR
ifeq ($(PLATFORM),AVR) ifeq ($(PLATFORM),AVR)
# Automatically provided by avr-libc, nothing required # Automatically provided by avr-libc, nothing required
else ifeq ($(PLATFORM),CHIBIOS) else ifeq ($(PLATFORM),CHIBIOS)
ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) ifneq ($(filter %_STM32F072xB %_STM32F042x6, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
# STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated) # STM32 Emulated EEPROM, backed by MCU flash (soon to be deprecated)
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_LEGACY_EMULATED_FLASH
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
COMMON_VPATH += $(DRIVER_PATH)/flash COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c SRC += eeprom_driver.c eeprom_legacy_emulated_flash.c legacy_flash_ops.c
else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),) else ifneq ($(filter $(MCU_SERIES),STM32F1xx STM32F3xx STM32F4xx STM32L4xx STM32G0xx STM32G4xx WB32F3G71xx WB32FQ95xx AT32F415 GD32VF103),)
# Wear-leveling EEPROM implementation, backed by MCU flash # Wear-leveling EEPROM implementation, backed by MCU flash
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c SRC += eeprom_driver.c eeprom_wear_leveling.c
WEAR_LEVELING_DRIVER ?= embedded_flash WEAR_LEVELING_DRIVER ?= embedded_flash
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
# True EEPROM on STM32L0xx, L1xx # True EEPROM on STM32L0xx, L1xx
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c SRC += eeprom_driver.c eeprom_stm32_L0_L1.c
else ifneq ($(filter $(MCU_SERIES),RP2040),) else ifneq ($(filter $(MCU_SERIES),RP2040),)
# Wear-leveling EEPROM implementation, backed by RP2040 flash # Wear-leveling EEPROM implementation, backed by RP2040 flash
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c SRC += eeprom_driver.c eeprom_wear_leveling.c
WEAR_LEVELING_DRIVER ?= rp2040_flash WEAR_LEVELING_DRIVER ?= rp2040_flash
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),) else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
# Teensy EEPROM implementations # Teensy EEPROM implementations
OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM OPT_DEFS += -DEEPROM_KINETIS_FLEXRAM
SRC += eeprom_kinetis_flexram.c SRC += eeprom_kinetis_flexram.c
else else
# Fall back to transient, i.e. non-persistent # Fall back to transient, i.e. non-persistent
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
SRC += eeprom_driver.c eeprom_transient.c SRC += eeprom_driver.c eeprom_transient.c
endif
else ifeq ($(PLATFORM),TEST)
# Test harness "EEPROM"
OPT_DEFS += -DEEPROM_TEST_HARNESS
SRC += eeprom.c
endif endif
else ifeq ($(PLATFORM),TEST)
# Test harness "EEPROM"
OPT_DEFS += -DEEPROM_TEST_HARNESS
SRC += eeprom.c
endif endif
endif endif
endif endif
@@ -263,18 +267,14 @@ ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash) ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
OPT_DEFS += -DHAL_USE_EFL OPT_DEFS += -DHAL_USE_EFL
SRC += wear_leveling_efl.c SRC += wear_leveling_efl.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash) else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
FLASH_DRIVER := spi FLASH_DRIVER := spi
SRC += wear_leveling_flash_spi.c SRC += wear_leveling_flash_spi.c
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash) else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), rp2040_flash)
SRC += wear_leveling_rp2040_flash.c SRC += wear_leveling_rp2040_flash.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_PATH)/wear_leveling/wear_leveling_rp2040_flash_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy) else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
SRC += legacy_flash_ops.c wear_leveling_legacy.c SRC += legacy_flash_ops.c wear_leveling_legacy.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
endif endif
endif endif
endif endif
@@ -635,6 +635,11 @@ ifeq ($(strip $(VIA_ENABLE)), yes)
TRI_LAYER_ENABLE := yes TRI_LAYER_ENABLE := yes
endif endif
ifeq ($(strip $(RAW_ENABLE)), yes)
OPT_DEFS += -DRAW_ENABLE
SRC += raw_hid.c
endif
ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes) ifeq ($(strip $(DYNAMIC_KEYMAP_ENABLE)), yes)
SEND_STRING_ENABLE := yes SEND_STRING_ENABLE := yes
endif endif
@@ -717,6 +722,7 @@ ifeq ($(strip $(LIB8TION_ENABLE)), yes)
# ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines # ATmegaxxU2 does not have hardware MUL instruction - lib8tion must be told to use software multiplication routines
OPT_DEFS += -DLIB8_ATTINY OPT_DEFS += -DLIB8_ATTINY
endif endif
OPT_DEFS += -DFASTLED_SCALE8_FIXED=1 -DFASTLED_BLEND_FIXED=1
SRC += $(LIB_PATH)/lib8tion/lib8tion.c SRC += $(LIB_PATH)/lib8tion/lib8tion.c
endif endif
@@ -888,19 +894,19 @@ ifeq ($(strip $(BLUETOOTH_ENABLE)), yes)
OPT_DEFS += -DBLUETOOTH_ENABLE OPT_DEFS += -DBLUETOOTH_ENABLE
OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]')) OPT_DEFS += -DBLUETOOTH_$(strip $(shell echo $(BLUETOOTH_DRIVER) | tr '[:lower:]' '[:upper:]'))
NO_USB_STARTUP_CHECK := yes NO_USB_STARTUP_CHECK := yes
CONNECTION_ENABLE := yes
COMMON_VPATH += $(DRIVER_PATH)/bluetooth COMMON_VPATH += $(DRIVER_PATH)/bluetooth
SRC += outputselect.c process_connection.c SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le) ifeq ($(strip $(BLUETOOTH_DRIVER)), bluefruit_le)
SPI_DRIVER_REQUIRED = yes SPI_DRIVER_REQUIRED = yes
ANALOG_DRIVER_REQUIRED = yes SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c
SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp SRC += $(DRIVER_PATH)/bluetooth/bluefruit_le.cpp
endif endif
ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42) ifeq ($(strip $(BLUETOOTH_DRIVER)), rn42)
UART_DRIVER_REQUIRED = yes UART_DRIVER_REQUIRED = yes
SRC += $(DRIVER_PATH)/bluetooth/bluetooth.c SRC += $(DRIVER_PATH)/bluetooth/bluetooth_drivers.c
SRC += $(DRIVER_PATH)/bluetooth/rn42.c SRC += $(DRIVER_PATH)/bluetooth/rn42.c
endif endif
endif endif
@@ -934,6 +940,28 @@ ifeq ($(strip $(DIP_SWITCH_ENABLE)), yes)
endif endif
endif endif
VALID_BATTERY_DRIVER_TYPES := adc custom vendor
BATTERY_DRIVER ?= adc
ifeq ($(strip $(BATTERY_DRIVER_REQUIRED)), yes)
ifeq ($(filter $(BATTERY_DRIVER),$(VALID_BATTERY_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid BATTERY_DRIVER,BATTERY_DRIVER="$(BATTERY_DRIVER)" is not a valid battery driver)
endif
OPT_DEFS += -DBATTERY_DRIVER
OPT_DEFS += -DBATTERY_$(strip $(shell echo $(BATTERY_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(DRIVER_PATH)/battery
SRC += battery.c
SRC += battery_$(strip $(BATTERY_DRIVER)).c
# add extra deps
ifeq ($(strip $(BATTERY_DRIVER)), adc)
ANALOG_DRIVER_REQUIRED = yes
endif
endif
VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor VALID_WS2812_DRIVER_TYPES := bitbang custom i2c pwm spi vendor
WS2812_DRIVER ?= bitbang WS2812_DRIVER ?= bitbang

View File

@@ -168,7 +168,7 @@ MOVE_DEP = mv -f $(patsubst %.o,%.td,$@) $(patsubst %.o,%.d,$@)
# For a ChibiOS build, ensure that the board files have the hook overrides injected # For a ChibiOS build, ensure that the board files have the hook overrides injected
define BOARDSRC_INJECT_HOOKS define BOARDSRC_INJECT_HOOKS
$(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): INIT_HOOK_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h $(INTERMEDIATE_OUTPUT)/$(patsubst %.c,%.o,$(patsubst ./%,%,$1)): FILE_SPECIFIC_CFLAGS += -include $(TOP_DIR)/tmk_core/protocol/chibios/init_hooks.h
endef endef
$(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ)))) $(foreach LOBJ, $(BOARDSRC), $(eval $(call BOARDSRC_INJECT_HOOKS,$(LOBJ))))
@@ -289,10 +289,10 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
ifneq ($$(VERBOSE_C_INCLUDE),) ifneq ($$(VERBOSE_C_INCLUDE),)
$$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H)) $$(if $$(filter $$(notdir $$(VERBOSE_C_INCLUDE)),$$(notdir $$<)),$$(eval CC_EXEC += -H))
endif endif
$$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) $$(eval CMD := $$(CC_EXEC) -c $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD) @$$(BUILD_CMD)
ifneq ($$(DUMP_C_MACROS),) ifneq ($$(DUMP_C_MACROS),)
$$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$<) $$(eval CMD := $$(CC) -E -dM $$($1_CFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$<)
@$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD)) @$$(if $$(filter $$(notdir $$(DUMP_C_MACROS)),$$(notdir $$<)),$$(BUILD_CMD))
endif endif
@@ -300,13 +300,13 @@ $1/%.o : %.c $1/%.d $1/cflags.txt $1/compiler.txt | $(BEGIN)
$1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN) $1/%.o : %.cpp $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D) @mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD) @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD) @$$(BUILD_CMD)
$1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN) $1/%.o : %.cc $1/%.d $1/cxxflags.txt $1/compiler.txt | $(BEGIN)
@mkdir -p $$(@D) @mkdir -p $$(@D)
@$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD) @$$(SILENT) || printf "$$(MSG_COMPILING_CXX) $$<" | $$(AWK_CMD)
$$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(INIT_HOOK_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP)) $$(eval CMD=$$(CC) -c $$($1_CXXFLAGS) $$(FILE_SPECIFIC_CFLAGS) $$(GENDEPFLAGS) $$< -o $$@ && $$(MOVE_DEP))
@$$(BUILD_CMD) @$$(BUILD_CMD)
# Assemble: create object files from assembler source files. # Assemble: create object files from assembler source files.

View File

@@ -1,10 +1,3 @@
# Note for new boards -- CTPC and CONVERT_TO_PROTON_C are deprecated terms
# and should not be replicated for new boards. These will be removed from
# documentation as well as existing keymaps in due course.
ifneq ($(findstring yes, $(CTPC)$(CONVERT_TO_PROTON_C)),)
$(call CATASTROPHIC_ERROR,The `CONVERT_TO_PROTON_C` and `CTPC` options are now deprecated. `CONVERT_TO=proton_c` should be used instead.)
endif
ifneq (,$(filter $(MCU),atmega32u4)) ifneq (,$(filter $(MCU),atmega32u4))
# TODO: opt in rather than assume everything uses a pro micro # TODO: opt in rather than assume everything uses a pro micro
PIN_COMPATIBLE ?= promicro PIN_COMPATIBLE ?= promicro

View File

@@ -1,7 +1,7 @@
{ {
"license": "GPL-2.0-or-later", "license": "GPL-2.0-or-later",
"devDependencies": { "devDependencies": {
"vite": "^5.4.15", "vite": "^5.4.18",
"vitepress": "^1.1.0", "vitepress": "^1.1.0",
"vitepress-plugin-tabs": "^0.5.0", "vitepress-plugin-tabs": "^0.5.0",
"vue": "^3.4.24" "vue": "^3.4.24"

View File

@@ -766,10 +766,10 @@ tabbable@^6.2.0:
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97" resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-6.2.0.tgz#732fb62bc0175cfcec257330be187dcfba1f3b97"
integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==
vite@^5.2.9, vite@^5.4.15: vite@^5.2.9, vite@^5.4.18:
version "5.4.15" version "5.4.18"
resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.15.tgz#2941547f10ebb4bf9b0fa0da863c06711eb7e5e5" resolved "https://registry.yarnpkg.com/vite/-/vite-5.4.18.tgz#b5af357f9d5ebb2e0c085779b7a37a77f09168a4"
integrity sha512-6ANcZRivqL/4WtwPGTKNaosuNJr5tWiftOC7liM7G9+rMb8+oeJeyzymDu4rTN93seySBmbjSfsS3Vzr19KNtA== integrity sha512-1oDcnEp3lVyHCuQ2YFelM4Alm2o91xNoMncRm1U7S+JdYfYOvbiGZ3/CxGttrOu2M/KcGz7cRC2DoNUA6urmMA==
dependencies: dependencies:
esbuild "^0.21.3" esbuild "^0.21.3"
postcss "^8.4.43" postcss "^8.4.43"

View File

@@ -25,6 +25,7 @@ GENERIC_FEATURES = \
CAPS_WORD \ CAPS_WORD \
COMBO \ COMBO \
COMMAND \ COMMAND \
CONNECTION \
CRC \ CRC \
DEFERRED_EXEC \ DEFERRED_EXEC \
DIGITIZER \ DIGITIZER \
@@ -34,6 +35,7 @@ GENERIC_FEATURES = \
DYNAMIC_TAPPING_TERM \ DYNAMIC_TAPPING_TERM \
GRAVE_ESC \ GRAVE_ESC \
HAPTIC \ HAPTIC \
KEYCODE_STRING \
KEY_LOCK \ KEY_LOCK \
KEY_OVERRIDE \ KEY_OVERRIDE \
LAYER_LOCK \ LAYER_LOCK \
@@ -60,6 +62,7 @@ define HANDLE_GENERIC_FEATURE
SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c) SRC += $$(wildcard $$(QUANTUM_DIR)/process_keycode/process_$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c) SRC += $$(wildcard $$(QUANTUM_DIR)/$2/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c) SRC += $$(wildcard $$(QUANTUM_DIR)/$2.c)
SRC += $$(wildcard $$(QUANTUM_DIR)/nvm/$$(NVM_DRIVER_LOWER)/nvm_$2.c)
VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/) VPATH += $$(wildcard $$(QUANTUM_DIR)/$2/)
OPT_DEFS += -D$1_ENABLE OPT_DEFS += -D$1_ENABLE
endef endef

11
builddefs/support.mk Normal file
View File

@@ -0,0 +1,11 @@
# Helper to determine if a compiler option is supported
# Args:
# $(1) = option to test, if successful will be output
# $(2) = option to use if $(1) is not supported
# $(3) = additional arguments to pass to the compiler during the test, but aren't contained in the output
cc-option = $(shell \
if { echo 'int main(){return 0;}' | $(CC) $(1) $(3) -o /dev/null -x c /dev/null >/dev/null 2>&1; }; \
then echo "$(1)"; else echo "$(2)"; fi)
# Helper to pass comma character to make functions (use with `$(,)` to pass in `$(call ...)` arguments)
, := ,

View File

@@ -0,0 +1,55 @@
{
pointing_device_init: {
ret_type: void
args: void
guard: defined(POINTING_DEVICE_ENABLE)
}
pointing_device_task: {
ret_type: report_mouse_t
args: report_mouse_t mouse_report
call_params: mouse_report
guard: defined(POINTING_DEVICE_ENABLE)
header: report.h
}
rgb_matrix_indicators: {
ret_type: bool
args: void
guard: defined(RGB_MATRIX_ENABLE)
header: rgb_matrix.h
}
rgb_matrix_indicators_advanced: {
ret_type: bool
args: uint8_t led_min, uint8_t led_max
call_params: led_min, led_max
guard: defined(RGB_MATRIX_ENABLE)
header: rgb_matrix.h
}
led_matrix_indicators: {
ret_type: bool
args: void
guard: defined(LED_MATRIX_ENABLE)
header: led_matrix.h
}
led_matrix_indicators_advanced: {
ret_type: bool
args: uint8_t led_min, uint8_t led_max
call_params: led_min, led_max
guard: defined(LED_MATRIX_ENABLE)
header: led_matrix.h
}
default_layer_state_set: {
ret_type: layer_state_t
args: layer_state_t state
call_params: state
guard: !defined(NO_ACTION_LAYER)
header: action_layer.h
}
layer_state_set: {
ret_type: layer_state_t
args: layer_state_t state
call_params: state
guard: !defined(NO_ACTION_LAYER)
header: action_layer.h
}
}

View File

@@ -0,0 +1,3 @@
{
// This version exists to signify addition of LED/RGB effect support.
}

View File

@@ -64,6 +64,9 @@
"WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false}, "WEAR_LEVELING_BACKING_SIZE": {"info_key": "eeprom.wear_leveling.backing_size", "value_type": "int", "to_json": false},
"WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false}, "WEAR_LEVELING_LOGICAL_SIZE": {"info_key": "eeprom.wear_leveling.logical_size", "value_type": "int", "to_json": false},
// host
"NKRO_DEFAULT_ON": {"info_key": "host.default.nkro", "value_type": "bool"},
// Layer locking // Layer locking
"LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"}, "LAYER_LOCK_IDLE_TIMEOUT": {"info_key": "layer_lock.timeout", "value_type": "int"},
@@ -201,6 +204,7 @@
// Tapping // Tapping
"CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"}, "CHORDAL_HOLD": {"info_key": "tapping.chordal_hold", "value_type": "flag"},
"FLOW_TAP_TERM": {"info_key": "tapping.flow_tap_term", "value_type": "int"},
"HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"}, "HOLD_ON_OTHER_KEY_PRESS": {"info_key": "tapping.hold_on_other_key_press", "value_type": "flag"},
"HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"}, "HOLD_ON_OTHER_KEY_PRESS_PER_KEY": {"info_key": "tapping.hold_on_other_key_press_per_key", "value_type": "flag"},
"PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"}, "PERMISSIVE_HOLD": {"info_key": "tapping.permissive_hold", "value_type": "flag"},
@@ -214,7 +218,6 @@
"TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"}, "TAPPING_TOGGLE": {"info_key": "tapping.toggle", "value_type": "int"},
// USB // USB
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag"},
"USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"}, "USB_MAX_POWER_CONSUMPTION": {"info_key": "usb.max_power", "value_type": "int"},
"USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"}, "USB_POLLING_INTERVAL_MS": {"info_key": "usb.polling_interval", "value_type": "int"},
"USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"}, "USB_SUSPEND_WAKEUP_DELAY": {"info_key": "usb.suspend_wakeup_delay", "value_type": "int"},
@@ -252,6 +255,7 @@
"PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"}, "PRODUCT": {"info_key": "keyboard_name", "warn_duplicate": false, "value_type": "str", "deprecated": true, "replace_with": "`keyboard_name` in info.json"},
"PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"}, "PRODUCT_ID": {"info_key": "usb.pid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.pid` in info.json"},
"VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"}, "VENDOR_ID": {"info_key": "usb.vid", "value_type": "hex", "deprecated": true, "replace_with": "`usb.vid` in info.json"},
"FORCE_NKRO": {"info_key": "usb.force_nkro", "value_type": "flag", "deprecated": true, "replace_with": "`host.default.nkro` in info.json"},
// Items we want flagged in lint // Items we want flagged in lint
"VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true}, "VIAL_KEYBOARD_UID": {"info_key": "_invalid.vial_uid", "invalid": true},

View File

@@ -0,0 +1,74 @@
{
"bootmagic": {
"matrix": [0, 0]
},
"backlight": {
"default": {
"on": true
},
"breathing_period": 6,
"levels": 3,
"on_state": 1
},
"debounce": 5,
"features": {
"command": false,
"console": false
},
"indicators": {
"on_state": 1
},
"led_matrix": {
"default": {
"animation": "solid",
"on": true,
"val": 255,
"speed": 128
},
"led_flush_limit": 16,
"max_brightness": 255,
"sleep": false,
"speed_steps": 16,
"val_steps": 16
},
"rgblight": {
"default": {
"animation": "static_light",
"on": true,
"hue": 0,
"sat": 255,
"val": 255,
"speed": 0
},
"brightness_steps": 17,
"hue_steps": 8,
"max_brightness": 255,
"saturation_steps": 17,
"sleep": false
},
"rgb_matrix": {
"default": {
"animation": "cycle_left_right",
"on": true,
"hue": 0,
"sat": 255,
"val": 255,
"speed": 128
},
"hue_steps": 8,
"led_flush_limit": 16,
"max_brightness": 255,
"sat_steps": 16,
"sleep": false,
"speed_steps": 16,
"val_steps": 16
},
"split": {
"serial": {
"driver": "bitbang"
}
},
"ws2812": {
"driver": "bitbang"
}
}

View File

@@ -53,8 +53,8 @@
"WS2812_DRIVER": {"info_key": "ws2812.driver"}, "WS2812_DRIVER": {"info_key": "ws2812.driver"},
// Items we want flagged in lint // Items we want flagged in lint
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
"CONVERT_TO_PROTON_C": {"info_key": "_deprecated.ctpc", "deprecated": true, "replace_with": "CONVERT_TO=proton_c"},
"DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true}, "DEFAULT_FOLDER": {"info_key": "_deprecated.default_folder", "deprecated": true},
"CTPC": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
"CONVERT_TO_PROTON_C": {"info_key": "_invalid.ctpc", "invalid": true, "replace_with": "CONVERT_TO=proton_c"},
"VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true} "VIAL_ENABLE": {"info_key": "_invalid.vial", "invalid": true}
} }

View File

@@ -146,6 +146,9 @@
"daisy": { "daisy": {
"target": "ktec/daisy" "target": "ktec/daisy"
}, },
"deemen17/de60": {
"target": "deemen17/de60/r1"
},
"dp3000": { "dp3000": {
"target": "dp3000/rev1" "target": "dp3000/rev1"
}, },
@@ -347,6 +350,9 @@
"keycapsss/plaid_pad": { "keycapsss/plaid_pad": {
"target": "keycapsss/plaid_pad/rev1" "target": "keycapsss/plaid_pad/rev1"
}, },
"keyten/kt60hs_t": {
"target": "keyten/kt60hs_t/v1"
},
"kira75": { "kira75": {
"target": "kira/kira75" "target": "kira/kira75"
}, },
@@ -581,6 +587,9 @@
"ploopyco/trackball": { "ploopyco/trackball": {
"target": "ploopyco/trackball/rev1_005" "target": "ploopyco/trackball/rev1_005"
}, },
"plywrks/ply8x": {
"target": "plywrks/ply8x/solder"
},
"polilla": { "polilla": {
"target": "polilla/rev1" "target": "polilla/rev1"
}, },
@@ -1033,7 +1042,7 @@
"target": "kprepublic/bm68hsrgb/rev1" "target": "kprepublic/bm68hsrgb/rev1"
}, },
"late9/rev1": { "late9/rev1": {
"target": "rookiebwoy/late9/rev1" "target": "ivndbt/late9/rev1"
}, },
"latin17rgb": { "latin17rgb": {
"target": "latincompass/latin17rgb" "target": "latincompass/latin17rgb"
@@ -1198,7 +1207,7 @@
"target": "spaceholdings/nebula68b" "target": "spaceholdings/nebula68b"
}, },
"neopad/rev1": { "neopad/rev1": {
"target": "rookiebwoy/neopad/rev1" "target": "ivndbt/neopad/rev1"
}, },
"niu_mini": { "niu_mini": {
"target": "kbdfans/niu_mini" "target": "kbdfans/niu_mini"
@@ -2095,10 +2104,16 @@
"target": "rmi_kb/wete/v2" "target": "rmi_kb/wete/v2"
}, },
"rookiebwoy/late9": { "rookiebwoy/late9": {
"target": "rookiebwoy/late9/rev1" "target": "ivndbt/late9/rev1"
}, },
"rookiebwoy/neopad": { "rookiebwoy/neopad": {
"target": "rookiebwoy/neopad/rev1" "target": "ivndbt/neopad/rev1"
},
"ivndbt/late9": {
"target": "ivndbt/late9/rev1"
},
"ivndbt/neopad": {
"target": "ivndbt/neopad/rev1"
}, },
"rura66": { "rura66": {
"target": "rura66/rev1" "target": "rura66/rev1"

View File

@@ -1,7 +1,7 @@
{ {
"$id": "qmk.api.keyboard.v1", "$id": "qmk.api.keyboard.v1",
"allOf": [ "allOf": [
{"$ref": "qmk.keyboard.v1"}, {"$ref": "./keyboard.jsonschema#"},
{ {
"properties": { "properties": {
"keymaps": { "keymaps": {
@@ -10,8 +10,8 @@
"url": {"type": "string"} "url": {"type": "string"}
} }
}, },
"parse_errors": {"$ref": "qmk.definitions.v1#/string_array"}, "parse_errors": {"$ref": "./definitions.jsonschema#/string_array"},
"parse_warnings": {"$ref": "qmk.definitions.v1#/string_array"}, "parse_warnings": {"$ref": "./definitions.jsonschema#/string_array"},
"processor_type": {"type": "string"}, "processor_type": {"type": "string"},
"protocol": {"type": "string"}, "protocol": {"type": "string"},
"keyboard_folder": {"type": "string"}, "keyboard_folder": {"type": "string"},

View File

@@ -3,15 +3,16 @@
"$id": "qmk.community_module.v1", "$id": "qmk.community_module.v1",
"title": "Community Module Information", "title": "Community Module Information",
"type": "object", "type": "object",
"required": ["module_name", "maintainer"] "required": ["module_name", "maintainer"],
"properties": { "properties": {
"module_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, "module_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, "maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"license": {"type": "string"},
"url": { "url": {
"type": "string", "type": "string",
"format": "uri" "format": "uri"
}, },
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"features": {"$ref": "qmk.keyboard.v1#/definitions/features_config"}, "features": {"$ref": "./keyboard.jsonschema#/definitions/features_config"}
} }
} }

View File

@@ -17,9 +17,9 @@
"additionalProperties": false, "additionalProperties": false,
"required": ["pin_a", "pin_b"], "required": ["pin_a", "pin_b"],
"properties": { "properties": {
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin_a": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin_b": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"} "resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
} }
} }
@@ -28,22 +28,22 @@
"dip_switch_config": { "dip_switch_config": {
"type": "object", "type": "object",
"properties": { "properties": {
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
} }
}
"features_config": {
"$ref": "qmk.definitions.v1#/boolean_array",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"},
"not": {"required": ["lto"]}
}, },
"features_config": {
"$ref": "./definitions.jsonschema#/boolean_array",
"propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"not": {"required": ["lto"]}
}
}, },
"type": "object", "type": "object",
"not": {"required": ["vendorId", "productId"]}, // reject via keys... "not": {"required": ["vendorId", "productId"]}, // reject via keys...
"properties": { "properties": {
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keyboard_name": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keyboard_folder": {"$ref": "qmk.definitions.v1#/keyboard"}, "keyboard_folder": {"$ref": "./definitions.jsonschema#/keyboard"},
"maintainer": {"$ref": "qmk.definitions.v1#/text_identifier"}, "maintainer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"manufacturer": {"$ref": "qmk.definitions.v1#/text_identifier"}, "manufacturer": {"$ref": "./definitions.jsonschema#/text_identifier"},
"url": { "url": {
"type": "string", "type": "string",
"format": "uri" "format": "uri"
@@ -84,6 +84,7 @@
"STM32F407", "STM32F407",
"STM32F411", "STM32F411",
"STM32F446", "STM32F446",
"STM32G0B1",
"STM32G431", "STM32G431",
"STM32G474", "STM32G474",
"STM32H723", "STM32H723",
@@ -118,8 +119,8 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"default_brightness": { "default_brightness": {
"type": "integer", "type": "integer",
"minimum": 0, "minimum": 0,
@@ -144,13 +145,13 @@
"enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"] "enum": ["dac_additive", "dac_basic", "pwm_software", "pwm_hardware"]
}, },
"macro_beep": {"type": "boolean"}, "macro_beep": {"type": "boolean"},
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"power_control": { "power_control": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"on_state": {"$ref": "qmk.definitions.v1#/bit"}, "on_state": {"$ref": "./definitions.jsonschema#/bit"},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"} "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
} }
}, },
"voices": {"type": "boolean"} "voices": {"type": "boolean"}
@@ -170,20 +171,20 @@
"properties": { "properties": {
"on": {"type": "boolean"}, "on": {"type": "boolean"},
"breathing": {"type": "boolean"}, "breathing": {"type": "boolean"},
"brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
}, },
"breathing": {"type": "boolean"}, "breathing": {"type": "boolean"},
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "breathing_period": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"levels": { "levels": {
"type": "integer", "type": "integer",
"minimum": 1, "minimum": 1,
"maximum": 31 "maximum": 31
}, },
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "pins": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"on_state": {"$ref": "qmk.definitions.v1#/bit"}, "on_state": {"$ref": "./definitions.jsonschema#/bit"},
"as_caps_lock": {"type": "boolean"} "as_caps_lock": {"type": "boolean"}
} }
}, },
@@ -268,7 +269,7 @@
"type": "string", "type": "string",
"enum": ["COL2ROW", "ROW2COL"] "enum": ["COL2ROW", "ROW2COL"]
}, },
"debounce": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "debounce": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"caps_word": { "caps_word": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -276,20 +277,20 @@
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"both_shifts_turns_on": {"type": "boolean"}, "both_shifts_turns_on": {"type": "boolean"},
"double_tap_shift_turns_on": {"type": "boolean"}, "double_tap_shift_turns_on": {"type": "boolean"},
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"invert_on_shift": {"type": "boolean"} "invert_on_shift": {"type": "boolean"}
} }
}, },
"combo": { "combo": {
"type": "object", "type": "object",
"properties": { "properties": {
"count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"} "term": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"community_layouts": { "community_layouts": {
"type": "array", "type": "array",
"items": {"$ref": "qmk.definitions.v1#/filename"} "items": {"$ref": "./definitions.jsonschema#/filename"}
}, },
"dip_switch": { "dip_switch": {
"$ref": "#/definitions/dip_switch_config", "$ref": "#/definitions/dip_switch_config",
@@ -319,10 +320,10 @@
"properties": { "properties": {
"driver": { "driver": {
"type": "string", "type": "string",
"enum": ["custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"] "enum": ["none", "custom", "embedded_flash", "legacy", "rp2040_flash", "spi_flash"]
}, },
"backing_size": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "backing_size": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"logical_size": {"$ref": "qmk.definitions.v1#/unsigned_int"} "logical_size": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
} }
} }
@@ -337,12 +338,12 @@
"indicators": { "indicators": {
"type": "object", "type": "object",
"properties": { "properties": {
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "caps_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "num_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "scroll_lock": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "compose": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "kana": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"on_state": {"$ref": "qmk.definitions.v1#/bit"} "on_state": {"$ref": "./definitions.jsonschema#/bit"}
} }
}, },
"joystick": { "joystick": {
@@ -350,20 +351,20 @@
"properties": { "properties": {
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"driver": {"type": "string"}, "driver": {"type": "string"},
"button_count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "button_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"axis_resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "axis_resolution": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"axes": { "axes": {
"type": "object", "type": "object",
"propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]} "propertyNames": {"enum": ["x", "y", "z", "rx", "ry", "rz"]},
"additionalProperties": { "additionalProperties": {
"oneOf": [ "oneOf": [
{ {
"type": "object", "type": "object",
"properties": { "properties": {
"input_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "input_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"low": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "low": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"rest": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "rest": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"high": {"$ref": "qmk.definitions.v1#/unsigned_int"} "high": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
{ {
@@ -375,20 +376,20 @@
} }
} }
}, },
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"layer_lock": { "layer_lock": {
"type": "object", "type": "object",
"properties": { "properties": {
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"layout_aliases": { "layout_aliases": {
"type": "object", "type": "object",
"additionalProperties": {"$ref": "qmk.definitions.v1#/layout_macro"} "additionalProperties": {"$ref": "./definitions.jsonschema#/layout_macro"}
}, },
"layouts": { "layouts": {
"type": "object", "type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/layout_macro"}, "propertyNames": {"$ref": "./definitions.jsonschema#/layout_macro"},
"additionalProperties": { "additionalProperties": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -403,7 +404,7 @@
"additionalProperties": false, "additionalProperties": false,
"required": ["x", "y"], "required": ["x", "y"],
"properties": { "properties": {
"encoder": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "encoder": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"label": { "label": {
"type": "string", "type": "string",
"pattern": "^[^\\n]*$" "pattern": "^[^\\n]*$"
@@ -417,13 +418,13 @@
"minimum": 0 "minimum": 0
} }
}, },
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"}, "r": {"$ref": "./definitions.jsonschema#/signed_decimal"},
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, "rx": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, "ry": {"$ref": "./definitions.jsonschema#/unsigned_decimal"},
"h": {"$ref": "qmk.definitions.v1#/key_unit"}, "h": {"$ref": "./definitions.jsonschema#/key_unit"},
"w": {"$ref": "qmk.definitions.v1#/key_unit"}, "w": {"$ref": "./definitions.jsonschema#/key_unit"},
"x": {"$ref": "qmk.definitions.v1#/key_unit"}, "x": {"$ref": "./definitions.jsonschema#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"}, "y": {"$ref": "./definitions.jsonschema#/key_unit"},
"hand": { "hand": {
"type": "string", "type": "string",
"enum": ["L", "R", "*"] "enum": ["L", "R", "*"]
@@ -443,12 +444,24 @@
} }
} }
}, },
"host": {
"type": "object",
"properties": {
"default": {
"type": "object",
"additionalProperties": false,
"properties": {
"nkro": {"type": "boolean"}
}
}
}
},
"leader_key": { "leader_key": {
"type": "object", "type": "object",
"properties": { "properties": {
"timing": {"type": "boolean"}, "timing": {"type": "boolean"},
"strict_processing": {"type": "boolean"}, "strict_processing": {"type": "boolean"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"matrix_pins": { "matrix_pins": {
@@ -458,14 +471,14 @@
"custom": {"type": "boolean"}, "custom": {"type": "boolean"},
"custom_lite": {"type": "boolean"}, "custom_lite": {"type": "boolean"},
"ghost": {"type": "boolean"}, "ghost": {"type": "boolean"},
"input_pressed_state": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "input_pressed_state": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"io_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "io_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"direct": { "direct": {
"type": "array", "type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} "items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
}, },
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} "rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
} }
}, },
"modules": { "modules": {
@@ -478,18 +491,18 @@
"type": "object", "type": "object",
"properties": { "properties": {
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"max_speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "max_speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"time_to_max": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "time_to_max": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"wheel_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "wheel_delay": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
}, },
"oneshot": { "oneshot": {
"type": "object", "type": "object",
"properties": { "properties": {
"tap_toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "tap_toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"led_matrix": { "led_matrix": {
@@ -497,7 +510,7 @@
"properties": { "properties": {
"animations": { "animations": {
"type": "object", "type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"} "additionalProperties": {"type": "boolean"}
}, },
"default": { "default": {
@@ -506,8 +519,8 @@
"properties": { "properties": {
"on": {"type": "boolean"}, "on": {"type": "boolean"},
"animation": {"type": "string"}, "animation": {"type": "string"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
}, },
"driver": { "driver": {
@@ -533,27 +546,28 @@
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}, },
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"react_on_keyup": {"type": "boolean"}, "react_on_keyup": {"type": "boolean"},
"sleep": {"type": "boolean"}, "sleep": {"type": "boolean"},
"split_count": { "split_count": {
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}, },
"layout": { "layout": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"required": ["x", "y"],
"properties": { "properties": {
"matrix": { "matrix": {
"type": "array", "type": "array",
@@ -564,9 +578,9 @@
"minimum": 0 "minimum": 0
} }
}, },
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
} }
} }
@@ -577,7 +591,7 @@
"properties": { "properties": {
"animations": { "animations": {
"type": "object", "type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"} "additionalProperties": {"type": "boolean"}
}, },
"default": { "default": {
@@ -586,10 +600,10 @@
"properties": { "properties": {
"on": {"type": "boolean"}, "on": {"type": "boolean"},
"animation": {"type": "string"}, "animation": {"type": "string"},
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
}, },
"driver": { "driver": {
@@ -617,29 +631,30 @@
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
}, },
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sat_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "sat_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"val_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "val_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"speed_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "speed_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_flush_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "led_flush_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_process_limit": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "led_process_limit": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"react_on_keyup": {"type": "boolean"}, "react_on_keyup": {"type": "boolean"},
"sleep": {"type": "boolean"}, "sleep": {"type": "boolean"},
"split_count": { "split_count": {
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}, },
"layout": { "layout": {
"type": "array", "type": "array",
"items": { "items": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"required": ["x", "y"],
"properties": { "properties": {
"matrix": { "matrix": {
"type": "array", "type": "array",
@@ -650,9 +665,9 @@
"minimum": 0 "minimum": 0
} }
}, },
"x": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "x": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"y": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "y": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "flags": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
} }
} }
@@ -664,27 +679,27 @@
"properties": { "properties": {
"animations": { "animations": {
"type": "object", "type": "object",
"propertyNames": {"$ref": "qmk.definitions.v1#/snake_case"}, "propertyNames": {"$ref": "./definitions.jsonschema#/snake_case"},
"additionalProperties": {"type": "boolean"} "additionalProperties": {"type": "boolean"}
}, },
"brightness_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "brightness_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"default": { "default": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"on": {"type": "boolean"}, "on": {"type": "boolean"},
"animation": {"type": "string"}, "animation": {"type": "string"},
"hue": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "hue": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"sat": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "sat": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"val": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "val": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"speed": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "speed": {"$ref": "./definitions.jsonschema#/unsigned_int_8"}
} }
}, },
"driver": { "driver": {
"type": "string", "type": "string",
"enum": ["apa102", "custom", "ws2812"] "enum": ["apa102", "custom", "ws2812"]
}, },
"hue_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "hue_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"layers": { "layers": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -699,29 +714,29 @@
"override_rgb": {"type": "boolean"} "override_rgb": {"type": "boolean"}
} }
}, },
"led_count": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "led_count": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"led_map": { "led_map": {
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
}, },
"max_brightness": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "max_brightness": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"pin": { "pin": {
"$ref": "qmk.definitions.v1#/mcu_pin", "$ref": "./definitions.jsonschema#/mcu_pin",
"$comment": "Deprecated: use ws2812.pin instead" "$comment": "Deprecated: use ws2812.pin instead"
}, },
"rgbw": { "rgbw": {
"type": "boolean", "type": "boolean",
"$comment": "Deprecated: use ws2812.rgbw instead" "$comment": "Deprecated: use ws2812.rgbw instead"
}, },
"saturation_steps": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "saturation_steps": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sleep": {"type": "boolean"}, "sleep": {"type": "boolean"},
"split": {"type": "boolean"}, "split": {"type": "boolean"},
"split_count": { "split_count": {
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"} "items": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
} }
}, },
@@ -730,8 +745,8 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"unlock_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "unlock_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "idle_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"unlock_sequence": { "unlock_sequence": {
"type": "array", "type": "array",
"minItems": 1, "minItems": 1,
@@ -765,8 +780,8 @@
"properties": { "properties": {
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"mouse_enabled": {"type": "boolean"}, "mouse_enabled": {"type": "boolean"},
"clock_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "clock_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"data_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "data_pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"driver": { "driver": {
"type": "string", "type": "string",
"enum": ["busywait", "interrupt", "usart", "vendor"] "enum": ["busywait", "interrupt", "usart", "vendor"]
@@ -803,11 +818,11 @@
"properties": { "properties": {
"direct": { "direct": {
"type": "array", "type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} "items": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
}, },
"cols": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "cols": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"rows": {"$ref": "qmk.definitions.v1#/mcu_pin_array"}, "rows": {"$ref": "./definitions.jsonschema#/mcu_pin_array"},
"unused": {"$ref": "qmk.definitions.v1#/mcu_pin_array"} "unused": {"$ref": "./definitions.jsonschema#/mcu_pin_array"}
} }
} }
} }
@@ -834,16 +849,16 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"matrix_grid": { "matrix_grid": {
"$ref": "qmk.definitions.v1#/mcu_pin_array", "$ref": "./definitions.jsonschema#/mcu_pin_array",
"minItems": 2, "minItems": 2,
"maxItems": 2 "maxItems": 2
} }
} }
}, },
"soft_serial_pin": { "soft_serial_pin": {
"$ref": "qmk.definitions.v1#/mcu_pin", "$ref": "./definitions.jsonschema#/mcu_pin",
"$comment": "Deprecated: use split.serial.pin instead" "$comment": "Deprecated: use split.serial.pin instead"
}, },
"soft_serial_speed": { "soft_serial_speed": {
@@ -859,7 +874,7 @@
"type": "string", "type": "string",
"enum": ["bitbang", "usart", "vendor"] "enum": ["bitbang", "usart", "vendor"]
}, },
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"} "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"}
} }
}, },
"transport": { "transport": {
@@ -887,7 +902,7 @@
} }
}, },
"watchdog": {"type": "boolean"}, "watchdog": {"type": "boolean"},
"watchdog_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "watchdog_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"sync_matrix_state": { "sync_matrix_state": {
"type": "boolean", "type": "boolean",
"$comment": "Deprecated: use sync.matrix_state instead" "$comment": "Deprecated: use sync.matrix_state instead"
@@ -903,8 +918,8 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} "timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"main": { "main": {
@@ -914,7 +929,7 @@
}, },
"matrix_grid": { "matrix_grid": {
"type": "array", "type": "array",
"items": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "items": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"$comment": "Deprecated: use split.handedness.matrix_grid instead" "$comment": "Deprecated: use split.handedness.matrix_grid instead"
} }
} }
@@ -936,9 +951,9 @@
"permissive_hold_per_key": {"type": "boolean"}, "permissive_hold_per_key": {"type": "boolean"},
"retro": {"type": "boolean"}, "retro": {"type": "boolean"},
"retro_per_key": {"type": "boolean"}, "retro_per_key": {"type": "boolean"},
"term": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "term": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"term_per_key": {"type": "boolean"}, "term_per_key": {"type": "boolean"},
"toggle": {"$ref": "qmk.definitions.v1#/unsigned_int"} "toggle": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
}, },
"usb": { "usb": {
@@ -946,16 +961,20 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"device_ver": { "device_ver": {
"$ref": "qmk.definitions.v1#/hex_number_4d", "$ref": "./definitions.jsonschema#/hex_number_4d",
"$comment": "Deprecated: use device_version instead" "$comment": "Deprecated: use device_version instead"
}, },
"device_version": {"$ref": "qmk.definitions.v1#/bcd_version"}, "device_version": {"$ref": "./definitions.jsonschema#/bcd_version"},
"force_nkro": {"type": "boolean"}, "force_nkro": {
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "type": "boolean",
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "$comment": "Deprecated: use host.default.nkro instead"
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"},
},
"pid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
"vid": {"$ref": "./definitions.jsonschema#/hex_number_4d"},
"max_power": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"no_startup_check": {"type": "boolean"}, "no_startup_check": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "polling_interval": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"shared_endpoint": { "shared_endpoint": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -964,7 +983,7 @@
"mouse": {"type": "boolean"} "mouse": {"type": "boolean"}
} }
}, },
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "suspend_wakeup_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"wait_for_enumeration": {"type": "boolean"} "wait_for_enumeration": {"type": "boolean"}
} }
}, },
@@ -972,9 +991,9 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "keys_per_scan": {"$ref": "./definitions.jsonschema#/unsigned_int_8"},
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "tap_keycode_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "tap_capslock_delay": {"$ref": "./definitions.jsonschema#/unsigned_int"},
"locking": { "locking": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@@ -989,10 +1008,10 @@
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"esc_output": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "esc_output": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"esc_input": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "esc_input": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"led": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "led": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"speaker": {"$ref": "qmk.definitions.v1#/mcu_pin"} "speaker": {"$ref": "./definitions.jsonschema#/mcu_pin"}
} }
}, },
"ws2812": { "ws2812": {
@@ -1003,10 +1022,10 @@
"type": "string", "type": "string",
"enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"] "enum": ["bitbang", "custom", "i2c", "pwm", "spi", "vendor"]
}, },
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin": {"$ref": "./definitions.jsonschema#/mcu_pin"},
"rgbw": {"type": "boolean"}, "rgbw": {"type": "boolean"},
"i2c_address": {"$ref": "qmk.definitions.v1#/hex_number_2d"}, "i2c_address": {"$ref": "./definitions.jsonschema#/hex_number_2d"},
"i2c_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"} "i2c_timeout": {"$ref": "./definitions.jsonschema#/unsigned_int"}
} }
} }
} }

View File

@@ -30,10 +30,10 @@
"keycodes": { "keycodes": {
"type": "object", "type": "object",
"propertyNames": { "propertyNames": {
"$ref": "qmk.definitions.v1#/hex_number_4d" "$ref": "./definitions.jsonschema#/hex_number_4d"
}, },
"additionalProperties": { "additionalProperties": {
"type": "object", // use 'qmk.definitions.v1#/keycode_decl' when problem keycodes are removed "type": "object", // use './definitions.jsonschema#/keycode_decl' when problem keycodes are removed
"required": [ "required": [
"key" "key"
], ],

View File

@@ -10,10 +10,10 @@
"minLength": 1, "minLength": 1,
"pattern": "^[a-z][0-9a-z_]*$" "pattern": "^[a-z][0-9a-z_]*$"
}, },
"host_language": {"$ref": "qmk.definitions.v1#/text_identifier"}, "host_language": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keyboard": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keyboard": {"$ref": "./definitions.jsonschema#/text_identifier"},
"keymap": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keymap": {"$ref": "./definitions.jsonschema#/text_identifier"},
"layout": {"$ref": "qmk.definitions.v1#/layout_macro"}, "layout": {"$ref": "./definitions.jsonschema#/layout_macro"},
"layers": { "layers": {
"type": "array", "type": "array",
"items": { "items": {
@@ -55,11 +55,11 @@
"keycodes": { "keycodes": {
"type": "array", "type": "array",
"items": { "items": {
"$ref": "qmk.definitions.v1#/text_identifier" "$ref": "./definitions.jsonschema#/text_identifier"
} }
}, },
"duration": { "duration": {
"$ref": "qmk.definitions.v1#/unsigned_int" "$ref": "./definitions.jsonschema#/unsigned_int"
} }
} }
} }
@@ -67,8 +67,8 @@
} }
} }
}, },
"keycodes": {"$ref": "qmk.definitions.v1#/keycode_decl_array"}, "keycodes": {"$ref": "./definitions.jsonschema#/keycode_decl_array"},
"config": {"$ref": "qmk.keyboard.v1"}, "config": {"$ref": "./keyboard.jsonschema#"},
"notes": { "notes": {
"type": "string" "type": "string"
}, },

View File

@@ -8,7 +8,7 @@
], ],
"properties": { "properties": {
"userspace_version": { "userspace_version": {
"type": "string", "type": "string"
}, }
} }
} }

View File

@@ -6,10 +6,10 @@
"definitions": { "definitions": {
"build_target": { "build_target": {
"oneOf": [ "oneOf": [
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"}, {"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
{"$ref": "qmk.definitions.v1#/json_file_path"} {"$ref": "./definitions.jsonschema#/json_file_path"}
] ]
}, }
}, },
"required": [ "required": [
"userspace_version", "userspace_version",

View File

@@ -6,11 +6,11 @@
"definitions": { "definitions": {
"build_target": { "build_target": {
"oneOf": [ "oneOf": [
{"$ref": "qmk.definitions.v1#/keyboard_keymap_tuple"}, {"$ref": "./definitions.jsonschema#/keyboard_keymap_tuple"},
{"$ref": "qmk.definitions.v1#/keyboard_keymap_env"}, {"$ref": "./definitions.jsonschema#/keyboard_keymap_env"},
{"$ref": "qmk.definitions.v1#/json_file_path"} {"$ref": "./definitions.jsonschema#/json_file_path"}
] ]
}, }
}, },
"required": [ "required": [
"userspace_version", "userspace_version",

View File

@@ -14,8 +14,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": true "nkro": true

299
docs/ChangeLog/20250525.md Normal file
View File

@@ -0,0 +1,299 @@
# QMK Breaking Changes - 2025 May 25 Changelog
## Notable Features
### Flow Tap ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
Adds Flow Tap as a core tap-hold option to disable HRMs during fast typing, aka Global Quick Tap, Require Prior Idle.
Flow Tap modifies mod-tap MT and layer-tap LT keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. It basically disables the hold behavior during fast typing, creating a "flow of taps." It also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
See the [Flow Tap documentation](../tap_hold#flow-tap) for more information.
### Community Modules `1.1.1` ([#25050](https://github.com/qmk/qmk_firmware/pull/25050), [#25187](https://github.com/qmk/qmk_firmware/pull/25187))
Version `1.1.1` introduces support for module defined RGB matrix effects and indicator callbacks, as well as pointing and layer state callbacks.
See the [Community Modules documentation](../features/community_modules) for more information, including the full list of available hooks.
## Changes Requiring User Action
### Updated Keyboard Codebases
| Old Keyboard Name | New Keyboard Name |
|------------------------|----------------------|
| chew | chew/split |
| deemen17/de60fs | deemen17/de60/r1 |
| keyten/kt60hs_t | keyten/kt60hs_t/v1 |
| plywrks/ply8x | plywrks/ply8x/solder |
| rookiebwoy/late9/rev1 | ivndbt/late9/rev1 |
| rookiebwoy/neopad/rev1 | ivndbt/neopad/rev1 |
## Deprecation Notices
In line with the [notice period](../support_deprecation_policy#how-much-advance-notice-will-be-given), deprecation notices for larger items are listed here.
### Deprecation of `qmk generate-compilation-database` ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.
### Deprecation of `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
Unpicking the assumption that only USB can do NKRO, forcing of NKRO on every boot has been deprecated. As this setting persists, it produces unnecessary user confusion when the various NKRO keycodes (for example `NK_TOGG`) do not behave as expected.
The new defaults can be configured in the following ways:
:::::tabs
==== keyboard.json
```json [keyboard.json]
{
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
```
==== keymap.json
```json [keymap.json]
{
"config": {
"host": { // [!code focus]
"default": { // [!code focus]
"nkro": true // [!code focus]
} // [!code focus]
} // [!code focus]
}
}
```
==== config.h
```c [config.h]
#pragma once
#define NKRO_DEFAULT_ON true // [!code focus]
```
:::::
The deprecated options will be removed in a future breaking changes cycle.
### `CTPC`/`CONVERT_TO_PROTON_C` removal ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
Deprecated build options `CTPC` and `CONVERT_TO_PROTON_C` have been removed. Users should of these should migrate to `CONVERT_TO=proton_c`.
see the [Converters Feature](../feature_converters) documentation for more information.
### `DEFAULT_FOLDER` removal ([#23281](https://github.com/qmk/qmk_firmware/pull/23281))
`DEFAULT_FOLDER` was originally introduced to work around limitations within the build system.
Parent folders containing common configuration would create invalid build targets.
With the introduction of [`keyboard.json`](./20240526#keyboard-json) as a configuration file, the build system now has a consistent method to detect build targets.
The `DEFAULT_FOLDER` functionality is now redundant and the intent is for `rules.mk` to become pure configuration.
Backwards compatibility of build targets has been maintained where possible.
### Converter `Pin Compatible` updates ([#20330](https://github.com/qmk/qmk_firmware/pull/20330))
Converter support will be further limited to only function if a keyboard declares that is is compatible.
This can be configured in the following ways:
:::::tabs
==== keyboard.json
```json [keyboard.json]
{
"development_board": "promicro", // [!code focus]
}
```
==== rules.mk
```make [rules.mk]
PIN_COMPATIBLE = promicro
```
:::::
see the [Converters Feature](../feature_converters) documentation for more information.
### Deprecation of `encoder_update_{kb|user}`
These callbacks are now considered end-of-life and will be removed over the next breaking changes cycle, ending August 2025. PRs containing these callbacks will be asked to change to use [encoder mapping](/features/encoders#encoder-map).
`ENCODER_MAP_ENABLE` will subsequently be changed to "default-on" when encoders are enabled, and future breaking changes cycles will remove this flag entirely.
To migrate usage of `encoder_update_user` to encoder map you'll need to handle all of the following changes in your `keymap.c`:
:::::tabs
=== 1. Add keycode definitions
Define new keycodes:
```c
enum {
MY_ENCODER_LEFT = QK_USER, // [!code focus]
MY_ENCODER_RIGHT, // [!code focus]
};
```
=== 2. Add encoder mapping
Add the keycodes to a new encoder map (optionally with transparent layers above, if you want identical functionality of layer-independence):
```c
#if defined(ENCODER_MAP_ENABLE)
const uint16_t PROGMEM encoder_map[][NUM_ENCODERS][NUM_DIRECTIONS] = {
[0] = { ENCODER_CCW_CW(MY_ENCODER_LEFT, MY_ENCODER_RIGHT) }, // [!code focus]
[1] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
[2] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
[3] = { ENCODER_CCW_CW(KC_TRNS, KC_TRNS) }, // [!code focus]
};
#endif
```
=== 3. Add keycode processing
Handle the new keycodes within `process_record_user`, much like any other keycode in your keymap:
```c
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case MY_ENCODER_LEFT: // [!code focus]
if (record->event.pressed) { // [!code focus]
// Add the same code you had in your `encoder_update_user` for the left-rotation code // [!code focus]
} // [!code focus]
return false; // Skip all further processing of this keycode // [!code focus]
case MY_ENCODER_RIGHT: // [!code focus]
if (record->event.pressed) { // [!code focus]
// Add the same code you had in your `encoder_update_user` for the right-rotation code // [!code focus]
} // [!code focus]
return false; // Skip all further processing of this keycode // [!code focus]
}
}
```
=== 4. Remove old code
Remove your implementation of `encoder_update_user` from your `keymap.c`.
::::::
If your board has multiple encoders, each encoder will need its own pair of keycodes defined as per above.
## Full changelist
Core:
* Non-volatile memory data repository pattern ([#24356](https://github.com/qmk/qmk_firmware/pull/24356))
* High resolution scrolling (without feature report parsing) ([#24423](https://github.com/qmk/qmk_firmware/pull/24423))
* Implement battery level interface ([#24666](https://github.com/qmk/qmk_firmware/pull/24666))
* get_keycode_string(): function to format keycodes as strings, for more readable debug logging. ([#24787](https://github.com/qmk/qmk_firmware/pull/24787))
* [Cleanup] Handling of optional `*.mk` files ([#24952](https://github.com/qmk/qmk_firmware/pull/24952))
* Add EOL to non-keyboard files ([#24990](https://github.com/qmk/qmk_firmware/pull/24990))
* use `keycode_string` in unit tests ([#25042](https://github.com/qmk/qmk_firmware/pull/25042))
* Add additional hooks for Community modules ([#25050](https://github.com/qmk/qmk_firmware/pull/25050))
* Remove `CTPC`/`CONVERT_TO_PROTON_C` options ([#25111](https://github.com/qmk/qmk_firmware/pull/25111))
* Flow Tap tap-hold option to disable HRMs during fast typing (aka Global Quick Tap, Require Prior Idle). ([#25125](https://github.com/qmk/qmk_firmware/pull/25125))
* Remove `bluefruit_le_read_battery_voltage` function ([#25129](https://github.com/qmk/qmk_firmware/pull/25129))
* Avoid duplication in generated community modules `rules.mk` ([#25135](https://github.com/qmk/qmk_firmware/pull/25135))
* [chore]: move and rename mouse/scroll min/max defines ([#25141](https://github.com/qmk/qmk_firmware/pull/25141))
* Ignore the Layer Lock key in Repeat Key and Caps Word. ([#25171](https://github.com/qmk/qmk_firmware/pull/25171))
* Allow for disabling EEPROM subsystem entirely. ([#25173](https://github.com/qmk/qmk_firmware/pull/25173))
* Implement connection keycode logic ([#25176](https://github.com/qmk/qmk_firmware/pull/25176))
* Align ChibiOS `USB_WAIT_FOR_ENUMERATION` implementation ([#25184](https://github.com/qmk/qmk_firmware/pull/25184))
* Enable community modules to define LED matrix and RGB matrix effects. ([#25187](https://github.com/qmk/qmk_firmware/pull/25187))
* Bind Bluetooth driver to `host_driver_t` ([#25199](https://github.com/qmk/qmk_firmware/pull/25199))
* Enhance Flow Tap to work better for rolls over multiple tap-hold keys. ([#25200](https://github.com/qmk/qmk_firmware/pull/25200))
* Remove force disable of NKRO when Bluetooth enabled ([#25201](https://github.com/qmk/qmk_firmware/pull/25201))
* [New Feature/Core] New RGB Matrix Animation "Starlight Smooth" ([#25203](https://github.com/qmk/qmk_firmware/pull/25203))
* Add battery changed callbacks ([#25207](https://github.com/qmk/qmk_firmware/pull/25207))
* Generate versions to keycode headers ([#25219](https://github.com/qmk/qmk_firmware/pull/25219))
* Add raw_hid support to host driver ([#25255](https://github.com/qmk/qmk_firmware/pull/25255))
* Deprecate `usb.force_nkro`/`FORCE_NKRO` ([#25262](https://github.com/qmk/qmk_firmware/pull/25262))
* [Chore] use {rgblight,rgb_matrix}_hsv_to_rgb overrides ([#25271](https://github.com/qmk/qmk_firmware/pull/25271))
* Remove outdated `nix` support due to bit-rot. ([#25280](https://github.com/qmk/qmk_firmware/pull/25280))
CLI:
* Align to latest CLI dependencies ([#24553](https://github.com/qmk/qmk_firmware/pull/24553))
* Exclude external userspace from lint checking ([#24680](https://github.com/qmk/qmk_firmware/pull/24680))
* [Modules] Provide access to current path in `rules.mk`. ([#25061](https://github.com/qmk/qmk_firmware/pull/25061))
* Add "license" field to Community Module JSON schema. ([#25085](https://github.com/qmk/qmk_firmware/pull/25085))
* Prompt for converter when creating new keymap ([#25116](https://github.com/qmk/qmk_firmware/pull/25116))
* Extend lint checks to reject duplication of defaults ([#25149](https://github.com/qmk/qmk_firmware/pull/25149))
* Add lint warning for empty url ([#25182](https://github.com/qmk/qmk_firmware/pull/25182))
* Deprecate `qmk generate-compilation-database`. ([#25237](https://github.com/qmk/qmk_firmware/pull/25237))
* Use relative paths for schemas, instead of $id. Enables VScode validation. ([#25251](https://github.com/qmk/qmk_firmware/pull/25251))
Submodule updates:
* STM32G0x1 support ([#24301](https://github.com/qmk/qmk_firmware/pull/24301))
* Update develop branch to Pico SDK 1.5.1 ([#25178](https://github.com/qmk/qmk_firmware/pull/25178))
* Add `compiler_support.h` ([#25274](https://github.com/qmk/qmk_firmware/pull/25274))
Keyboards:
* add 75_(ansi|iso) Community Layouts to mechlovin/olly/octagon ([#22459](https://github.com/qmk/qmk_firmware/pull/22459))
* Add the plywrks ply8x hotswap variant. ([#23558](https://github.com/qmk/qmk_firmware/pull/23558))
* Add Community Layout support to daskeyboard4 ([#23884](https://github.com/qmk/qmk_firmware/pull/23884))
* New standard layout for Savage65 (65_ansi_blocker_tsangan_split_bs) ([#24690](https://github.com/qmk/qmk_firmware/pull/24690))
* Add Icebreaker keyboard ([#24723](https://github.com/qmk/qmk_firmware/pull/24723))
* Update Tractyl Manuform and add F405 (weact) variant ([#24764](https://github.com/qmk/qmk_firmware/pull/24764))
* Chew folders ([#24785](https://github.com/qmk/qmk_firmware/pull/24785))
* modelh: add prerequisites for via support ([#24932](https://github.com/qmk/qmk_firmware/pull/24932))
* Only configure `STM32_HSECLK` within `board.h` ([#25001](https://github.com/qmk/qmk_firmware/pull/25001))
* Allow LVGL onekey keymap to be able compile for other board ([#25005](https://github.com/qmk/qmk_firmware/pull/25005))
* Remove Sofle `rgb_default` keymap & tidy readme's ([#25010](https://github.com/qmk/qmk_firmware/pull/25010))
* Migrate remaining `split.soft_serial_pin` to `split.serial.pin` ([#25046](https://github.com/qmk/qmk_firmware/pull/25046))
* Update keymap for keycult 1800 ([#25070](https://github.com/qmk/qmk_firmware/pull/25070))
* Add kt60HS-T v2 PCB ([#25080](https://github.com/qmk/qmk_firmware/pull/25080))
* Refactor Deemen17 Works DE60 ([#25088](https://github.com/qmk/qmk_firmware/pull/25088))
* Rookiebwoy to ivndbt ([#25142](https://github.com/qmk/qmk_firmware/pull/25142))
* Remove duplication of RGB Matrix defaults ([#25146](https://github.com/qmk/qmk_firmware/pull/25146))
* ymdk/id75/rp2040 ([#25157](https://github.com/qmk/qmk_firmware/pull/25157))
* Remove duplication of RGBLight defaults ([#25169](https://github.com/qmk/qmk_firmware/pull/25169))
* Remove empty `url` fields ([#25181](https://github.com/qmk/qmk_firmware/pull/25181))
* Remove more duplication of defaults ([#25189](https://github.com/qmk/qmk_firmware/pull/25189))
* Remove `"console":false` from keyboards ([#25190](https://github.com/qmk/qmk_firmware/pull/25190))
* Remove `"command":false` from keyboards ([#25193](https://github.com/qmk/qmk_firmware/pull/25193))
* Remove redundant keyboard headers ([#25208](https://github.com/qmk/qmk_firmware/pull/25208))
* Add debounce to duplicated defaults check ([#25246](https://github.com/qmk/qmk_firmware/pull/25246))
* Remove duplicate of SPI default config from keyboards ([#25266](https://github.com/qmk/qmk_firmware/pull/25266))
* Resolve miscellaneous keyboard lint warnings ([#25268](https://github.com/qmk/qmk_firmware/pull/25268))
* Configure boards to use development_board - 0-9 ([#25287](https://github.com/qmk/qmk_firmware/pull/25287))
* Configure boards to use development_board - UVWXYZ ([#25288](https://github.com/qmk/qmk_firmware/pull/25288))
* Configure boards to use development_board - S ([#25293](https://github.com/qmk/qmk_firmware/pull/25293))
* Configure boards to use development_board - T ([#25294](https://github.com/qmk/qmk_firmware/pull/25294))
Keyboard fixes:
* Fix `boardsource/beiwagon` RGB Matrix coordinates ([#25018](https://github.com/qmk/qmk_firmware/pull/25018))
* amptrics/0422 - Prevent OOB in `update_leds_for_layer` ([#25209](https://github.com/qmk/qmk_firmware/pull/25209))
* salicylic_acid3/getta25 - Fix oled keymap ([#25295](https://github.com/qmk/qmk_firmware/pull/25295))
Others:
* Require 'x'/'y' properties for LED/RGB Matrix layout ([#24997](https://github.com/qmk/qmk_firmware/pull/24997))
* Align `new-keyboard` template to current standards ([#25191](https://github.com/qmk/qmk_firmware/pull/25191))
Bugs:
* Fix OS_DETECTION_KEYBOARD_RESET ([#25015](https://github.com/qmk/qmk_firmware/pull/25015))
* Fix outdated GPIO control function usage ([#25060](https://github.com/qmk/qmk_firmware/pull/25060))
* Cater for use of `__errno_r()` in ChibiOS syscalls.c with newer picolibc revisions ([#25121](https://github.com/qmk/qmk_firmware/pull/25121))
* Fixup eeconfig lighting reset. ([#25166](https://github.com/qmk/qmk_firmware/pull/25166))
* Fix for Flow Tap: fix handling of distinct taps and timer updates. ([#25175](https://github.com/qmk/qmk_firmware/pull/25175))
* Minimise force-included files ([#25194](https://github.com/qmk/qmk_firmware/pull/25194))
* Ensure `qmk_userspace_paths` maintains detected order ([#25204](https://github.com/qmk/qmk_firmware/pull/25204))
* Resolve alias for `qmk new-keymap` keyboard prompts ([#25210](https://github.com/qmk/qmk_firmware/pull/25210))
* gcc15 AVR compilation fixes ([#25238](https://github.com/qmk/qmk_firmware/pull/25238))
* Fix typos introduced by PR #25050 ([#25250](https://github.com/qmk/qmk_firmware/pull/25250))
* Fix Wear Leveling compilation ([#25254](https://github.com/qmk/qmk_firmware/pull/25254))
* Remove more USB only branches from NKRO handling ([#25263](https://github.com/qmk/qmk_firmware/pull/25263))
* [Fix] lib8tion: enable fixed scale8 and blend functions ([#25272](https://github.com/qmk/qmk_firmware/pull/25272))
* Fix tap_hold code blocks ([#25298](https://github.com/qmk/qmk_firmware/pull/25298))

View File

@@ -207,7 +207,7 @@
{ "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" }, { "text": "My Pull Request Was Flagged", "link": "/breaking_changes_instructions" },
{ {
"text": "Most Recent ChangeLog", "text": "Most Recent ChangeLog",
"link": "/ChangeLog/20250223" "link": "/ChangeLog/20250525"
}, },
{ "text": "Past Breaking Changes", "link": "/breaking_changes_history" }, { "text": "Past Breaking Changes", "link": "/breaking_changes_history" },
{ "text": "Deprecation Policy", "link": "/support_deprecation_policy" } { "text": "Deprecation Policy", "link": "/support_deprecation_policy" }
@@ -227,6 +227,7 @@
{ "text": "ADC Driver", "link": "/drivers/adc" }, { "text": "ADC Driver", "link": "/drivers/adc" },
{ "text": "APA102 Driver", "link": "/drivers/apa102" }, { "text": "APA102 Driver", "link": "/drivers/apa102" },
{ "text": "Audio Driver", "link": "/drivers/audio" }, { "text": "Audio Driver", "link": "/drivers/audio" },
{ "text": "Battery Driver", "link": "/drivers/battery" },
{ "text": "EEPROM Driver", "link": "/drivers/eeprom" }, { "text": "EEPROM Driver", "link": "/drivers/eeprom" },
{ "text": "Flash Driver", "link": "/drivers/flash" }, { "text": "Flash Driver", "link": "/drivers/flash" },
{ "text": "I2C Driver", "link": "/drivers/i2c" }, { "text": "I2C Driver", "link": "/drivers/i2c" },

View File

@@ -10,25 +10,25 @@ Practically, this means QMK merges the `develop` branch into the `master` branch
## What has been included in past Breaking Changes? ## What has been included in past Breaking Changes?
* [2025 May 25](ChangeLog/20250525)
* [2025 Feb 23](ChangeLog/20250223) * [2025 Feb 23](ChangeLog/20250223)
* [2024 Nov 24](ChangeLog/20241124) * [2024 Nov 24](ChangeLog/20241124)
* [2024 Aug 25](ChangeLog/20240825)
* [Older Breaking Changes](breaking_changes_history) * [Older Breaking Changes](breaking_changes_history)
## When is the next Breaking Change? ## When is the next Breaking Change?
The next Breaking Change is scheduled for May 25, 2025. The next Breaking Change is scheduled for Aug 31, 2025.
### Important Dates ### Important Dates
* 2025 Feb 23 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions. * 2025 May 25 - `develop` is tagged with a new release version. Each push to `master` is subsequently merged to `develop` by GitHub actions.
* 2025 Apr 27 - `develop` closed to new PRs. * 2025 Aug 3 - `develop` closed to new PRs.
* 2025 Apr 27 - Call for testers. * 2025 Aug 3 - Call for testers.
* 2025 May 11 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes * 2025 Aug 17 - Last day for merges -- after this point `develop` is locked for testing and accepts only bugfixes
* 2025 May 18 - `develop` is locked, only critical bugfix PRs merged. * 2025 Aug 24 - `develop` is locked, only critical bugfix PRs merged.
* 2025 May 23 - `master` is locked, no PRs merged. * 2025 Aug 29 - `master` is locked, no PRs merged.
* 2025 May 25 - Merge `develop` to `master`. * 2025 Aug 31 - Merge `develop` to `master`.
* 2025 May 25 - `master` is unlocked. PRs can be merged again. * 2025 Aug 31 - `master` is unlocked. PRs can be merged again.
## What changes will be included? ## What changes will be included?

View File

@@ -2,6 +2,7 @@
This page links to all previous changelogs from the QMK Breaking Changes process. This page links to all previous changelogs from the QMK Breaking Changes process.
* [2025 May 25](ChangeLog/20250525) - version 0.29.0
* [2025 Feb 23](ChangeLog/20250223) - version 0.28.0 * [2025 Feb 23](ChangeLog/20250223) - version 0.28.0
* [2024 Nov 24](ChangeLog/20241124) - version 0.27.0 * [2024 Nov 24](ChangeLog/20241124) - version 0.27.0
* [2024 Aug 25](ChangeLog/20240825) - version 0.26.0 * [2024 Aug 25](ChangeLog/20240825) - version 0.26.0

View File

@@ -6,7 +6,7 @@ The QMK CLI (command line interface) makes building and working with QMK keyboar
### Requirements {#requirements} ### Requirements {#requirements}
QMK requires Python 3.7 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI. QMK requires Python 3.9 or greater. We try to keep the number of requirements small but you will also need to install the packages listed in [`requirements.txt`](https://github.com/qmk/qmk_firmware/blob/master/requirements.txt). These are installed automatically when you install the QMK CLI.
### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew} ### Install Using Homebrew (macOS, some Linux) {#install-using-homebrew}
@@ -18,9 +18,21 @@ export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
``` ```
### Install Using uv {#install-using-uv}
If you have installed [uv](https://docs.astral.sh/uv/), the QMK CLI can be installed and managed as a uv tool:
```
uv tool install qmk
export QMK_HOME='~/qmk_firmware' # Optional, set the location for `qmk_firmware`
qmk setup # This will clone `qmk/qmk_firmware` and optionally set up your build environment
```
This installation can be updated via `uv tool upgrade qmk`. See [Upgrading tools](https://docs.astral.sh/uv/guides/tools/#upgrading-tools) for more information.
### Install Using pip {#install-using-easy_install-or-pip} ### Install Using pip {#install-using-easy_install-or-pip}
If your system is not listed above you can install QMK manually. First ensure that you have Python 3.7 (or later) installed and have installed pip. Then install QMK with this command: If your system is not listed above you can install QMK manually. First ensure that you have Python 3.9 (or later) installed and have installed pip. Then install QMK with this command:
``` ```
python3 -m pip install qmk python3 -m pip install qmk

View File

@@ -17,7 +17,7 @@ qmk compile [-c] <configuratorExport.json>
**Usage for Keymaps**: **Usage for Keymaps**:
``` ```
qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] -kb <keyboard_name> -km <keymap_name> qmk compile [-c] [-e <var>=<value>] [-j <num_jobs>] [--compiledb] -kb <keyboard_name> -km <keymap_name>
``` ```
**Usage in Keyboard Directory**: **Usage in Keyboard Directory**:
@@ -84,6 +84,25 @@ The `num_jobs` argument determines the maximum number of jobs that can be used.
qmk compile -j 0 -kb <keyboard_name> qmk compile -j 0 -kb <keyboard_name>
``` ```
**Compilation Database**:
Creates a `compile_commands.json` file.
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! Compiling using this argument can create this for you.
**Example:**
```
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
$ qmk compile --compiledb
Ψ Making clean
Ψ Gathering build instructions from make ........
Ψ Found 63 compile commands
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
Ψ Compiling keymap with make ........
... build log continues ...
```
## `qmk flash` ## `qmk flash`
This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders. This command is similar to `qmk compile`, but can also target a bootloader. The bootloader is optional, and is set to `:flash` by default. To specify a different bootloader, use `-bl <bootloader>`. Visit the [Flashing Firmware](flashing) guide for more details of the available bootloaders.
@@ -694,33 +713,6 @@ qmk format-c
qmk format-c -b branch_name qmk format-c -b branch_name
``` ```
## `qmk generate-compilation-database`
**Usage**:
```
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
```
Creates a `compile_commands.json` file.
Does your IDE/editor use a language server but doesn't _quite_ find all the necessary include files? Do you hate red squigglies? Do you wish your editor could figure out `#include QMK_KEYBOARD_H`? You might need a [compilation database](https://clang.llvm.org/docs/JSONCompilationDatabase.html)! The qmk tool can build this for you.
This command needs to know which keyboard and keymap to build. It uses the same configuration options as the `qmk compile` command: arguments, current directory, and config files.
**Example:**
```
$ cd ~/qmk_firmware/keyboards/gh60/satan/keymaps/colemak
$ qmk generate-compilation-database
Ψ Making clean
Ψ Gathering build instructions from make -n gh60/satan:colemak
Ψ Found 50 compile commands
Ψ Writing build database to /Users/you/src/qmk_firmware/compile_commands.json
```
Now open your dev environment and live a squiggly-free life.
## `qmk docs` ## `qmk docs`
This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936. This command starts a local HTTP server which you can use for browsing or improving the docs, and provides live reload capability whilst editing. Default port is 8936.
@@ -885,3 +877,13 @@ Run single test:
``` ```
qmk test-c --test basic qmk test-c --test basic
``` ```
## `qmk generate-compilation-database`
**Usage**:
```
qmk generate-compilation-database [-kb KEYBOARD] [-km KEYMAP]
```
This command has been deprecated as it cannot take into account configurables such as [converters](/feature_converters) or environment variables normally specified on the command line; please use the `--compiledb` flag with `qmk compile` instead.

View File

@@ -44,7 +44,7 @@ def hello(cli):
First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function. First we import the `cli` object from `milc`. This is how we interact with the user and control the script's behavior. We use `@cli.argument()` to define a command line flag, `--name`. This also creates a configuration variable named `hello.name` (and the corresponding `user.name`) which the user can set so they don't have to specify the argument. The `cli.subcommand()` decorator designates this function as a subcommand. The name of the subcommand will be taken from the name of the function.
Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator. Once inside our function we find a typical "Hello, World!" program. We use `cli.log` to access the underlying [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects), whose behavior is user controllable. We also access the value for name supplied by the user as `cli.config.hello.name`. The value for `cli.config.hello.name` will be determined by looking at the `--name` argument supplied by the user, if not provided it will use the value in the `qmk.ini` config file, and if neither of those is provided it will fall back to the default supplied in the `cli.argument()` decorator.
# User Interaction # User Interaction
@@ -56,13 +56,13 @@ There are two main methods for outputting text in a subcommand- `cli.log` and `c
You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below. You can use special tokens to colorize your text, to make it easier to understand the output of your program. See [Colorizing Text](#colorizing-text) below.
Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.7/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example. Both of these methods support built-in string formatting using python's [printf style string format operations](https://docs.python.org/3.9/library/stdtypes.html#old-string-formatting). You can use tokens such as `%s` and `%d` within your text strings then pass the values as arguments. See our Hello, World program above for an example.
You should never use the format operator (`%`) directly, always pass values as arguments. You should never use the format operator (`%`) directly, always pass values as arguments.
### Logging (`cli.log`) ### Logging (`cli.log`)
The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.7/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong. The `cli.log` object gives you access to a [Logger Object](https://docs.python.org/3.9/library/logging.html#logger-objects). We have configured our log output to show the user a nice emoji for each log level (or the log level name if their terminal does not support unicode.) This way the user can tell at a glance which messages are most important when something goes wrong.
The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`. The default log level is `INFO`. If the user runs `qmk -v <subcommand>` the default log level will be set to `DEBUG`.

View File

@@ -2,7 +2,7 @@
Most of our style follows PEP8 with some local modifications to make things less nit-picky. Most of our style follows PEP8 with some local modifications to make things less nit-picky.
* We target Python 3.7 for compatibility with all supported platforms. * We target Python 3.9 for compatibility with all supported platforms.
* We indent using four (4) spaces (soft tabs) * We indent using four (4) spaces (soft tabs)
* We encourage liberal use of comments * We encourage liberal use of comments
* Think of them as a story describing the feature * Think of them as a story describing the feature
@@ -317,7 +317,7 @@ At the time of this writing our tests are not very comprehensive. Looking at the
## Integration Tests ## Integration Tests
Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.7/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened. Integration tests can be found in `lib/python/qmk/tests/test_cli_commands.py`. This is where CLI commands are actually run and their overall behavior is verified. We use [`subprocess`](https://docs.python.org/3.9/library/subprocess.html#module-subprocess) to launch each CLI command and a combination of checking output and returncode to determine if the right thing happened.
## Unit Tests ## Unit Tests

View File

@@ -140,8 +140,6 @@ If you define these options you will enable the associated feature, which may in
* `#define ENABLE_COMPILE_KEYCODE` * `#define ENABLE_COMPILE_KEYCODE`
* Enables the `QK_MAKE` keycode * Enables the `QK_MAKE` keycode
* `#define FORCE_NKRO`
* NKRO by default requires to be turned on, this forces it on during keyboard startup regardless of EEPROM setting. NKRO can still be turned off but will be turned on again if the keyboard reboots.
* `#define STRICT_LAYER_RELEASE` * `#define STRICT_LAYER_RELEASE`
* force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases) * force a key release to be evaluated using the current layer stack instead of remembering which layer it came from (used for advanced cases)
@@ -401,6 +399,7 @@ This is a [make](https://www.gnu.org/software/make/manual/make.html) file that i
* `atmel-dfu` * `atmel-dfu`
* `lufa-dfu` * `lufa-dfu`
* `qmk-dfu` * `qmk-dfu`
* `qmk-hid`
* `halfkay` * `halfkay`
* `caterina` * `caterina`
* `bootloadhid` * `bootloadhid`

73
docs/drivers/battery.md Normal file
View File

@@ -0,0 +1,73 @@
# Battery Driver
This driver provides support for sampling battery level.
## Usage
To use this driver, add the following to your `rules.mk`:
```make
BATTERY_DRIVER_REQUIRED = yes
```
## Basic Configuration {#basic-configuration}
Add the following to your `config.h`:
|Define |Default |Description |
|--------------------------|--------|--------------------------------------------------|
|`BATTERY_SAMPLE_INTERVAL` |`30000` |The time between battery samples in milliseconds. |
## Driver Configuration {#driver-configuration}
Driver selection can be configured in `rules.mk` as `BATTERY_DRIVER`. Valid values are `adc` (default), `vendor`, or `custom`. See below for information on individual drivers.
### ADC Driver {#adc-driver}
This is the default battery driver. The default configuration assumes the battery is connected to a ADC capable pin through a voltage divider.
```make
BATTERY_DRIVER = adc
```
The following `#define`s apply only to the `adc` driver:
|Define |Default |Description |
|-----------------------------|--------------|--------------------------------------------------------------|
|`BATTERY_PIN` |*Not defined* |The GPIO pin connected to the voltage divider. |
|`BATTERY_REF_VOLTAGE_MV` |`3300` |The ADC reverence voltage, in millivolts. |
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|`BATTERY_VOLTAGE_DIVIDER_R1` |`100000` |The voltage divider resistance, in kOhm. Set to 0 to disable. |
|`BATTERY_ADC_RESOLUTION` |`10` |The ADC resolution configured for the ADC Driver. |
## Functions
### `uint8_t battery_get_percent(void)` {#api-battery-get-percent}
Sample battery level.
#### Return Value {#api-battery-get-percent-return}
The battery percentage, in the range 0-100.
## Callbacks
### `void battery_percent_changed_user(uint8_t level)` {#api-battery-percent-changed-user}
User hook called when battery level changed.
### Arguments {#api-battery-percent-changed-user-arguments}
- `uint8_t level`
The battery percentage, in the range 0-100.
---
### `void battery_percent_changed_kb(uint8_t level)` {#api-battery-percent-changed-kb}
Keyboard hook called when battery level changed.
### Arguments {#api-battery-percent-changed-kb-arguments}
- `uint8_t level`
The battery percentage, in the range 0-100.

View File

@@ -39,8 +39,6 @@ To enable SPI, modify your board's `halconf.h` to enable SPI, then modify your b
#pragma once #pragma once
#define HAL_USE_SPI TRUE // [!code focus] #define HAL_USE_SPI TRUE // [!code focus]
#define SPI_USE_WAIT TRUE // [!code focus]
#define SPI_SELECT_MODE SPI_SELECT_MODE_PAD // [!code focus]
#include_next <halconf.h> #include_next <halconf.h>
``` ```

View File

@@ -77,6 +77,17 @@ KL: kc: 172, col: 2, row: 0, pressed: 1, time: 16303, int: 0, count: 0
KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0 KL: kc: 172, col: 2, row: 0, pressed: 0, time: 16411, int: 0, count: 0
``` ```
### Which keycode is this keypress?
Keycodes are logged in the example above as numerical codes, which may be difficult to interpret. For more readable logging, add `KEYCODE_STRING_ENABLE = yes` in your `rules.mk` and use `get_keycode_string(kc)`. For example:
```c
uprintf("kc: %s\n", get_keycode_string(keycode));
```
This logs the keycode as a human-readable string like "`LT(2,KC_D)`" rather than a numerical code like "`0x4207`." See the [Keycode String](unit_testing#keycode-string) section of the Unit Testing page for more information.
### How long did it take to scan for a keypress? ### How long did it take to scan for a keypress?
When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h` When testing performance issues, it can be useful to know the frequency at which the switch matrix is being scanned. To enable logging for this scenario, add the following code to your keymaps `config.h`

View File

@@ -72,6 +72,7 @@ A Community Module is denoted by a `qmk_module.json` file such as the following:
{ {
"module_name": "Hello World", "module_name": "Hello World",
"maintainer": "QMK Maintainers", "maintainer": "QMK Maintainers",
"license": "GPL-2.0-or-later",
"features": { "features": {
"deferred_exec": true "deferred_exec": true
}, },
@@ -86,6 +87,10 @@ A Community Module is denoted by a `qmk_module.json` file such as the following:
At minimum, the module must provide the `module_name` and `maintainer` fields. At minimum, the module must provide the `module_name` and `maintainer` fields.
The `license` field is encouraged to indicate the terms for using and sharing the module. It is recommended to use a [SPDX license identifier](https://spdx.org/licenses/) like "`Apache-2.0`" or "`GPL-2.0-or-later`" if possible.
The `url` field may specify a URL to more information about the module.
The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build. The use of `features` matches the definition normally provided within `keyboard.json` and `info.json`, allowing a module to signal to the build system that it has its own dependencies. In the example above, it enables the _deferred executor_ feature whenever the above module is used in a build.
The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap. The `keycodes` array allows a module to provide new keycodes (as well as corresponding aliases) to a keymap.
@@ -118,22 +123,39 @@ The source file may provide functions which allow access to information specifie
Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk). Introspection is a relatively advanced topic within QMK, and existing patterns should be followed. If you need help please [open an issue](https://github.com/qmk/qmk_firmware/issues/new) or [chat with us on Discord](https://discord.gg/qmk).
::: :::
### `led_matrix_module.inc`
This file defines LED matrix effects in the same form as used with `led_matrix_kb.inc` and `led_matrix_user.inc` (see [Custom LED Matrix Effects](led_matrix#custom-led-matrix-effects)). Effect mode names are prepended with `LED_MATRIX_COMMUNITY_MODULE_`.
### `rgb_matrix_module.inc`
This file defines RGB matrix effects in the same form as used with `rgb_matrix_kb.inc` and `rgb_matrix_user.inc` (see [Custom RGB Matrix Effects](rgb_matrix#custom-rgb-matrix-effects)). Effect mode names are prepended with `RGB_MATRIX_COMMUNITY_MODULE_`.
### Compatible APIs ### Compatible APIs
Community Modules may provide specializations for the following APIs: Community Modules may provide specializations for the following APIs:
| Base API | API Format | Example (`hello_world` module) | API Version | | Base API | API Format | Example (`hello_world` module) | API Version |
|----------------------------|-------------------------------------|----------------------------------------|-------------| |----------------------------------|-------------------------------------------|---------------------------------------------|-------------|
| `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` | | `keyboard_pre_init` | `keyboard_pre_init_<module>` | `keyboard_pre_init_hello_world` | `0.1.0` |
| `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` | | `keyboard_post_init` | `keyboard_post_init_<module>` | `keyboard_post_init_hello_world` | `0.1.0` |
| `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` | | `pre_process_record` | `pre_process_record_<module>` | `pre_process_record_hello_world` | `0.1.0` |
| `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` | | `process_record` | `process_record_<module>` | `process_record_hello_world` | `0.1.0` |
| `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` | | `post_process_record` | `post_process_record_<module>` | `post_process_record_hello_world` | `0.1.0` |
| `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` | | `housekeeping_task` | `housekeeping_task_<module>` | `housekeeping_task_hello_world` | `1.0.0` |
| `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` | | `suspend_power_down` | `suspend_power_down_<module>` | `suspend_power_down_hello_world` | `1.0.0` |
| `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` | | `suspend_wakeup_init` | `suspend_wakeup_init_<module>` | `suspend_wakeup_init_hello_world` | `1.0.0` |
| `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` | | `shutdown` | `shutdown_<module>` | `shutdown_hello_world` | `1.0.0` |
| `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` | | `process_detected_host_os` | `process_detected_host_os_<module>` | `process_detected_host_os_hello_world` | `1.0.0` |
| `default_layer_state_set` | `default_layer_state_set_<module>` | `default_layer_state_set_hello_world` | `1.1.0` |
| `layer_state_set` | `layer_state_set_<module>` | `layer_state_set_hello_world` | `1.1.0` |
| `led_matrix_indicators` | `led_matrix_indicators_<module>` | `led_matrix_indicators_hello_world` | `1.1.0` |
| `led_matrix_indicators_advanced` | `led_matrix_indicators_advanced_<module>` | `led_matrix_indicators_advanced_hello_world` | `1.1.0` |
| `rgb_matrix_indicators` | `rgb_matrix_indicators_<module>` | `rgb_matrix_indicators_hello_world` | `1.1.0` |
| `rgb_matrix_indicators_advanced` | `rgb_matrix_indicators_advanced_<module>` | `rgb_matrix_indicators_advanced_hello_world` | `1.1.0` |
| `pointing_device_init` | `pointing_device_init_<module>` | `pointing_device_init_hello_world` | `1.1.0` |
| `pointing_device_task` | `pointing_device_task_<module>` | `pointing_device_task_hello_world` | `1.1.0` |
::: info ::: info
An unspecified API is disregarded if a Community Module does not provide a specialization for it. An unspecified API is disregarded if a Community Module does not provide a specialization for it.

View File

@@ -227,6 +227,8 @@ For inspiration and examples, check out the built-in effects under `quantum/led_
#define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set #define LED_MATRIX_DEFAULT_MODE LED_MATRIX_SOLID // Sets the default mode, if none has been set
#define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set #define LED_MATRIX_DEFAULT_VAL LED_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
#define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set #define LED_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
#define LED_MATRIX_VAL_STEP 8 // The value by which to increment the brightness per adjustment action
#define LED_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action
#define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set #define LED_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
#define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. #define LED_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR

View File

@@ -419,6 +419,32 @@ The `POINTING_DEVICE_CS_PIN`, `POINTING_DEVICE_SDIO_PIN`, and `POINTING_DEVICE_S
Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports. Any pointing device with a lift/contact status can integrate inertial cursor feature into its driver, controlled by `POINTING_DEVICE_GESTURES_CURSOR_GLIDE_ENABLE`. e.g. PMW3360 can use Lift_Stat from Motion register. Note that `POINTING_DEVICE_MOTION_PIN` cannot be used with this feature; continuous polling of `get_report()` is needed to generate glide reports.
::: :::
## High Resolution Scrolling
| Setting | Description | Default |
| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------------- | ------------- |
| `POINTING_DEVICE_HIRES_SCROLL_ENABLE` | (Optional) Enables high resolution scrolling. | _not defined_ |
| `POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER`| (Optional) Resolution mutiplier value used by high resolution scrolling. Must be between 1 and 127, inclusive. | `120` |
| `POINTING_DEVICE_HIRES_SCROLL_EXPONENT` | (Optional) Resolution exponent value used by high resolution scrolling. Must be between 0 and 127, inclusive. | `0` |
The `POINTING_DEVICE_HIRES_SCROLL_ENABLE` setting enables smooth and continuous scrolling when using trackballs or high-end encoders as mouse wheels (as opposed to the typical stepped behavior of most mouse wheels).
This works by adding a resolution multiplier to the HID descriptor for mouse wheel reports, causing the host computer to interpret each wheel tick sent by the keyboard as a fraction of a normal wheel tick.
The resolution multiplier is set to `1 / (POINTING_DEVICE_HIRES_SCROLL_MULTIPLIER * (10 ^ POINTING_DEVICE_HIRES_SCROLL_EXPONENT))`, which is `1 / 120` by default.
If even smoother scrolling than provided by this default value is desired, first try using `#define POINTING_DEVICE_HIRES_SCROLL_EXPONENT 1` which will result in a multiplier of `1 / 1200`.
The function `pointing_device_get_hires_scroll_resolution()` can be called to get the pre-computed resolution multiplier value as a `uint16_t`.
::: warning
High resolution scrolling usually results in larger and/or more frequent mouse reports. This can result in overflow errors and overloading of the host computer's input buffer.
To deal with these issues, define `WHEEL_EXTENDED_REPORT` and throttle the rate at which mouse reports are sent.
:::
::: warning
Many programs, especially those that implement their own smoothing for scrolling, don't work well when they receive simultaneous vertical and horizontal wheel inputs (e.g. from high resolution drag-scroll using a trackball).
These programs typically implement their smoothing in a way that assumes the user will only scroll in one axis at a time, resulting in slow or jittery motion when trying to scroll at an angle.
This can be addressed by snapping scrolling to one axis at a time.
:::
## Split Keyboard Configuration ## Split Keyboard Configuration
The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device. The following configuration options are only available when using `SPLIT_POINTING_ENABLE` see [data sync options](split_keyboard#data-sync-options). The rotation and invert `*_RIGHT` options are only used with `POINTING_DEVICE_COMBINED`. If using `POINTING_DEVICE_LEFT` or `POINTING_DEVICE_RIGHT` use the common configuration above to configure your pointing device.

View File

@@ -150,6 +150,7 @@ enum rgb_matrix_effects {
RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out RGB_MATRIX_SOLID_SPLASH, // Hue & value pulse away from a single key hit then fades value out
RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out RGB_MATRIX_SOLID_MULTISPLASH, // Hue & value pulse away from multiple key hits then fades value out
RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color RGB_MATRIX_STARLIGHT, // LEDs turn on and off at random at varying brightness, maintaining user set color
RGB_MATRIX_STARLIGHT_SMOOTH, // LEDs slowly increase and decrease in brightness randomly
RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30 RGB_MATRIX_STARLIGHT_DUAL_HUE, // LEDs turn on and off at random at varying brightness, modifies user set hue by +- 30
RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30 RGB_MATRIX_STARLIGHT_DUAL_SAT, // LEDs turn on and off at random at varying brightness, modifies user set saturation by +- 30
RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing RGB_MATRIX_RIVERFLOW, // Modification to breathing animation, offset's animation depending on key location to simulate a river flowing
@@ -193,6 +194,7 @@ You can enable a single effect by defining `ENABLE_[EFFECT_NAME]` in your `confi
|`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` | |`#define ENABLE_RGB_MATRIX_PIXEL_FLOW` |Enables `RGB_MATRIX_PIXEL_FLOW` |
|`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` | |`#define ENABLE_RGB_MATRIX_PIXEL_RAIN` |Enables `RGB_MATRIX_PIXEL_RAIN` |
|`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` | |`#define ENABLE_RGB_MATRIX_STARLIGHT` |Enables `RGB_MATRIX_STARLIGHT` |
|`#define ENABLE_RGB_MATRIX_STARLIGHT_SMOOTH` |Enables `RGB_MATRIX_STARLIGHT_SMOOTH` |
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` | |`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_HUE` |Enables `RGB_MATRIX_STARLIGHT_DUAL_HUE` |
|`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` | |`#define ENABLE_RGB_MATRIX_STARLIGHT_DUAL_SAT` |Enables `RGB_MATRIX_STARLIGHT_DUAL_SAT` |
|`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` | |`#define ENABLE_RGB_MATRIX_RIVERFLOW` |Enables `RGB_MATRIX_RIVERFLOW` |
@@ -378,6 +380,10 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
#define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set #define RGB_MATRIX_DEFAULT_SAT 255 // Sets the default saturation value, if none has been set
#define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set #define RGB_MATRIX_DEFAULT_VAL RGB_MATRIX_MAXIMUM_BRIGHTNESS // Sets the default brightness value, if none has been set
#define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set #define RGB_MATRIX_DEFAULT_SPD 127 // Sets the default animation speed, if none has been set
#define RGB_MATRIX_HUE_STEP 8 // The value by which to increment the hue per adjustment action
#define RGB_MATRIX_SAT_STEP 16 // The value by which to increment the saturation per adjustment action
#define RGB_MATRIX_VAL_STEP 16 // The value by which to increment the brightness per adjustment action
#define RGB_MATRIX_SPD_STEP 16 // The value by which to increment the animation speed per adjustment action
#define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set #define RGB_MATRIX_DEFAULT_FLAGS LED_FLAG_ALL // Sets the default LED flags, if none has been set
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. #define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
// If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR // If reactive effects are enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR

View File

@@ -97,9 +97,9 @@ Your RGB lighting can be configured by placing these `#define`s in your `config.
|Define |Default |Description | |Define |Default |Description |
|---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------| |---------------------------|----------------------------|---------------------------------------------------------------------------------------------------------------------------|
|`RGBLIGHT_HUE_STEP` |`8` |The number of steps to cycle through the hue by | |`RGBLIGHT_HUE_STEP` |`8` |The value by which to increment the hue per adjustment action |
|`RGBLIGHT_SAT_STEP` |`17` |The number of steps to increment the saturation by | |`RGBLIGHT_SAT_STEP` |`17` |The value by which to increment the saturation per adjustment action |
|`RGBLIGHT_VAL_STEP` |`17` |The number of steps to increment the brightness by | |`RGBLIGHT_VAL_STEP` |`17` |The value by which to increment the brightness per adjustment action |
|`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level | |`RGBLIGHT_LIMIT_VAL` |`255` |The maximum brightness level |
|`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep | |`RGBLIGHT_SLEEP` |*Not defined* |If defined, the RGB lighting will be switched off when the host goes to sleep |
|`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added | |`RGBLIGHT_SPLIT` |*Not defined* |If defined, synchronization functionality for split keyboards is added |

View File

@@ -8,7 +8,7 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar. Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define FORCE_NKRO` in your `config.h`. To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define NKRO_DEFAULT_ON true` in your `config.h`.
You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys. You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.

View File

@@ -231,7 +231,7 @@ Once you have confirmed that the keyboard is working, if you have used a seperat
If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/) If you found this fullfilling you could experiment by adding additional features such as [in switch LEDs](https://geekhack.org/index.php?topic=94258.0), [in switch RGB](https://www.reddit.com/r/MechanicalKeyboards/comments/5s1l5u/photoskeyboard_science_i_made_a_handwired_rgb/), [RGB underglow](https://medium.com/@DavidNZ/hand-wired-custom-keyboard-cdd14429c7b3#.7a1ovebsk) or even an [OLED display!](https://www.reddit.com/r/olkb/comments/5zy7og/adding_ssd1306_oled_display_to_your_build/)
There are a lot of possibilities inside the firmware - explore [docs.qmk.fm](https://docs.qmk.fm) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help! There are a lot of possibilities inside the firmware - explore [the documentation](/) for a full feature list, and dive into the different keyboards to see how people use all of them. You can always stop by [the OLKB subreddit](https://reddit.com/r/olkb) or [QMK Discord](https://discord.gg/qmk) for help!
## Links to Other Guides ## Links to Other Guides

View File

@@ -85,7 +85,7 @@ Reusing the `VID` and `PID` for multiple boards (such as for two variants, wired
If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past. If there is sufficient ambiguity about a board, supporting evidence will need to be presented to the QMK team. This may include impartial third parties who can demonstrate a board's existence and can confirm its feature set, such as well-known content producers; popular review sites or notable video creators may be leveraged. If such evidence is unavailable, as a last resort the vendor may be required to ship a fully functional board in full retail packaging to QMK maintainers for verification. Engineering samples will not be accepted, as one-off boards have been deceptively used in the past.
PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](https://docs.qmk.fm/pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation. PRs submitted to upstream QMK should not expect an instant merge just because source code has been provided -- code from OEMs has historically been of a quality lower than QMK standards, so as per the [PR checklist](pr_checklist) submitters should make the changes as small as possible and be prepared to change their implementation.
## Detection ## Detection

View File

@@ -101,6 +101,12 @@ Install the QMK CLI by running:
python3 -m pip install --user qmk python3 -m pip install --user qmk
``` ```
Alternatively, install the QMK CLI as a [uv](https://docs.astral.sh/uv/) managed tool, kept isolated in a virtual environment (requires uv to be installed):
```sh
uv tool install qmk
```
#### Community Packages #### Community Packages
These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers. These packages are maintained by community members, so may not be up to date or completely functional. If you encounter problems, please report them to their respective maintainers.

View File

@@ -112,7 +112,7 @@ Restart once you've installed any extensions.
Using the [standard `compile_commands.json` database](https://clang.llvm.org/docs/JSONCompilationDatabase.html), we can get the VS code _clangd_ extension to use the correct includes and defines used for your keyboard and keymap. Using the [standard `compile_commands.json` database](https://clang.llvm.org/docs/JSONCompilationDatabase.html), we can get the VS code _clangd_ extension to use the correct includes and defines used for your keyboard and keymap.
1. Run `qmk generate-compilation-database -kb <keyboard> -km <keymap>` to generate the `compile_commands.json`. 1. Run `qmk compile -kb <keyboard> -km <keymap> --compiledb` to generate the `compile_commands.json`.
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette. 1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.
1. Start typing `clangd: Download Language Server` and select it when it appears. Note that this only needs to be done once on clangd extension installation, if it didn't already ask to do so. 1. Start typing `clangd: Download Language Server` and select it when it appears. Note that this only needs to be done once on clangd extension installation, if it didn't already ask to do so.
1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette. 1. Inside VS code, press <kbd><kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd> (macOS: <kbd><kbd>Command</kbd> + <kbd>Shift</kbd> + <kbd>P</kbd></kbd>) to open the command palette.

View File

@@ -127,7 +127,8 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- empty `xxxx_xxxx_kb()`, `xxxx_xxxx_user()`, or other weak-defined default implemented functions removed - empty `xxxx_xxxx_kb()`, `xxxx_xxxx_user()`, or other weak-defined default implemented functions removed
- commented-out functions removed too - commented-out functions removed too
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions#keyboard_pre_init_-function-documentation) - `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions#keyboard_pre_init_-function-documentation)
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix#lite) - when configuring custom matrix, the 'lite' variant (`CUSTOM_MATRIX = lite`) must be used where possible, as this allows for standard debounce. See [custom matrix 'lite'](custom_matrix#lite)
- justification for full custom matrix (`CUSTOM_MATRIX = yes`) must be provided when used
- prefer LED indicator [Configuration Options](features/led_indicators#configuration-options) to custom `led_update_*()` implementations where possible - prefer LED indicator [Configuration Options](features/led_indicators#configuration-options) to custom `led_update_*()` implementations where possible
- hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here - hardware that's enabled at the keyboard level and requires configuration such as OLED displays or encoders should have basic functionality implemented here
- `<keyboard>.h` - `<keyboard>.h`

View File

@@ -44,7 +44,7 @@ typedef struct __attribute__((packed)) qff_font_descriptor_v1_t {
uint8_t compression_scheme; // compression scheme, see below. uint8_t compression_scheme; // compression scheme, see below.
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented) uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
} qff_font_descriptor_v1_t; } qff_font_descriptor_v1_t;
// _Static_assert(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF"); // STATIC_ASSERT(sizeof(qff_font_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 20), "qff_font_descriptor_v1_t must be 25 bytes in v1 of QFF");
``` ```
The values for `format`, `flags`, `compression_scheme`, and `transparency_index` match [QGF's frame descriptor block](quantum_painter_qgf#qgf-frame-descriptor), with the exception that the `delta` flag is ignored by QFF. The values for `format`, `flags`, `compression_scheme`, and `transparency_index` match [QGF's frame descriptor block](quantum_painter_qgf#qgf-frame-descriptor), with the exception that the `delta` flag is ignored by QFF.
@@ -66,7 +66,7 @@ typedef struct __attribute__((packed)) qff_ascii_glyph_table_v1_t {
qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 } qgf_block_header_v1_t header; // = { .type_id = 0x01, .neg_type_id = (~0x01), .length = 285 }
uint24_t glyph[95]; // 95 glyphs, 0x20..0x7E, see bits/masks above for values uint24_t glyph[95]; // 95 glyphs, 0x20..0x7E, see bits/masks above for values
} qff_ascii_glyph_table_v1_t; } qff_ascii_glyph_table_v1_t;
// _Static_assert(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF"); // STATIC_ASSERT(sizeof(qff_ascii_glyph_table_v1_t) == (sizeof(qgf_block_header_v1_t) + 285), "qff_ascii_glyph_table_v1_t must be 290 bytes in v1 of QFF");
``` ```
## Unicode glyph table {#qff-unicode-table} ## Unicode glyph table {#qff-unicode-table}

View File

@@ -32,7 +32,7 @@ typedef struct __attribute__((packed)) qgf_block_header_v1_t {
uint8_t neg_type_id; // Negated type ID, used for detecting parsing errors uint8_t neg_type_id; // Negated type ID, used for detecting parsing errors
uint24_t length; // 24-bit blob length, allowing for block sizes of a maximum of 16MB uint24_t length; // 24-bit blob length, allowing for block sizes of a maximum of 16MB
} qgf_block_header_v1_t; } qgf_block_header_v1_t;
// _Static_assert(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF"); // STATIC_ASSERT(sizeof(qgf_block_header_v1_t) == 5, "qgf_block_header_v1_t must be 5 bytes in v1 of QGF");
``` ```
The _length_ describes the number of octets in the data following the block header -- a block header may specify a _length_ of `0` if no blob is specified. The _length_ describes the number of octets in the data following the block header -- a block header may specify a _length_ of `0` if no blob is specified.
@@ -56,7 +56,7 @@ typedef struct __attribute__((packed)) qgf_graphics_descriptor_v1_t {
uint16_t image_height; // in pixels uint16_t image_height; // in pixels
uint16_t frame_count; // minimum of 1 uint16_t frame_count; // minimum of 1
} qgf_graphics_descriptor_v1_t; } qgf_graphics_descriptor_v1_t;
// _Static_assert(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF"); // STATIC_ASSERT(sizeof(qgf_graphics_descriptor_v1_t) == (sizeof(qgf_block_header_v1_t) + 18), "qgf_graphics_descriptor_v1_t must be 23 bytes in v1 of QGF");
``` ```
## Frame offset block {#qgf-frame-offset-descriptor} ## Frame offset block {#qgf-frame-offset-descriptor}
@@ -95,7 +95,7 @@ typedef struct __attribute__((packed)) qgf_frame_v1_t {
uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented) uint8_t transparency_index; // palette index used for transparent pixels (not yet implemented)
uint16_t delay; // frame delay time for animations (in units of milliseconds) uint16_t delay; // frame delay time for animations (in units of milliseconds)
} qgf_frame_v1_t; } qgf_frame_v1_t;
// _Static_assert(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF"); // STATIC_ASSERT(sizeof(qgf_frame_v1_t) == (sizeof(qgf_block_header_v1_t) + 6), "qgf_frame_v1_t must be 11 bytes in v1 of QGF");
``` ```
If this frame is grayscale, the _frame descriptor block_ (or _frame delta block_ if flags denote a delta frame) is immediately followed by this frame's corresponding _frame data block_. If this frame is grayscale, the _frame descriptor block_ (or _frame delta block_ if flags denote a delta frame) is immediately followed by this frame's corresponding _frame data block_.
@@ -160,7 +160,7 @@ typedef struct __attribute__((packed)) qgf_delta_v1_t {
uint16_t right; // The right pixel location to to draw the delta image uint16_t right; // The right pixel location to to draw the delta image
uint16_t bottom; // The bottom pixel location to to draw the delta image uint16_t bottom; // The bottom pixel location to to draw the delta image
} qgf_delta_v1_t; } qgf_delta_v1_t;
// _Static_assert(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF"); // STATIC_ASSERT(sizeof(qgf_delta_v1_t) == 13, "qgf_delta_v1_t must be 13 bytes in v1 of QGF");
``` ```
## Frame data block {#qgf-frame-data-descriptor} ## Frame data block {#qgf-frame-data-descriptor}

View File

@@ -274,6 +274,14 @@ Configures the [Encoder](features/encoders) feature.
* The number of edge transitions on both pins required to register an input. * The number of edge transitions on both pins required to register an input.
* Default: `4` * Default: `4`
## Host {#host}
* `host`
* `default`
* `nkro` <Badge type="info">Boolean</Badge>
* The default nkro state.
* Default: `false`
## Indicators {#indicators} ## Indicators {#indicators}
Configures the [LED Indicators](features/led_indicators) feature. Configures the [LED Indicators](features/led_indicators) feature.
@@ -413,7 +421,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
* Default: `16` * Default: `16`
* `led_process_limit` <Badge type="info">Number</Badge> * `led_process_limit` <Badge type="info">Number</Badge>
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness). * Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
* Default: `led_count / 5` * Default: `(led_count + 4) / 5`
* `max_brightness` <Badge type="info">Number</Badge> * `max_brightness` <Badge type="info">Number</Badge>
* The maximum value which brightness is scaled to, from 0 to 255. * The maximum value which brightness is scaled to, from 0 to 255.
* Default: `255` * Default: `255`
@@ -424,7 +432,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
* Turn off the LEDs when the host goes to sleep. * Turn off the LEDs when the host goes to sleep.
* Default: `false` * Default: `false`
* `speed_steps` <Badge type="info">Number</Badge> * `speed_steps` <Badge type="info">Number</Badge>
* The number of speed adjustment steps. * The value by which to increment the speed.
* Default: `16` * Default: `16`
* `split_count` <Badge type="info">Array: Number</Badge> * `split_count` <Badge type="info">Array: Number</Badge>
* For split keyboards, the number of LEDs on each half. * For split keyboards, the number of LEDs on each half.
@@ -433,7 +441,7 @@ Configures the [LED Matrix](features/led_matrix) feature.
* The LED activity timeout in milliseconds. * The LED activity timeout in milliseconds.
* Default: `0` (no timeout) * Default: `0` (no timeout)
* `val_steps` <Badge type="info">Number</Badge> * `val_steps` <Badge type="info">Number</Badge>
* The number of brightness adjustment steps. * The value by which to increment the brightness.
* Default: `8` * Default: `8`
## Matrix {#matrix} ## Matrix {#matrix}
@@ -549,7 +557,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
} }
``` ```
* `brightness_steps` <Badge type="info">Number</Badge> * `brightness_steps` <Badge type="info">Number</Badge>
* The number of brightness adjustment steps. * The value by which to increment the brightness.
* Default: `17` * Default: `17`
* `default` * `default`
* `animation` <Badge type="info">String</Badge> * `animation` <Badge type="info">String</Badge>
@@ -574,7 +582,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
* The driver to use. Must be one of `apa102`, `custom`, `ws2812`. * The driver to use. Must be one of `apa102`, `custom`, `ws2812`.
* Default: `"ws2812"` * Default: `"ws2812"`
* `hue_steps` <Badge type="info">Number</Badge> * `hue_steps` <Badge type="info">Number</Badge>
* The number of hue adjustment steps. * The value by which to increment the hue.
* Default: `8` * Default: `8`
* `layers` * `layers`
* `blink` <Badge type="info">Boolean</Badge> * `blink` <Badge type="info">Boolean</Badge>
@@ -593,7 +601,7 @@ Configures the [RGB Lighting](features/rgblight) feature.
* The maximum value which the HSV "V" component is scaled to, from 0 to 255. * The maximum value which the HSV "V" component is scaled to, from 0 to 255.
* Default: `255` * Default: `255`
* `saturation_steps` <Badge type="info">Number</Badge> * `saturation_steps` <Badge type="info">Number</Badge>
* The number of saturation adjustment steps. * The value by which to increment the suturation.
* Default: `17` * Default: `17`
* `sleep` <Badge type="info">Boolean</Badge> * `sleep` <Badge type="info">Boolean</Badge>
* Turn off the LEDs when the host goes to sleep. * Turn off the LEDs when the host goes to sleep.
@@ -645,7 +653,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
* `driver` <Badge type="info">String</Badge> <Badge>Required</Badge> * `driver` <Badge type="info">String</Badge> <Badge>Required</Badge>
* The driver to use. Must be one of `aw20216s`, `custom`, `is31fl3218`, `is31fl3236`, `is31fl3729`, `is31fl3731`, `is31fl3733`, `is31fl3736`, `is31fl3737`, `is31fl3741`, `is31fl3742a`, `is31fl3743a`, `is31fl3745`, `is31fl3746a`, `snled27351`, `ws2812`. * The driver to use. Must be one of `aw20216s`, `custom`, `is31fl3218`, `is31fl3236`, `is31fl3729`, `is31fl3731`, `is31fl3733`, `is31fl3736`, `is31fl3737`, `is31fl3741`, `is31fl3742a`, `is31fl3743a`, `is31fl3745`, `is31fl3746a`, `snled27351`, `ws2812`.
* `hue_steps` <Badge type="info">Number</Badge> * `hue_steps` <Badge type="info">Number</Badge>
* The number of hue adjustment steps. * The value by which to increment the hue.
* Default: `8` * Default: `8`
* `layout` <Badge type="info">Array: Object</Badge> <Badge>Required</Badge> * `layout` <Badge type="info">Array: Object</Badge> <Badge>Required</Badge>
* List of LED configuration dictionaries. Each dictionary contains: * List of LED configuration dictionaries. Each dictionary contains:
@@ -664,7 +672,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
* Default: `16` * Default: `16`
* `led_process_limit` <Badge type="info">Number</Badge> * `led_process_limit` <Badge type="info">Number</Badge>
* Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness). * Limits the number of LEDs to process in an animation per task run (increases keyboard responsiveness).
* Default: `led_count / 5` * Default: `(led_count + 4) / 5`
* `max_brightness` <Badge type="info">Number</Badge> * `max_brightness` <Badge type="info">Number</Badge>
* The maximum value which the HSV "V" component is scaled to, from 0 to 255. * The maximum value which the HSV "V" component is scaled to, from 0 to 255.
* Default: `255` * Default: `255`
@@ -672,13 +680,13 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
* Animations react to keyup instead of keydown. * Animations react to keyup instead of keydown.
* Default: `false` * Default: `false`
* `sat_steps` <Badge type="info">Number</Badge> * `sat_steps` <Badge type="info">Number</Badge>
* The number of saturation adjustment steps. * The value by which to increment the saturation.
* Default: `16` * Default: `16`
* `sleep` <Badge type="info">Boolean</Badge> * `sleep` <Badge type="info">Boolean</Badge>
* Turn off the LEDs when the host goes to sleep. * Turn off the LEDs when the host goes to sleep.
* Default: `false` * Default: `false`
* `speed_steps` <Badge type="info">Number</Badge> * `speed_steps` <Badge type="info">Number</Badge>
* The number of speed adjustment steps. * The value by which to increment the speed.
* Default: `16` * Default: `16`
* `split_count` <Badge type="info">Array: Number</Badge> * `split_count` <Badge type="info">Array: Number</Badge>
* For split keyboards, the number of LEDs on each half. * For split keyboards, the number of LEDs on each half.
@@ -687,7 +695,7 @@ Configures the [RGB Matrix](features/rgb_matrix) feature.
* The LED activity timeout in milliseconds. * The LED activity timeout in milliseconds.
* Default: `0` (no timeout) * Default: `0` (no timeout)
* `val_steps` <Badge type="info">Number</Badge> * `val_steps` <Badge type="info">Number</Badge>
* The number of brightness adjustment steps. * The value by which to increment the brightness.
* Default: `16` * Default: `16`
## Secure {#secure} ## Secure {#secure}
@@ -818,9 +826,6 @@ Configures the [Stenography](features/stenography) feature.
* `vid` <Badge type="info">String</Badge> <Badge>Required</Badge> * `vid` <Badge type="info">String</Badge> <Badge>Required</Badge>
* The USB vendor ID as a four-digit hexadecimal number. * The USB vendor ID as a four-digit hexadecimal number.
* Example: `"0xC1ED"` * Example: `"0xC1ED"`
* `force_nkro` <Badge type="info">Boolean</Badge>
* Force NKRO to be active.
* Default: `false`
* `max_power` <Badge type="info">Number</Badge> * `max_power` <Badge type="info">Number</Badge>
* The maximum current draw the host should expect from the device. This does not control the actual current usage. * The maximum current draw the host should expect from the device. This does not control the actual current usage.
* Default: `500` (500 mA) * Default: `500` (500 mA)

View File

@@ -425,6 +425,89 @@ uint16_t get_quick_tap_term(uint16_t keycode, keyrecord_t *record) {
If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`. If `QUICK_TAP_TERM` is set higher than `TAPPING_TERM`, it will default to `TAPPING_TERM`.
::: :::
## Flow Tap
Flow Tap modifies mod-tap `MT` and layer-tap `LT` keys such that when pressed within a short timeout of the preceding key, the tapping behavior is triggered. This is particularly useful for home row mods to avoid accidental mod triggers. It basically disables the hold behavior during fast typing, creating a "flow of taps." This also helps to reduce the input lag of tap-hold keys during fast typing, since the tapped behavior is sent immediately.
Flow Tap is enabled by defining `FLOW_TAP_TERM` in your `config.h` with the desired timeout in milliseconds. A timeout of 150&nbsp;ms is recommended as a starting point:
```c
#define FLOW_TAP_TERM 150
```
By default, Flow Tap is enabled when:
* The tap-hold key is pressed within `FLOW_TAP_TERM` milliseconds of the previous key press.
* The tapping keycodes of the previous key and tap-hold key are *both* among `KC_A`&ndash;`KC_Z`, `KC_COMM`, `KC_DOT`, `KC_SCLN`, `KC_SLSH` (the main alphas area of a conventional QWERTY layout) or `KC_SPC`.
As an exception to the above, Flow Tap is temporarily disabled while a tap-hold key is undecided. This is to allow chording multiple mod-tap keys without having to wait out the Flow Tap term.
### is_flow_tap_key()
Optionally, define the `is_flow_tap_key()` callback to specify where Flow Tap is enabled. The callback is called for both the tap-hold key *and* the key press immediately preceding it, and if the callback returns true for both keycodes, Flow Tap is enabled.
The default implementation of this callback is:
```c
bool is_flow_tap_key(uint16_t keycode) {
if ((get_mods() & (MOD_MASK_CG | MOD_BIT_LALT)) != 0) {
return false; // Disable Flow Tap on hotkeys.
}
switch (get_tap_keycode(keycode)) {
case KC_SPC:
case KC_A ... KC_Z:
case KC_DOT:
case KC_COMM:
case KC_SCLN:
case KC_SLSH:
return true;
}
return false;
}
```
Copy the above to your `keymap.c` and edit to customize. For instance, remove the `case KC_SPC` line to disable Flow Tap for the Space key.
### get_flow_tap_term()
Optionally, for further flexibility, define the `get_flow_tap_term()` callback. Flow Tap acts only when key events are closer together than the time returned by the callback. Return a time of 0 to disable filtering. In this way, Flow Tap may be disabled for certain tap-hold keys, or when following certain previous keys.
The default implementation of this callback is
```c
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
uint16_t prev_keycode) {
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
return FLOW_TAP_TERM;
}
return 0;
}
```
In this callback, `keycode` and `record` correspond to the current tap-hold key, and `prev_keycode` is the keycode of the previous key. Return the timeout to use. Returning `0` disables Flow Tap. This callback enables setting per-key timeouts. It is also possible to enable or disable Flow Tap for certain tap-hold keys or when following certain previous keys. Example:
```c
uint16_t get_flow_tap_term(uint16_t keycode, keyrecord_t* record,
uint16_t prev_keycode) {
if (is_flow_tap_key(keycode) && is_flow_tap_key(prev_keycode)) {
switch (keycode) {
case LCTL_T(KC_F):
case RCTL_T(KC_H):
return FLOW_TAP_TERM - 25; // Short timeout on these keys.
default:
return FLOW_TAP_TERM; // Longer timeout otherwise.
}
}
return 0; // Disable Flow Tap.
}
```
::: tip If you define both `is_flow_tap_key()` and `get_flow_tap_term()`, then the latter takes precedence.
:::
## Chordal Hold ## Chordal Hold
Chordal Hold is intended to be used together with either Permissive Hold or Hold Chordal Hold is intended to be used together with either Permissive Hold or Hold

View File

@@ -58,6 +58,34 @@ It's not yet possible to do a full integration test, where you would compile the
In that model you would emulate the input, and expect a certain output from the emulated keyboard. In that model you would emulate the input, and expect a certain output from the emulated keyboard.
# Keycode String {#keycode-string}
It's much nicer to read keycodes as names like "`LT(2,KC_D)`" than numerical codes like "`0x4207`." To convert keycodes to human-readable strings, add `KEYCODE_STRING_ENABLE = yes` to the `rules.mk` file, then use the `get_keycode_string(kc)` function to convert a given 16-bit keycode to a string.
```c
const char *key_name = get_keycode_string(keycode);
dprintf("kc: %s\n", key_name);
```
The stringified keycode may then be logged to console output with `dprintf()` or elsewhere.
::: warning
Use the result of `get_keycode_string()` immediately. Subsequent invocations reuse the same static buffer and overwrite the previous contents.
:::
Many common QMK keycodes are recognized by `get_keycode_string()`, but not all. These include some common basic keycodes, layer switch keycodes, mod-taps, one-shot keycodes, tap dance keycodes, and Unicode keycodes. As a fallback, an unrecognized keycode is written as a hex number.
Optionally, `KEYCODE_STRING_NAMES_USER` may be defined to add names for additional keycodes. For example, supposing keymap.c defines `MYMACRO1` and `MYMACRO2` as custom keycodes, the following adds their names:
```c
KEYCODE_STRING_NAMES_USER(
KEYCODE_STRING_NAME(MYMACRO1),
KEYCODE_STRING_NAME(MYMACRO2),
);
```
Similarly, `KEYCODE_STRING_NAMES_KB` may be defined to add names at the keyboard level.
# Tracing Variables {#tracing-variables} # Tracing Variables {#tracing-variables}
Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption. Sometimes you might wonder why a variable gets changed and where, and this can be quite tricky to track down without having a debugger. It's of course possible to manually add print statements to track it, but you can also enable the variable trace feature. This works for both variables that are changed by the code, and when the variable is changed by some memory corruption.

41
drivers/battery/battery.c Normal file
View File

@@ -0,0 +1,41 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include "battery_driver.h"
#include "battery.h"
#include "timer.h"
#ifndef BATTERY_SAMPLE_INTERVAL
# define BATTERY_SAMPLE_INTERVAL 30000
#endif
static uint8_t last_bat_level = 100;
void battery_init(void) {
battery_driver_init();
last_bat_level = battery_driver_sample_percent();
}
__attribute__((weak)) void battery_percent_changed_user(uint8_t level) {}
__attribute__((weak)) void battery_percent_changed_kb(uint8_t level) {}
static void handle_percent_changed(void) {
battery_percent_changed_user(last_bat_level);
battery_percent_changed_kb(last_bat_level);
}
void battery_task(void) {
static uint32_t bat_timer = 0;
if (timer_elapsed32(bat_timer) > BATTERY_SAMPLE_INTERVAL) {
last_bat_level = battery_driver_sample_percent();
handle_percent_changed();
bat_timer = timer_read32();
}
}
uint8_t battery_get_percent(void) {
return last_bat_level;
}

46
drivers/battery/battery.h Normal file
View File

@@ -0,0 +1,46 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <stdint.h>
/**
* \file
*
* \defgroup battery Battery API
*
* \brief API to query battery status.
* \{
*/
/**
* \brief Initialize the battery driver.
*/
void battery_init(void);
/**
* \brief Perform housekeeping tasks.
*/
void battery_task(void);
/**
* \brief Sample battery level.
*
* \return The battery percentage, in the range 0-100.
*/
uint8_t battery_get_percent(void);
/**
* \brief user hook called when battery level changed.
*
*/
void battery_percent_changed_user(uint8_t level);
/**
* \brief keyboard hook called when battery level changed.
*
*/
void battery_percent_changed_kb(uint8_t level);
/** \} */

View File

@@ -0,0 +1,55 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#include "analog.h"
#include "gpio.h"
#ifndef BATTERY_PIN
# error("BATTERY_PIN not configured!")
#endif
#ifndef BATTERY_REF_VOLTAGE_MV
# define BATTERY_REF_VOLTAGE_MV 3300
#endif
#ifndef BATTERY_VOLTAGE_DIVIDER_R1
# define BATTERY_VOLTAGE_DIVIDER_R1 100
#endif
#ifndef BATTERY_VOLTAGE_DIVIDER_R2
# define BATTERY_VOLTAGE_DIVIDER_R2 100
#endif
// TODO: infer from adc config?
#ifndef BATTERY_ADC_RESOLUTION
# define BATTERY_ADC_RESOLUTION 10
#endif
void battery_driver_init(void) {
gpio_set_pin_input(BATTERY_PIN);
}
uint16_t battery_driver_get_mv(void) {
uint32_t raw = analogReadPin(BATTERY_PIN);
uint32_t bat_mv = raw * BATTERY_REF_VOLTAGE_MV / (1 << BATTERY_ADC_RESOLUTION);
#if BATTERY_VOLTAGE_DIVIDER_R1 > 0 && BATTERY_VOLTAGE_DIVIDER_R2 > 0
bat_mv = bat_mv * (BATTERY_VOLTAGE_DIVIDER_R1 + BATTERY_VOLTAGE_DIVIDER_R2) / BATTERY_VOLTAGE_DIVIDER_R2;
#endif
return bat_mv;
}
uint8_t battery_driver_sample_percent(void) {
uint16_t bat_mv = battery_driver_get_mv();
// https://github.com/zmkfirmware/zmk/blob/3f7c9d7cc4f46617faad288421025ea2a6b0bd28/app/module/drivers/sensor/battery/battery_common.c#L33
if (bat_mv >= 4200) {
return 100;
} else if (bat_mv <= 3450) {
return 0;
}
return bat_mv * 2 / 15 - 459;
}

View File

@@ -0,0 +1,29 @@
// Copyright 2025 QMK
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#include <stdint.h>
/**
* \file
*
* \defgroup battery Battery Driver API
*
* \brief API to query battery status.
* \{
*/
/**
* \brief Initialize the battery driver. This function must be called only once, before any of the below functions can be called.
*/
void battery_driver_init(void);
/**
* \brief Sample battery level.
*
* \return The battery percentage, in the range 0-100.
*/
uint8_t battery_driver_sample_percent(void);
/** \} */

View File

@@ -32,13 +32,8 @@
# define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE # define BLUEFRUIT_LE_SCK_DIVISOR 2 // 4MHz SCK/8MHz CPU, calculated for Feather 32U4 BLE
#endif #endif
#define SAMPLE_BATTERY
#define ConnectionUpdateInterval 1000 /* milliseconds */ #define ConnectionUpdateInterval 1000 /* milliseconds */
#ifndef BATTERY_LEVEL_PIN
# define BATTERY_LEVEL_PIN B5
#endif
static struct { static struct {
bool is_connected; bool is_connected;
bool initialized; bool initialized;
@@ -48,10 +43,6 @@ static struct {
#define UsingEvents 2 #define UsingEvents 2
bool event_flags; bool event_flags;
#ifdef SAMPLE_BATTERY
uint16_t last_battery_update;
uint32_t vbat;
#endif
uint16_t last_connection_update; uint16_t last_connection_update;
} state; } state;
@@ -549,14 +540,6 @@ void bluefruit_le_task(void) {
set_connected(atoi(resbuf)); set_connected(atoi(resbuf));
} }
} }
#ifdef SAMPLE_BATTERY
if (timer_elapsed(state.last_battery_update) > BatteryUpdateInterval && resp_buf.empty()) {
state.last_battery_update = timer_read();
state.vbat = analogReadPin(BATTERY_LEVEL_PIN);
}
#endif
} }
static bool process_queue_item(struct queue_item *item, uint16_t timeout) { static bool process_queue_item(struct queue_item *item, uint16_t timeout) {
@@ -655,10 +638,6 @@ void bluefruit_le_send_mouse(report_mouse_t *report) {
} }
} }
uint32_t bluefruit_le_read_battery_voltage(void) {
return state.vbat;
}
bool bluefruit_le_set_mode_leds(bool on) { bool bluefruit_le_set_mode_leds(bool on) {
if (!state.configured) { if (!state.configured) {
return false; return false;

View File

@@ -45,10 +45,6 @@ extern void bluefruit_le_send_consumer(uint16_t usage);
* change. */ * change. */
extern void bluefruit_le_send_mouse(report_mouse_t *report); extern void bluefruit_le_send_mouse(report_mouse_t *report);
/* Compute battery voltage by reading an analog pin.
* Returns the integer number of millivolts */
extern uint32_t bluefruit_le_read_battery_voltage(void);
extern bool bluefruit_le_set_mode_leds(bool on); extern bool bluefruit_le_set_mode_leds(bool on);
extern bool bluefruit_le_set_power_level(int8_t level); extern bool bluefruit_le_set_power_level(int8_t level);

View File

@@ -1,62 +1,32 @@
/* // Copyright 2025 QMK
* Copyright 2022 // SPDX-License-Identifier: GPL-2.0-or-later
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "bluetooth.h" #include "bluetooth.h"
#if defined(BLUETOOTH_BLUEFRUIT_LE) __attribute__((weak)) void bluetooth_init(void) {}
# include "bluefruit_le.h"
#elif defined(BLUETOOTH_RN42)
# include "rn42.h"
#endif
void bluetooth_init(void) { __attribute__((weak)) void bluetooth_task(void) {}
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_init(); __attribute__((weak)) bool bluetooth_is_connected(void) {
#elif defined(BLUETOOTH_RN42) return true;
rn42_init();
#endif
} }
void bluetooth_task(void) { __attribute__((weak)) bool bluetooth_can_send_nkro(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE) return false;
bluefruit_le_task();
#endif
} }
void bluetooth_send_keyboard(report_keyboard_t *report) { __attribute__((weak)) uint8_t bluetooth_keyboard_leds(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE) return 0;
bluefruit_le_send_keyboard(report);
#elif defined(BLUETOOTH_RN42)
rn42_send_keyboard(report);
#endif
} }
void bluetooth_send_mouse(report_mouse_t *report) { __attribute__((weak)) void bluetooth_send_keyboard(report_keyboard_t *report) {}
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_send_mouse(report);
#elif defined(BLUETOOTH_RN42)
rn42_send_mouse(report);
#endif
}
void bluetooth_send_consumer(uint16_t usage) { __attribute__((weak)) void bluetooth_send_nkro(report_nkro_t *report) {}
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_send_consumer(usage); __attribute__((weak)) void bluetooth_send_mouse(report_mouse_t *report) {}
#elif defined(BLUETOOTH_RN42)
rn42_send_consumer(usage); __attribute__((weak)) void bluetooth_send_consumer(uint16_t usage) {}
#endif
} __attribute__((weak)) void bluetooth_send_system(uint16_t usage) {}
__attribute__((weak)) void bluetooth_send_raw_hid(uint8_t *data, uint8_t length) {}

View File

@@ -30,6 +30,23 @@ void bluetooth_init(void);
*/ */
void bluetooth_task(void); void bluetooth_task(void);
/**
* \brief Detects if Bluetooth is connected.
*
* \return `true` if connected, `false` otherwise.
*/
bool bluetooth_is_connected(void);
/**
* \brief Detects if `bluetooth_send_nkro` should be used over `bluetooth_send_keyboard`.
*/
bool bluetooth_can_send_nkro(void);
/**
* \brief Get current LED state.
*/
uint8_t bluetooth_keyboard_leds(void);
/** /**
* \brief Send a keyboard report. * \brief Send a keyboard report.
* *
@@ -37,6 +54,13 @@ void bluetooth_task(void);
*/ */
void bluetooth_send_keyboard(report_keyboard_t *report); void bluetooth_send_keyboard(report_keyboard_t *report);
/**
* \brief Send a nkro report.
*
* \param report The nkro report to send.
*/
void bluetooth_send_nkro(report_nkro_t *report);
/** /**
* \brief Send a mouse report. * \brief Send a mouse report.
* *
@@ -50,3 +74,18 @@ void bluetooth_send_mouse(report_mouse_t *report);
* \param usage The consumer usage to send. * \param usage The consumer usage to send.
*/ */
void bluetooth_send_consumer(uint16_t usage); void bluetooth_send_consumer(uint16_t usage);
/**
* \brief Send a system usage.
*
* \param usage The system usage to send.
*/
void bluetooth_send_system(uint16_t usage);
/**
* \brief Send a raw_hid packet.
*
* \param data A pointer to the buffer to be sent. Always 32 bytes in length.
* \param length The length of the buffer. Always 32.
*/
void bluetooth_send_raw_hid(uint8_t *data, uint8_t length);

View File

@@ -0,0 +1,71 @@
/*
* Copyright 2022
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "bluetooth.h"
#if defined(BLUETOOTH_BLUEFRUIT_LE)
# include "bluefruit_le.h"
#elif defined(BLUETOOTH_RN42)
# include "rn42.h"
#endif
void bluetooth_init(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_init();
#elif defined(BLUETOOTH_RN42)
rn42_init();
#endif
}
void bluetooth_task(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_task();
#endif
}
bool bluetooth_is_connected(void) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
return bluefruit_le_is_connected();
#else
// TODO: drivers should check if BT is connected here
return true;
#endif
}
void bluetooth_send_keyboard(report_keyboard_t *report) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_send_keyboard(report);
#elif defined(BLUETOOTH_RN42)
rn42_send_keyboard(report);
#endif
}
void bluetooth_send_mouse(report_mouse_t *report) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_send_mouse(report);
#elif defined(BLUETOOTH_RN42)
rn42_send_mouse(report);
#endif
}
void bluetooth_send_consumer(uint16_t usage) {
#if defined(BLUETOOTH_BLUEFRUIT_LE)
bluefruit_le_send_consumer(usage);
#elif defined(BLUETOOTH_RN42)
rn42_send_consumer(usage);
#endif
}

View File

@@ -1,70 +0,0 @@
/*
Copyright 2017 Priyadi Iman Nurcahyo
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "outputselect.h"
#include "usb_util.h"
#ifdef BLUETOOTH_BLUEFRUIT_LE
# include "bluefruit_le.h"
#endif
uint8_t desired_output = OUTPUT_DEFAULT;
/** \brief Set Output
*
* FIXME: Needs doc
*/
void set_output(uint8_t output) {
set_output_user(output);
desired_output = output;
}
/** \brief Set Output User
*
* FIXME: Needs doc
*/
__attribute__((weak)) void set_output_user(uint8_t output) {}
/** \brief Auto Detect Output
*
* FIXME: Needs doc
*/
uint8_t auto_detect_output(void) {
if (usb_connected_state()) {
return OUTPUT_USB;
}
#ifdef BLUETOOTH_BLUEFRUIT_LE
if (bluefruit_le_is_connected()) {
return OUTPUT_BLUETOOTH;
}
#endif
#ifdef BLUETOOTH_ENABLE
return OUTPUT_BLUETOOTH; // should check if BT is connected here
#endif
return OUTPUT_NONE;
}
/** \brief Where To Send
*
* FIXME: Needs doc
*/
uint8_t where_to_send(void) {
if (desired_output == OUTPUT_AUTO) {
return auto_detect_output();
}
return desired_output;
}

View File

@@ -14,21 +14,17 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#pragma once #pragma once
#include <stdint.h> #include "connection.h"
enum outputs { // DEPRECATED - DO NOT USE
OUTPUT_AUTO,
OUTPUT_NONE, #define OUTPUT_AUTO CONNECTION_HOST_AUTO
OUTPUT_USB, #define OUTPUT_NONE CONNECTION_HOST_NONE
OUTPUT_BLUETOOTH #define OUTPUT_USB CONNECTION_HOST_USB
}; #define OUTPUT_BLUETOOTH CONNECTION_HOST_BLUETOOTH
#ifndef OUTPUT_DEFAULT #define set_output connection_set_host_noeeprom
# define OUTPUT_DEFAULT OUTPUT_AUTO #define where_to_send connection_get_host
#endif #define auto_detect_output connection_auto_detect_host
void set_output(uint8_t output); void set_output_user(uint8_t output);
void set_output_user(uint8_t output);
uint8_t auto_detect_output(void);
uint8_t where_to_send(void);

View File

@@ -20,6 +20,6 @@
The size of the transient EEPROM buffer size. The size of the transient EEPROM buffer size.
*/ */
#ifndef TRANSIENT_EEPROM_SIZE #ifndef TRANSIENT_EEPROM_SIZE
# include "eeconfig.h" # include "nvm_eeprom_eeconfig_internal.h"
# define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO # define TRANSIENT_EEPROM_SIZE (((EECONFIG_SIZE + 3) / 4) * 4) // based off eeconfig's current usage, aligned to 4-byte sizes, to deal with LTO
#endif #endif

View File

@@ -19,6 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#include <string.h> #include <string.h>
#include "compiler_support.h"
#include "keyboard.h" #include "keyboard.h"
#include "progmem.h" #include "progmem.h"
#include "timer.h" #include "timer.h"
@@ -265,7 +266,7 @@ void st7565_write_char(const char data, bool invert) {
static uint8_t st7565_temp_buffer[ST7565_FONT_WIDTH]; static uint8_t st7565_temp_buffer[ST7565_FONT_WIDTH];
memcpy(&st7565_temp_buffer, st7565_cursor, ST7565_FONT_WIDTH); memcpy(&st7565_temp_buffer, st7565_cursor, ST7565_FONT_WIDTH);
_Static_assert(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array"); STATIC_ASSERT(sizeof(font) >= ((ST7565_FONT_END + 1 - ST7565_FONT_START) * ST7565_FONT_WIDTH), "ST7565_FONT_END references outside array");
// set the reder buffer data // set the reder buffer data
uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index

View File

@@ -23,6 +23,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# include "keyboard.h" # include "keyboard.h"
# endif # endif
#endif #endif
#include "compiler_support.h"
#include "oled_driver.h" #include "oled_driver.h"
#include OLED_FONT_H #include OLED_FONT_H
#include "timer.h" #include "timer.h"
@@ -601,7 +603,7 @@ void oled_write_char(const char data, bool invert) {
static uint8_t oled_temp_buffer[OLED_FONT_WIDTH]; static uint8_t oled_temp_buffer[OLED_FONT_WIDTH];
memcpy(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH); memcpy(&oled_temp_buffer, oled_cursor, OLED_FONT_WIDTH);
_Static_assert(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array"); STATIC_ASSERT(sizeof(font) >= ((OLED_FONT_END + 1 - OLED_FONT_START) * OLED_FONT_WIDTH), "OLED_FONT_END references outside array");
// set the reder buffer data // set the reder buffer data
uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index uint8_t cast_data = (uint8_t)data; // font based on unsigned type for index

View File

@@ -75,9 +75,9 @@ static void qp_comms_spi_dc_reset_send_command_odd_cs_pulse(painter_device_t dev
painter_driver_t * driver = (painter_driver_t *)device; painter_driver_t * driver = (painter_driver_t *)device;
qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config; qp_comms_spi_dc_reset_config_t *comms_config = (qp_comms_spi_dc_reset_config_t *)driver->comms_config;
writePinLow(comms_config->spi_config.chip_select_pin); gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
qp_comms_spi_dc_reset_send_command(device, cmd); qp_comms_spi_dc_reset_send_command(device, cmd);
writePinHigh(comms_config->spi_config.chip_select_pin); gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
} }
static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) { static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, const void *data, uint32_t byte_count) {
@@ -88,20 +88,20 @@ static uint32_t qp_comms_spi_send_data_odd_cs_pulse(painter_device_t device, con
const uint8_t *p = (const uint8_t *)data; const uint8_t *p = (const uint8_t *)data;
uint32_t max_msg_length = 1024; uint32_t max_msg_length = 1024;
writePinHigh(comms_config->dc_pin); gpio_write_pin_high(comms_config->dc_pin);
while (bytes_remaining > 0) { while (bytes_remaining > 0) {
uint32_t bytes_this_loop = QP_MIN(bytes_remaining, max_msg_length); uint32_t bytes_this_loop = QP_MIN(bytes_remaining, max_msg_length);
bool odd_bytes = bytes_this_loop & 1; bool odd_bytes = bytes_this_loop & 1;
// send data // send data
writePinLow(comms_config->spi_config.chip_select_pin); gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
spi_transmit(p, bytes_this_loop); spi_transmit(p, bytes_this_loop);
p += bytes_this_loop; p += bytes_this_loop;
// extra CS toggle, for alignment // extra CS toggle, for alignment
if (odd_bytes) { if (odd_bytes) {
writePinHigh(comms_config->spi_config.chip_select_pin); gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
writePinLow(comms_config->spi_config.chip_select_pin); gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
} }
bytes_remaining -= bytes_this_loop; bytes_remaining -= bytes_this_loop;
@@ -116,9 +116,9 @@ static uint32_t qp_ili9486_send_data_toggling(painter_device_t device, const uin
uint32_t ret; uint32_t ret;
for (uint8_t j = 0; j < byte_count; ++j) { for (uint8_t j = 0; j < byte_count; ++j) {
writePinLow(comms_config->spi_config.chip_select_pin); gpio_write_pin_low(comms_config->spi_config.chip_select_pin);
ret = qp_comms_spi_dc_reset_send_data(device, &data[j], 1); ret = qp_comms_spi_dc_reset_send_data(device, &data[j], 1);
writePinHigh(comms_config->spi_config.chip_select_pin); gpio_write_pin_high(comms_config->spi_config.chip_select_pin);
} }
return ret; return ret;

View File

@@ -4,6 +4,7 @@
#pragma once #pragma once
#include "compiler_support.h"
#include "i2c_master.h" #include "i2c_master.h"
#include "pointing_device.h" #include "pointing_device.h"
#include "util.h" #include "util.h"
@@ -79,7 +80,7 @@ typedef struct {
azoteq_iqs5xx_relative_xy_t y; azoteq_iqs5xx_relative_xy_t y;
} azoteq_iqs5xx_base_data_t; } azoteq_iqs5xx_base_data_t;
_Static_assert(sizeof(azoteq_iqs5xx_base_data_t) == 10, "azoteq_iqs5xx_basic_report_t should be 10 bytes"); STATIC_ASSERT(sizeof(azoteq_iqs5xx_base_data_t) == 10, "azoteq_iqs5xx_basic_report_t should be 10 bytes");
typedef struct { typedef struct {
uint8_t number_of_fingers; uint8_t number_of_fingers;
@@ -87,7 +88,7 @@ typedef struct {
azoteq_iqs5xx_relative_xy_t y; azoteq_iqs5xx_relative_xy_t y;
} azoteq_iqs5xx_report_data_t; } azoteq_iqs5xx_report_data_t;
_Static_assert(sizeof(azoteq_iqs5xx_report_data_t) == 5, "azoteq_iqs5xx_report_data_t should be 5 bytes"); STATIC_ASSERT(sizeof(azoteq_iqs5xx_report_data_t) == 5, "azoteq_iqs5xx_report_data_t should be 5 bytes");
typedef struct PACKED { typedef struct PACKED {
bool sw_input : 1; bool sw_input : 1;
@@ -159,7 +160,7 @@ typedef struct PACKED {
uint16_t zoom_consecutive_distance; uint16_t zoom_consecutive_distance;
} azoteq_iqs5xx_gesture_config_t; } azoteq_iqs5xx_gesture_config_t;
_Static_assert(sizeof(azoteq_iqs5xx_gesture_config_t) == 24, "azoteq_iqs5xx_gesture_config_t should be 24 bytes"); STATIC_ASSERT(sizeof(azoteq_iqs5xx_gesture_config_t) == 24, "azoteq_iqs5xx_gesture_config_t should be 24 bytes");
typedef struct { typedef struct {
uint16_t x_resolution; uint16_t x_resolution;

View File

@@ -101,12 +101,12 @@ int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_di
} }
mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t *offset) { mouse_xy_report_t pimoroni_trackball_adapt_values(xy_clamp_range_t *offset) {
if (*offset > XY_REPORT_MAX) { if (*offset > MOUSE_REPORT_XY_MAX) {
*offset -= XY_REPORT_MAX; *offset -= MOUSE_REPORT_XY_MAX;
return (mouse_xy_report_t)XY_REPORT_MAX; return (mouse_xy_report_t)MOUSE_REPORT_XY_MAX;
} else if (*offset < XY_REPORT_MIN) { } else if (*offset < MOUSE_REPORT_XY_MIN) {
*offset += XY_REPORT_MAX; *offset += MOUSE_REPORT_XY_MAX;
return (mouse_xy_report_t)XY_REPORT_MIN; return (mouse_xy_report_t)MOUSE_REPORT_XY_MIN;
} else { } else {
mouse_xy_report_t temp_return = *offset; mouse_xy_report_t temp_return = *offset;
*offset = 0; *offset = 0;

View File

@@ -10,6 +10,7 @@
#pragma once #pragma once
#include "compiler_support.h"
#include "keyboard.h" #include "keyboard.h"
#include <stdint.h> #include <stdint.h>
#include "spi_master.h" #include "spi_master.h"
@@ -39,8 +40,8 @@ typedef struct __attribute__((packed)) {
int16_t delta_y; // displacement on y directions. int16_t delta_y; // displacement on y directions.
} pmw33xx_report_t; } pmw33xx_report_t;
_Static_assert(sizeof(pmw33xx_report_t) == 6, "pmw33xx_report_t must be 6 bytes in size"); STATIC_ASSERT(sizeof(pmw33xx_report_t) == 6, "pmw33xx_report_t must be 6 bytes in size");
_Static_assert(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.motion must be 1 byte in size"); STATIC_ASSERT(sizeof((pmw33xx_report_t){0}.motion) == 1, "pmw33xx_report_t.motion must be 1 byte in size");
#if !defined(PMW33XX_CLOCK_SPEED) #if !defined(PMW33XX_CLOCK_SPEED)
# define PMW33XX_CLOCK_SPEED 2000000 # define PMW33XX_CLOCK_SPEED 2000000

View File

@@ -5,6 +5,7 @@
#include "util.h" #include "util.h"
#include "timer.h" #include "timer.h"
#include "wear_leveling.h" #include "wear_leveling.h"
#include "wear_leveling_flash_spi_config.h"
#include "wear_leveling_internal.h" #include "wear_leveling_internal.h"
#ifndef WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT #ifndef WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT

View File

@@ -1,6 +1,5 @@
{ {
"manufacturer": "ven0mtr0n", "manufacturer": "ven0mtr0n",
"url": "",
"maintainer": "vinamarora8", "maintainer": "vinamarora8",
"usb": { "usb": {
"vid": "0x7654", "vid": "0x7654",
@@ -26,8 +25,7 @@
"resync": true "resync": true
} }
}, },
"processor": "atmega32u4", "development_board": "promicro",
"bootloader": "caterina",
"layouts": { "layouts": {
"LAYOUT_1x2uC": { "LAYOUT_1x2uC": {
"layout": [ "layout": [

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "61Key", "keyboard_name": "61Key",
"manufacturer": "0xC7", "manufacturer": "0xC7",
"url": "",
"maintainer": "RealEmanGaming", "maintainer": "RealEmanGaming",
"usb": { "usb": {
"vid": "0xE117", "vid": "0xE117",
@@ -14,7 +13,6 @@
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": true, "command": true,
"console": false,
"extrakey": false, "extrakey": false,
"key_lock": true, "key_lock": true,
"mousekey": false, "mousekey": false,

View File

@@ -65,8 +65,6 @@
"features": { "features": {
"backlight": true, "backlight": true,
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -13,8 +13,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "TutelPad", "keyboard_name": "TutelPad",
"manufacturer": "ItsFiremanSam", "manufacturer": "ItsFiremanSam",
"url": "",
"maintainer": "ItsFiremanSam", "maintainer": "ItsFiremanSam",
"usb": { "usb": {
"vid": "0xCB00", "vid": "0xCB00",
@@ -31,12 +30,9 @@
"ws2812": { "ws2812": {
"pin": "D3" "pin": "D3"
}, },
"processor": "atmega32u4", "development_board": "promicro",
"bootloader": "caterina",
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": false, "mousekey": false,
"nkro": false, "nkro": false,

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "1K", "keyboard_name": "1K",
"manufacturer": "MakotoKurauchi", "manufacturer": "MakotoKurauchi",
"url": "",
"maintainer": "MakotoKurauchi", "maintainer": "MakotoKurauchi",
"usb": { "usb": {
"vid": "0x0009", "vid": "0x0009",

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "1up60hse", "keyboard_name": "1up60hse",
"manufacturer": "1upkeyboards", "manufacturer": "1upkeyboards",
"url": "",
"maintainer": "qmk", "maintainer": "qmk",
"usb": { "usb": {
"vid": "0x6F75", "vid": "0x6F75",

View File

@@ -14,8 +14,6 @@
"features": { "features": {
"backlight": true, "backlight": true,
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": true, "nkro": true,

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "1UP RGB Underglow PCB", "keyboard_name": "1UP RGB Underglow PCB",
"manufacturer": "1upkeyboards", "manufacturer": "1upkeyboards",
"url": "",
"maintainer": "qmk", "maintainer": "qmk",
"usb": { "usb": {
"vid": "0x6F75", "vid": "0x6F75",
@@ -11,8 +10,6 @@
"features": { "features": {
"backlight": true, "backlight": true,
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": true, "nkro": true,

View File

@@ -15,8 +15,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -14,8 +14,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -16,8 +16,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -19,8 +19,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -19,8 +19,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -19,8 +19,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -16,8 +16,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -16,8 +16,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -16,8 +16,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -16,8 +16,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "super16", "keyboard_name": "super16",
"manufacturer": "1upkeyboards", "manufacturer": "1upkeyboards",
"url": "",
"maintainer": "qmk", "maintainer": "qmk",
"usb": { "usb": {
"vid": "0x6F75", "vid": "0x6F75",
@@ -79,8 +78,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": false, "nkro": false,
@@ -97,8 +94,7 @@
"rows": ["D1", "D0", "F4", "F5"] "rows": ["D1", "D0", "F4", "F5"]
}, },
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"processor": "atmega32u4", "development_board": "promicro",
"bootloader": "caterina",
"community_layouts": ["ortho_4x4", "numpad_4x4"], "community_layouts": ["ortho_4x4", "numpad_4x4"],
"layouts": { "layouts": {
"LAYOUT_ortho_4x4": { "LAYOUT_ortho_4x4": {

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "super16v2", "keyboard_name": "super16v2",
"manufacturer": "1upkeyboards", "manufacturer": "1upkeyboards",
"url": "",
"maintainer": "qmk", "maintainer": "qmk",
"usb": { "usb": {
"vid": "0x6F75", "vid": "0x6F75",
@@ -51,8 +50,6 @@
}, },
"features": { "features": {
"bootmagic": true, "bootmagic": true,
"command": false,
"console": false,
"encoder": true, "encoder": true,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,

View File

@@ -1,12 +1,9 @@
{ {
"keyboard_name": "Sweet16", "keyboard_name": "Sweet16",
"manufacturer": "1up Keyboards", "manufacturer": "1up Keyboards",
"url": "",
"maintainer": "skullydazed", "maintainer": "skullydazed",
"features": { "features": {
"bootmagic": false, "bootmagic": false,
"command": false,
"console": false,
"extrakey": true, "extrakey": true,
"mousekey": true, "mousekey": true,
"nkro": true "nkro": true

View File

@@ -1,7 +1,6 @@
{ {
"keyboard_name": "Sweet16", "keyboard_name": "Sweet16",
"manufacturer": "1up Keyboards", "manufacturer": "1up Keyboards",
"url": "",
"maintainer": "skullydazed", "maintainer": "skullydazed",
"usb": { "usb": {
"vid": "0x6F75", "vid": "0x6F75",
@@ -49,8 +48,7 @@
"rows": ["F4", "F5", "F6", "F7"] "rows": ["F4", "F5", "F6", "F7"]
}, },
"diode_direction": "COL2ROW", "diode_direction": "COL2ROW",
"processor": "atmega32u4", "development_board": "promicro",
"bootloader": "caterina",
"layouts": { "layouts": {
"LAYOUT_ortho_4x4": { "LAYOUT_ortho_4x4": {
"layout": [ "layout": [

Some files were not shown because too many files have changed in this diff Show More