aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.github/workflows/unit_test.yml2
-rw-r--r--.gitignore1
-rw-r--r--builddefs/build_keyboard.mk40
-rw-r--r--data/mappings/info_config.hjson2
-rw-r--r--data/schemas/keyboard.jsonschema8
-rw-r--r--data/templates/keyboard/config.h20
-rw-r--r--data/templates/keyboard/keyboard.json (renamed from data/templates/keyboard/info.json)0
-rw-r--r--data/templates/keyboard/rules.mk1
-rw-r--r--docs/cli_commands.md36
-rw-r--r--docs/feature_audio.md48
-rw-r--r--docs/feature_pointing_device.md3
-rw-r--r--docs/reference_info_json.md7
-rw-r--r--docs/ws2812_driver.md6
-rw-r--r--keyboards/1upkeyboards/pi40/grid_v1_1/info.json5
-rw-r--r--keyboards/1upkeyboards/pi40/mit_v1_0/info.json5
-rw-r--r--keyboards/1upkeyboards/pi40/mit_v1_1/info.json5
-rw-r--r--keyboards/1upkeyboards/pi50/info.json3
-rw-r--r--keyboards/1upkeyboards/pi60/info.json5
-rw-r--r--keyboards/1upkeyboards/pi60_hse/info.json5
-rw-r--r--keyboards/1upkeyboards/pi60_rgb/info.json5
-rw-r--r--keyboards/1upkeyboards/sweet16v2/kb2040/info.json5
-rw-r--r--keyboards/1upkeyboards/sweet16v2/pro_micro/info.json5
-rw-r--r--keyboards/4pplet/steezy60/rev_a/info.json2
-rw-r--r--keyboards/4pplet/steezy60/rev_b/info.json2
-rw-r--r--keyboards/4pplet/unextended_std/rev_a/info.json4
-rw-r--r--keyboards/acheron/apollo/87h/delta/config.h4
-rw-r--r--keyboards/acheron/apollo/87htsc/config.h4
-rw-r--r--keyboards/acheron/apollo/88htsc/config.h4
-rw-r--r--keyboards/acheron/athena/alpha/config.h4
-rw-r--r--keyboards/acheron/athena/beta/config.h4
-rw-r--r--keyboards/acheron/shark/beta/config.h4
-rw-r--r--keyboards/acheron/themis/87h/config.h4
-rw-r--r--keyboards/acheron/themis/87h/info.json3
-rw-r--r--keyboards/acheron/themis/87htsc/config.h4
-rw-r--r--keyboards/acheron/themis/87htsc/info.json3
-rw-r--r--keyboards/acheron/themis/88htsc/config.h4
-rw-r--r--keyboards/acheron/themis/88htsc/info.json3
-rw-r--r--keyboards/adafruit/macropad/config.h2
-rw-r--r--keyboards/adafruit/macropad/info.json5
-rw-r--r--keyboards/adafruit/macropad/macropad.c42
-rw-r--r--keyboards/an_achronism/tetromino/info.json1
-rw-r--r--keyboards/annepro2/c15/config.h15
-rw-r--r--keyboards/annepro2/c15/info.json125
-rw-r--r--keyboards/annepro2/c15/rules.mk17
-rw-r--r--keyboards/annepro2/c18/config.h13
-rw-r--r--keyboards/annepro2/c18/info.json125
-rw-r--r--keyboards/annepro2/c18/rules.mk17
-rw-r--r--keyboards/annepro2/info.json129
-rw-r--r--keyboards/annepro2/keymaps/default-full-caps/keymap.c4
-rw-r--r--keyboards/annepro2/keymaps/default-layer-indicators/keymap.c4
-rw-r--r--keyboards/annepro2/keymaps/default/keymap.c4
-rw-r--r--keyboards/annepro2/keymaps/iso_default/keymap.c8
-rw-r--r--keyboards/annepro2/matrix.c63
-rw-r--r--keyboards/argo_works/ishi/80/mk0_avr/info.json3
-rwxr-xr-xkeyboards/artifact/lvl/rev_hs01/config.h4
-rw-r--r--keyboards/ask55/info.json7
-rw-r--r--keyboards/aurora65/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h4
-rw-r--r--keyboards/bastardkb/scylla/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/scylla/v2/stemcell/config.h4
-rw-r--r--keyboards/bastardkb/skeletyl/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/skeletyl/v2/stemcell/config.h4
-rw-r--r--keyboards/bastardkb/tbkmini/blackpill/config.h4
-rw-r--r--keyboards/bastardkb/tbkmini/v2/stemcell/config.h4
-rw-r--r--keyboards/bestway/config.h4
-rw-r--r--keyboards/black_hellebore/config.h4
-rw-r--r--keyboards/chickenman/ciel65/info.json5
-rw-r--r--keyboards/clueboard/17/info.json4
-rw-r--r--keyboards/clueboard/2x1800/2018/info.json4
-rw-r--r--keyboards/clueboard/2x1800/2019/info.json5
-rw-r--r--keyboards/clueboard/60/info.json1
-rw-r--r--keyboards/clueboard/66/rev1/info.json8
-rw-r--r--keyboards/clueboard/66/rev2/info.json7
-rw-r--r--keyboards/clueboard/66/rev3/info.json6
-rw-r--r--keyboards/clueboard/66/rev4/info.json7
-rw-r--r--keyboards/clueboard/66_hotswap/prototype/info.json5
-rw-r--r--keyboards/clueboard/card/info.json5
-rw-r--r--keyboards/crypt_macro/config.h4
-rw-r--r--keyboards/custommk/evo70_r2/config.h4
-rw-r--r--keyboards/dark/magnum_ergo_1/info.json5
-rw-r--r--keyboards/doio/kb38/info.json3
-rw-r--r--keyboards/ebastler/isometria_75/rev1/config.h4
-rw-r--r--keyboards/edi/hardlight/mk2/config.h4
-rw-r--r--keyboards/fancytech/fancyalice66/info.json1
-rw-r--r--keyboards/frobiac/blackbowl/info.json6
-rw-r--r--keyboards/frobiac/blackflat/info.json6
-rw-r--r--keyboards/frobiac/hypernano/info.json6
-rw-r--r--keyboards/frobiac/redtilt/info.json6
-rw-r--r--keyboards/geekboards/macropad_v2/config.h4
-rw-r--r--keyboards/giabalanai/info.json4
-rw-r--r--keyboards/handwired/10k/info.json5
-rw-r--r--keyboards/handwired/3dortho14u/rev1/info.json18
-rw-r--r--keyboards/handwired/3dortho14u/rev2/info.json18
-rw-r--r--keyboards/handwired/baredev/rev1/info.json9
-rw-r--r--keyboards/handwired/cyberstar/config.h4
-rw-r--r--keyboards/handwired/dactyl_kinesis/info.json5
-rw-r--r--keyboards/handwired/dactyl_lightcycle/info.json3
-rw-r--r--keyboards/handwired/dactyl_manuform/5x6_68/info.json5
-rw-r--r--keyboards/handwired/dactyl_manuform/6x7/info.json5
-rw-r--r--keyboards/handwired/jotanck/info.json16
-rw-r--r--keyboards/handwired/jotanck/rules.mk13
-rw-r--r--keyboards/handwired/macroboard/config.h4
-rw-r--r--keyboards/handwired/onekey/info.json5
-rw-r--r--keyboards/handwired/polly40/info.json6
-rw-r--r--keyboards/handwired/scottokeebs/scotto61/info.json3
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/f303/config.h4
-rw-r--r--keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h4
-rw-r--r--keyboards/handwired/wakizashi40/info.json8
-rw-r--r--keyboards/idobao/id42/info.json4
-rw-r--r--keyboards/idobao/id61/info.json4
-rw-r--r--keyboards/idobao/id61/keymaps/idobao/keymap.c3
-rw-r--r--keyboards/idobao/id63/info.json4
-rw-r--r--keyboards/idobao/id63/keymaps/idobao/keymap.c2
-rw-r--r--keyboards/idobao/id67/info.json4
-rw-r--r--keyboards/idobao/id80/v3/ansi/info.json4
-rw-r--r--keyboards/idobao/id87/v2/info.json4
-rw-r--r--keyboards/idobao/id87/v2/keymaps/idobao/keymap.c2
-rwxr-xr-xkeyboards/idobao/montex/v2/info.json4
-rw-r--r--keyboards/idyllic/tinny50_rgb/info.json3
-rw-r--r--keyboards/jacky_studio/piggy60/rev2/config.h4
-rw-r--r--keyboards/jels/boaty/info.json3
-rw-r--r--keyboards/kabedon/kabedon98e/config.h4
-rw-r--r--keyboards/kbdfans/odinmini/info.json2
-rw-r--r--keyboards/kbdfans/tiger80/info.json2
-rw-r--r--keyboards/keebio/bamfk1/config.h22
-rw-r--r--keyboards/keebio/bamfk1/info.json124
-rw-r--r--keyboards/keebio/bamfk1/rules.mk15
-rw-r--r--keyboards/keebio/convolution/info.json4
-rw-r--r--keyboards/keebio/convolution/rev1/info.json2
-rw-r--r--keyboards/keebio/sinc/info.json4
-rw-r--r--keyboards/keebio/sinc/rev3/info.json2
-rw-r--r--keyboards/keychron/q1v1/iso/iso.c26
-rw-r--r--keyboards/keychron/q4/info.json5
-rw-r--r--keyboards/keyspensory/kp60/info.json4
-rw-r--r--keyboards/kinesis/alvicstep/info.json4
-rw-r--r--keyboards/kinesis/kint2pp/info.json4
-rw-r--r--keyboards/kinesis/kint36/info.json4
-rw-r--r--keyboards/kinesis/kint41/info.json4
-rw-r--r--keyboards/kinesis/kintlc/info.json4
-rw-r--r--keyboards/kinesis/kintwin/info.json4
-rw-r--r--keyboards/kinesis/nguyenvietyen/info.json4
-rw-r--r--keyboards/kinesis/stapelberg/info.json4
-rw-r--r--keyboards/kprepublic/bm16a/v1/info.json3
-rw-r--r--keyboards/kprepublic/bm16a/v2/config.h4
-rw-r--r--keyboards/kprepublic/bm40hsrgb/rev2/info.json4
-rw-r--r--keyboards/kuro/kuro65/info.json4
-rw-r--r--keyboards/laneware/raindrop/info.json6
-rw-r--r--keyboards/linworks/fave84h/info.json3
-rw-r--r--keyboards/linworks/whale75/config.h4
-rw-r--r--keyboards/loki65/config.h4
-rw-r--r--keyboards/mariorion_v25/prod/config.h6
-rw-r--r--keyboards/mariorion_v25/proto/config.h6
-rw-r--r--keyboards/maxr1998/phoebe/info.json1
-rw-r--r--keyboards/mechlovin/mechlovin9/rev3/info.json3
-rw-r--r--keyboards/mechlovin/olly/octagon/halconf.h2
-rw-r--r--keyboards/mechlovin/olly/octagon/info.json17
-rw-r--r--keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c9
-rw-r--r--keyboards/mechlovin/olly/octagon/keymaps/default/readme.md1
-rw-r--r--keyboards/mechlovin/olly/octagon/keymaps/via/keymap.c33
-rw-r--r--keyboards/mechlovin/olly/octagon/mcuconf.h1
-rw-r--r--keyboards/mechlovin/olly/octagon/octagon.c53
-rw-r--r--keyboards/mechlovin/olly/octagon/readme.md4
-rw-r--r--keyboards/mechlovin/olly/octagon/rules.mk15
-rw-r--r--keyboards/mechlovin/zed65/910/info.json1
-rw-r--r--keyboards/meetlab/kalice/config.h4
-rw-r--r--keyboards/meetlab/rena/config.h4
-rw-r--r--keyboards/miiiw/blackio83/info.json4
-rw-r--r--keyboards/misterknife/knife66/config.h4
-rw-r--r--keyboards/misterknife/knife66_iso/config.h4
-rw-r--r--keyboards/mk65/info.json5
-rw-r--r--keyboards/mlego/m65/rev1/info.json2
-rw-r--r--keyboards/mlego/m65/rev2/info.json2
-rw-r--r--keyboards/mlego/m65/rev3/info.json2
-rw-r--r--keyboards/mlego/m65/rev4/info.json2
-rw-r--r--keyboards/mode/m256wh/config.h4
-rw-r--r--keyboards/mode/m256ws/config.h4
-rw-r--r--keyboards/mode/m60h/config.h4
-rw-r--r--keyboards/mode/m60h_f/config.h4
-rw-r--r--keyboards/mode/m60s/config.h4
-rw-r--r--keyboards/momokai/aurora/info.json6
-rw-r--r--keyboards/momokai/tap_duo/info.json6
-rw-r--r--keyboards/momokai/tap_trio/info.json6
-rwxr-xr-xkeyboards/montsinger/palmetto/info.json3
-rw-r--r--keyboards/mwstudio/mmk_3/config.h4
-rw-r--r--keyboards/mwstudio/mw660/config.h4
-rw-r--r--keyboards/navi60/info.json6
-rw-r--r--keyboards/novelkeys/nk20/config.h4
-rwxr-xr-xkeyboards/novelkeys/nk65b/config.h4
-rw-r--r--keyboards/novelkeys/nk87b/config.h4
-rw-r--r--keyboards/novelkeys/nk_plus/config.h4
-rwxr-xr-xkeyboards/novelkeys/nk_plus/info.json4
-rw-r--r--keyboards/planck/ez/config.h4
-rw-r--r--keyboards/planck/rev6/config.h4
-rw-r--r--keyboards/planck/rev6_drop/config.h4
-rw-r--r--keyboards/planck/rev7/config.h4
-rw-r--r--keyboards/preonic/rev3/config.h4
-rw-r--r--keyboards/preonic/rev3_drop/config.h4
-rw-r--r--keyboards/protozoa/p01/config.h4
-rw-r--r--keyboards/qwertykeys/qk100/ansi/info.json9
-rw-r--r--keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk1
-rw-r--r--keyboards/qwertykeys/qk100/info.json6
-rw-r--r--keyboards/rgbkb/mun/config.h4
-rw-r--r--keyboards/rgbkb/sol3/config.h4
-rw-r--r--keyboards/sawnsprojects/eclipse/eclipse60/info.json5
-rw-r--r--keyboards/sawnsprojects/eclipse/tinyneko/info.json5
-rw-r--r--keyboards/sharkoon/skiller_sgk50_s3/info.json3
-rw-r--r--keyboards/skyloong/dt40/config.h4
-rw-r--r--keyboards/smithrune/iron165r2/f411/config.h4
-rw-r--r--keyboards/smithrune/magnus/m75h/config.h4
-rw-r--r--keyboards/smithrune/magnus/m75h/info.json3
-rw-r--r--keyboards/smithrune/magnus/m75s/config.h4
-rw-r--r--keyboards/smithrune/magnus/m75s/info.json4
-rwxr-xr-xkeyboards/spaceholdings/nebula68/config.h4
-rw-r--r--keyboards/splitkb/kyria/rev1/config.h6
-rw-r--r--keyboards/splitkb/kyria/rev2/config.h6
-rw-r--r--keyboards/splitography/info.json4
-rw-r--r--keyboards/stront/info.json1
-rw-r--r--keyboards/synthlabs/060/info.json1
-rw-r--r--keyboards/tg67/config.h4
-rw-r--r--keyboards/tkw/grandiceps/config.h4
-rw-r--r--keyboards/tkw/stoutgat/v2/config.h4
-rw-r--r--keyboards/tweetydabird/lotus58/elite_c/info.json31
-rw-r--r--keyboards/tweetydabird/lotus58/info.json31
-rw-r--r--keyboards/tweetydabird/lotus58/nanoboot/info.json32
-rw-r--r--keyboards/tweetydabird/lotus58/promicro/info.json30
-rw-r--r--keyboards/tweetydabird/lotus58/rp2040_ce/config.h9
-rw-r--r--keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h21
-rw-r--r--keyboards/tweetydabird/lotus58/rp2040_ce/info.json29
-rw-r--r--keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h22
-rw-r--r--keyboards/tweetydabird/lotus58/rp2040_ce/rules.mk1
-rw-r--r--keyboards/tzarc/djinn/config.h6
-rw-r--r--keyboards/tzarc/djinn/djinn_portscan_matrix.c10
-rw-r--r--keyboards/tzarc/djinn/info.json1
-rw-r--r--keyboards/tzarc/ghoul/rev1/stm32/config.h4
-rw-r--r--keyboards/viendi8l/config.h4
-rw-r--r--keyboards/vinhcatba/uncertainty/config.h4
-rw-r--r--keyboards/wolf/m60_b/info.json3
-rw-r--r--keyboards/xelus/ninjin/config.h4
-rw-r--r--keyboards/xelus/valor/rev2/config.h6
-rw-r--r--keyboards/yandrstudio/buff67v3/config.h4
-rw-r--r--keyboards/yandrstudio/eau_r2/config.h4
-rw-r--r--keyboards/yandrstudio/nightstar75/config.h4
-rw-r--r--keyboards/yandrstudio/nz64/config.h4
-rw-r--r--keyboards/yandrstudio/nz67v2/config.h4
-rw-r--r--keyboards/yandrstudio/tg67/config.h4
-rw-r--r--keyboards/yandrstudio/yr6095/config.h4
-rw-r--r--keyboards/yandrstudio/yr80/config.h4
-rw-r--r--keyboards/yanghu/unicorne/config.h4
-rw-r--r--keyboards/ymdk/id75/config.h4
-rw-r--r--keyboards/ymdk/melody96/hotswap/info.json1
-rw-r--r--keyboards/ymdk/ymd75/rev4/iso/config.h4
-rw-r--r--keyboards/yoichiro/lunakey_pico/info.json3
-rw-r--r--keyboards/zvecr/split_blackpill/config.h4
-rw-r--r--keyboards/zvecr/zv48/config.h4
-rw-r--r--keyboards/zvecr/zv48/f401/keyboard.json (renamed from keyboards/zvecr/zv48/f401/info.json)0
-rw-r--r--keyboards/zvecr/zv48/f401/rules.mk3
-rw-r--r--lib/python/qmk/cli/__init__.py1
-rwxr-xr-xlib/python/qmk/cli/generate/make_dependencies.py3
-rw-r--r--lib/python/qmk/cli/new/keyboard.py2
-rw-r--r--lib/python/qmk/cli/painter/convert_graphics.py34
-rw-r--r--lib/python/qmk/cli/painter/make_font.py36
-rw-r--r--lib/python/qmk/cli/test/__init__.py0
-rw-r--r--lib/python/qmk/cli/test/c.py47
-rw-r--r--lib/python/qmk/info.py15
-rw-r--r--lib/python/qmk/keyboard.py10
-rw-r--r--lib/python/qmk/painter.py102
-rw-r--r--lib/python/qmk/painter_qgf.py26
-rw-r--r--lib/python/qmk/path.py3
-rw-r--r--platforms/avr/drivers/audio_pwm_hardware.c6
-rw-r--r--platforms/chibios/boards/BONSAI_C4/configs/config.h8
-rw-r--r--platforms/chibios/drivers/audio_dac_additive.c6
-rw-r--r--platforms/chibios/drivers/audio_dac_basic.c6
-rw-r--r--platforms/chibios/drivers/audio_pwm_hardware.c6
-rw-r--r--platforms/chibios/drivers/audio_pwm_software.c6
-rw-r--r--platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c18
-rw-r--r--platforms/chibios/drivers/ws2812_pwm.c60
-rw-r--r--platforms/test/drivers/audio_pwm_hardware.c6
-rw-r--r--quantum/audio/audio.c27
-rw-r--r--quantum/audio/audio.h6
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.c20
-rw-r--r--quantum/pointing_device/pointing_device_auto_mouse.h4
-rw-r--r--readme.md4
-rw-r--r--tmk_core/protocol/chibios/chibios.c16
-rw-r--r--tmk_core/protocol/chibios/chibios.mk2
-rw-r--r--tmk_core/protocol/chibios/usb_driver.c572
-rw-r--r--tmk_core/protocol/chibios/usb_driver.h312
-rw-r--r--tmk_core/protocol/chibios/usb_endpoints.c152
-rw-r--r--tmk_core/protocol/chibios/usb_endpoints.h137
-rw-r--r--tmk_core/protocol/chibios/usb_main.c814
-rw-r--r--tmk_core/protocol/chibios/usb_main.h41
-rw-r--r--tmk_core/protocol/chibios/usb_report_handling.c296
-rw-r--r--tmk_core/protocol/chibios/usb_report_handling.h77
-rw-r--r--tmk_core/protocol/report.h8
-rw-r--r--tmk_core/protocol/usb_descriptor.h2
299 files changed, 2565 insertions, 2507 deletions
diff --git a/.github/workflows/unit_test.yml b/.github/workflows/unit_test.yml
index eec8c8b5fc..a834053a76 100644
--- a/.github/workflows/unit_test.yml
+++ b/.github/workflows/unit_test.yml
@@ -32,4 +32,4 @@ jobs:
- name: Install dependencies
run: pip3 install -r requirements-dev.txt
- name: Run tests
- run: make test:all
+ run: qmk test-c
diff --git a/.gitignore b/.gitignore
index ca9f00a733..35b128606d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -37,6 +37,7 @@ quantum/version.h
# DD config at wrong location
/keyboards/**/keymaps/*/info.json
+/keyboards/**/keymaps/*/keyboard.json
# Old-style QMK Makefiles
/keyboards/**/Makefile
diff --git a/builddefs/build_keyboard.mk b/builddefs/build_keyboard.mk
index f17171fe20..0b9ab8849f 100644
--- a/builddefs/build_keyboard.mk
+++ b/builddefs/build_keyboard.mk
@@ -119,7 +119,7 @@ MAIN_KEYMAP_PATH_3 := $(KEYBOARD_PATH_3)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_4 := $(KEYBOARD_PATH_4)/keymaps/$(KEYMAP)
MAIN_KEYMAP_PATH_5 := $(KEYBOARD_PATH_5)/keymaps/$(KEYMAP)
-# Pull in rules from info.json
+# Pull in rules from DD keyboard config
INFO_RULES_MK = $(shell $(QMK_BIN) generate-rules-mk --quiet --escape --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_rules.mk)
include $(INFO_RULES_MK)
@@ -221,7 +221,7 @@ include $(BUILDDEFS_PATH)/converters.mk
MCU_ORIG := $(MCU)
include $(wildcard $(PLATFORM_PATH)/*/mcu_selection.mk)
-# PLATFORM_KEY should be detected in info.json via key 'processor' (or rules.mk 'MCU')
+# PLATFORM_KEY should be detected in DD keyboard config via key 'processor' (or rules.mk 'MCU')
ifeq ($(PLATFORM_KEY),)
$(call CATASTROPHIC_ERROR,Platform not defined)
endif
@@ -335,38 +335,54 @@ ifneq ("$(wildcard $(KEYBOARD_PATH_5)/post_config.h)","")
POST_CONFIG_H += $(KEYBOARD_PATH_5)/post_config.h
endif
-# Pull in stuff from info.json
-INFO_JSON_FILES :=
+# Create dependencies on DD keyboard config - structure validated elsewhere
+DD_CONFIG_FILES :=
ifneq ("$(wildcard $(KEYBOARD_PATH_1)/info.json)","")
- INFO_JSON_FILES += $(KEYBOARD_PATH_1)/info.json
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_2)/info.json)","")
- INFO_JSON_FILES += $(KEYBOARD_PATH_2)/info.json
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_3)/info.json)","")
- INFO_JSON_FILES += $(KEYBOARD_PATH_3)/info.json
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_4)/info.json)","")
- INFO_JSON_FILES += $(KEYBOARD_PATH_4)/info.json
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/info.json
endif
ifneq ("$(wildcard $(KEYBOARD_PATH_5)/info.json)","")
- INFO_JSON_FILES += $(KEYBOARD_PATH_5)/info.json
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/info.json
+endif
+
+ifneq ("$(wildcard $(KEYBOARD_PATH_1)/keyboard.json)","")
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_1)/keyboard.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_2)/keyboard.json)","")
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_2)/keyboard.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_3)/keyboard.json)","")
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_3)/keyboard.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_4)/keyboard.json)","")
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_4)/keyboard.json
+endif
+ifneq ("$(wildcard $(KEYBOARD_PATH_5)/keyboard.json)","")
+ DD_CONFIG_FILES += $(KEYBOARD_PATH_5)/keyboard.json
endif
CONFIG_H += $(INTERMEDIATE_OUTPUT)/src/info_config.h
KEYBOARD_SRC += $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c
-$(INTERMEDIATE_OUTPUT)/src/info_config.h: $(INFO_JSON_FILES)
+$(INTERMEDIATE_OUTPUT)/src/info_config.h: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-config-h --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/info_config.h)
@$(BUILD_CMD)
-$(INTERMEDIATE_OUTPUT)/src/default_keyboard.c: $(INFO_JSON_FILES)
+$(INTERMEDIATE_OUTPUT)/src/default_keyboard.c: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-keyboard-c --quiet --keyboard $(KEYBOARD) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.c)
@$(BUILD_CMD)
-$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h: $(INFO_JSON_FILES)
+$(INTERMEDIATE_OUTPUT)/src/default_keyboard.h: $(DD_CONFIG_FILES)
@$(SILENT) || printf "$(MSG_GENERATING) $@" | $(AWK_CMD)
$(eval CMD=$(QMK_BIN) generate-keyboard-h --quiet --keyboard $(KEYBOARD) --include $(FOUND_KEYBOARD_H) --output $(INTERMEDIATE_OUTPUT)/src/default_keyboard.h)
@$(BUILD_CMD)
diff --git a/data/mappings/info_config.hjson b/data/mappings/info_config.hjson
index e2e9569372..c0417b8839 100644
--- a/data/mappings/info_config.hjson
+++ b/data/mappings/info_config.hjson
@@ -19,6 +19,8 @@
// Audio
"AUDIO_DEFAULT_ON": {"info_key": "audio.default.on", "value_type": "bool"},
"AUDIO_DEFAULT_CLICKY_ON": {"info_key": "audio.default.clicky", "value_type": "bool"},
+ "AUDIO_POWER_CONTROL_PIN": {"info_key": "audio.power_control.pin"},
+ "AUDIO_POWER_CONTROL_PIN_ON_STATE": {"info_key": "audio.power_control.on_state", "value_type": "int" },
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "flag"},
"SENDSTRING_BELL": {"info_key": "audio.macro_beep", "value_type": "flag"},
diff --git a/data/schemas/keyboard.jsonschema b/data/schemas/keyboard.jsonschema
index 340eb64ba1..5c6788913b 100644
--- a/data/schemas/keyboard.jsonschema
+++ b/data/schemas/keyboard.jsonschema
@@ -135,6 +135,14 @@
},
"macro_beep": {"type": "boolean"},
"pins": {"$ref": "qmk.definitions.v1#/mcu_pin_array"},
+ "power_control": {
+ "type": "object",
+ "additionalProperties": false,
+ "properties": {
+ "on_state": {"$ref": "qmk.definitions.v1#/bit"},
+ "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
+ }
+ },
"voices": {"type": "boolean"}
}
},
diff --git a/data/templates/keyboard/config.h b/data/templates/keyboard/config.h
deleted file mode 100644
index b15c8d31f1..0000000000
--- a/data/templates/keyboard/config.h
+++ /dev/null
@@ -1,20 +0,0 @@
-// Copyright %YEAR% %REAL_NAME% (@%USER_NAME%)
-// SPDX-License-Identifier: GPL-2.0-or-later
-
-#pragma once
-
-/*
- * Feature disable options
- * These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
diff --git a/data/templates/keyboard/info.json b/data/templates/keyboard/keyboard.json
index 65f935fb42..65f935fb42 100644
--- a/data/templates/keyboard/info.json
+++ b/data/templates/keyboard/keyboard.json
diff --git a/data/templates/keyboard/rules.mk b/data/templates/keyboard/rules.mk
deleted file mode 100644
index 6e7633bfe0..0000000000
--- a/data/templates/keyboard/rules.mk
+++ /dev/null
@@ -1 +0,0 @@
-# This file intentionally left blank
diff --git a/docs/cli_commands.md b/docs/cli_commands.md
index cf174949af..60268122ca 100644
--- a/docs/cli_commands.md
+++ b/docs/cli_commands.md
@@ -791,3 +791,39 @@ This command converts a TTF font to an intermediate format for editing, before c
This command converts an intermediate font image to the QFF File Format. See the [Quantum Painter](quantum_painter.md?id=quantum-painter-cli) documentation for more information on this command.
+## `qmk test-c`
+
+This command runs the C unit test suite. If you make changes to C code you should ensure this runs successfully.
+
+**Usage**:
+
+```
+qmk test-c [-h] [-t TEST] [-l] [-c] [-e ENV] [-j PARALLEL]
+
+options:
+ -h, --help show this help message and exit
+ -t TEST, --test TEST Test to run from the available list. Supports wildcard globs. May be passed multiple times.
+ -l, --list List available tests.
+ -c, --clean Remove object files before compiling.
+ -e ENV, --env ENV Set a variable to be passed to make. May be passed multiple times.
+ -j PARALLEL, --parallel PARALLEL
+ Set the number of parallel make jobs; 0 means unlimited.
+```
+
+**Examples**:
+
+Run entire test suite:
+
+ qmk test-c
+
+List available tests:
+
+ qmk test-c --list
+
+Run matching test:
+
+ qmk test-c --test unicode*
+
+Run single test:
+
+ qmk test-c --test basic
diff --git a/docs/feature_audio.md b/docs/feature_audio.md
index 5227d063c3..05f32e9840 100644
--- a/docs/feature_audio.md
+++ b/docs/feature_audio.md
@@ -171,29 +171,31 @@ The available keycodes for audio are:
## Audio Config
-| Settings | Default | Description |
-|---------------------------------|----------------------|-------------------------------------------------------------------------------|
-|`AUDIO_PIN` | *Not defined* |Configures the pin that the speaker is connected to. |
-|`AUDIO_PIN_ALT` | *Not defined* |Configures the pin for a second speaker or second pin connected to one speaker.|
-|`AUDIO_PIN_ALT_AS_NEGATIVE` | *Not defined* |Enables support for one speaker connected to two pins. |
-|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accomidate for USB startup issues. |
-|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simutaneously. |
-|`STARTUP_SONG` | `STARTUP_SOUND` |Plays when the keyboard starts up (audio.c) |
-|`GOODBYE_SONG` | `GOODBYE_SOUND` |Plays when you press the QK_BOOT key (quantum.c) |
-|`AG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press AG_NORM (process_magic.c) |
-|`AG_SWAP_SONG` | `AG_SWAP_SOUND` |Plays when you press AG_SWAP (process_magic.c) |
-|`CG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press CG_NORM (process_magic.c) |
-|`CG_SWAP_SONG` | `AG_SWAP_SOUND` |Plays when you press CG_SWAP (process_magic.c) |
-|`MUSIC_ON_SONG` | `MUSIC_ON_SOUND` |Plays when music mode is activated (process_music.c) |
-|`MUSIC_OFF_SONG` | `MUSIC_OFF_SOUND` |Plays when music mode is deactivated (process_music.c) |
-|`MIDI_ON_SONG` | `MUSIC_ON_SOUND` |Plays when midi mode is activated (process_music.c) |
-|`MIDI_OFF_SONG` | `MUSIC_OFF_SOUND` |Plays when midi mode is deactivated (process_music.c) |
-|`CHROMATIC_SONG` | `CHROMATIC_SOUND` |Plays when the chromatic music mode is selected (process_music.c) |
-|`GUITAR_SONG` | `GUITAR_SOUND` |Plays when the guitar music mode is selected (process_music.c) |
-|`VIOLIN_SONG` | `VIOLIN_SOUND` |Plays when the violin music mode is selected (process_music.c) |
-|`MAJOR_SONG` | `MAJOR_SOUND` |Plays when the major music mode is selected (process_music.c) |
-|`DEFAULT_LAYER_SONGS` | *Not defined* |Plays song when switched default layers with [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer)(quantum.c) |
-|`SENDSTRING_BELL` | *Not defined* |Plays chime when the "enter" ("\a") character is sent (send_string.c) |
+| Settings | Default | Description |
+|----------------------------------|----------------------|---------------------------------------------------------------------------------------------|
+|`AUDIO_PIN` | *Not defined* |Configures the pin that the speaker is connected to. |
+|`AUDIO_PIN_ALT` | *Not defined* |Configures the pin for a second speaker or second pin connected to one speaker. |
+|`AUDIO_PIN_ALT_AS_NEGATIVE` | *Not defined* |Enables support for one speaker connected to two pins. |
+|`AUDIO_INIT_DELAY` | *Not defined* |Enables delay during startup song to accomidate for USB startup issues. |
+|`AUDIO_ENABLE_TONE_MULTIPLEXING` | *Not defined* |Enables time splicing/multiplexing to create multiple tones simutaneously. |
+|`AUDIO_POWER_CONTROL_PIN` | *Not defined* |Enables power control code to enable or cut off power to speaker (such as with PAM8302 amp). |
+|`AUDIO_POWER_CONTROL_PIN_ON_STATE`| `1` |The state of the audio power control pin when audio is "on" - `1` for high, `0` for low. |
+|`STARTUP_SONG` | `STARTUP_SOUND` |Plays when the keyboard starts up (audio.c) |
+|`GOODBYE_SONG` | `GOODBYE_SOUND` |Plays when you press the QK_BOOT key (quantum.c) |
+|`AG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press AG_NORM (process_magic.c) |
+|`AG_SWAP_SONG` | `AG_SWAP_SOUND` |Plays when you press AG_SWAP (process_magic.c) |
+|`CG_NORM_SONG` | `AG_NORM_SOUND` |Plays when you press CG_NORM (process_magic.c) |
+|`CG_SWAP_SONG` | `AG_SWAP_SOUND` |Plays when you press CG_SWAP (process_magic.c) |
+|`MUSIC_ON_SONG` | `MUSIC_ON_SOUND` |Plays when music mode is activated (process_music.c) |
+|`MUSIC_OFF_SONG` | `MUSIC_OFF_SOUND` |Plays when music mode is deactivated (process_music.c) |
+|`MIDI_ON_SONG` | `MUSIC_ON_SOUND` |Plays when midi mode is activated (process_music.c) |
+|`MIDI_OFF_SONG` | `MUSIC_OFF_SOUND` |Plays when midi mode is deactivated (process_music.c) |
+|`CHROMATIC_SONG` | `CHROMATIC_SOUND` |Plays when the chromatic music mode is selected (process_music.c) |
+|`GUITAR_SONG` | `GUITAR_SOUND` |Plays when the guitar music mode is selected (process_music.c) |
+|`VIOLIN_SONG` | `VIOLIN_SOUND` |Plays when the violin music mode is selected (process_music.c) |
+|`MAJOR_SONG` | `MAJOR_SOUND` |Plays when the major music mode is selected (process_music.c) |
+|`DEFAULT_LAYER_SONGS` | *Not defined* |Plays song when switched default layers with [`set_single_persistent_default_layer(layer)`](ref_functions.md#setting-the-persistent-default-layer)(quantum.c). |
+|`SENDSTRING_BELL` | *Not defined* |Plays chime when the "enter" ("\a") character is sent (send_string.c) |
## Tempo
the 'speed' at which SONGs are played is dictated by the set Tempo, which is measured in beats-per-minute. Note lengths are defined relative to that.
diff --git a/docs/feature_pointing_device.md b/docs/feature_pointing_device.md
index b091dec08b..f55b308286 100644
--- a/docs/feature_pointing_device.md
+++ b/docs/feature_pointing_device.md
@@ -780,6 +780,9 @@ There are several functions that allow for more advanced interaction with the au
| `get_auto_mouse_timeout(void)` | Return the current timeout for turing off the layer | | `uint16_t` |
| `set_auto_mouse_debounce(uint16_t timeout)` | Change/set the debounce for preventing layer activation | | `void`(None) |
| `get_auto_mouse_debounce(void)` | Return the current debounce for preventing layer activation | | `uint8_t` |
+| `is_auto_mouse_active(void)` | Returns the active state of the auto mouse layer (eg if the layer has been triggered)| | `bool` |
+| `get_auto_mouse_key_tracker(void)` | Gets the current count for the auto mouse key tracker. | | `int8_t` |
+| `set_auto_mouse_key_tracker(int8_t key_tracker)` | Sets/Overrides the current count for the auto mouse key tracker. | | `void`(None) |
_NOTES:_
- _Due to the nature of how some functions work, the `auto_mouse_trigger_reset`, and `auto_mouse_layer_off` functions should never be called in the `layer_state_set_*` stack as this can cause indefinite loops._
diff --git a/docs/reference_info_json.md b/docs/reference_info_json.md
index 796db1f244..b715c14041 100644
--- a/docs/reference_info_json.md
+++ b/docs/reference_info_json.md
@@ -123,10 +123,17 @@ Configures the [Audio](feature_audio.md) feature.
* Default: `false`
* `pins` (Required)
* The GPIO pin(s) connected to the speaker(s).
+ * `power_control`
+ * `on_state`
+ * The logical GPIO state required to turn the speaker on.
+ * Default: `1` (on = high)
+ * `pin`
+ * The GPIO pin connected to speaker power circuit.
* `voices`
* Use multiple audio voices.
* Default: `false`
+
## Backlight :id=backlight
Configures the [Backlight](feature_backlight.md) feature.
diff --git a/docs/ws2812_driver.md b/docs/ws2812_driver.md
index 244d39dbe0..006529cc8a 100644
--- a/docs/ws2812_driver.md
+++ b/docs/ws2812_driver.md
@@ -208,9 +208,9 @@ The following `#define`s apply only to the `pwm` driver:
|`WS2812_PWM_DRIVER` |`PWMD2` |The PWM driver to use |
|`WS2812_PWM_CHANNEL` |`2` |The PWM channel to use |
|`WS2812_PWM_PAL_MODE` |`2` |The pin alternative function to use |
-|`WS2812_DMA_STREAM` |`STM32_DMA1_STREAM2`|The DMA Stream for `TIMx_UP` |
-|`WS2812_DMA_CHANNEL` |`2` |The DMA Channel for `TIMx_UP` |
-|`WS2812_DMAMUX_ID` |*Not defined* |The DMAMUX configuration for `TIMx_UP` - only required if your MCU has a DMAMUX peripheral|
+|`WS2812_PWM_DMA_STREAM` |`STM32_DMA1_STREAM2`|The DMA Stream for `TIMx_UP` |
+|`WS2812_PWM_DMA_CHANNEL` |`2` |The DMA Channel for `TIMx_UP` |
+|`WS2812_PWM_DMAMUX_ID` |*Not defined* |The DMAMUX configuration for `TIMx_UP` - only required if your MCU has a DMAMUX peripheral|
|`WS2812_PWM_COMPLEMENTARY_OUTPUT`|*Not defined* |Whether the PWM output is complementary (`TIMx_CHyN`) |
?> Using a complementary timer output (`TIMx_CHyN`) is possible only for advanced-control timers (1, 8 and 20 on STM32), and the `STM32_PWM_USE_ADVANCED` option in `mcuconf.h` must be set to `TRUE`. Complementary outputs of general-purpose timers are not supported due to ChibiOS limitations.
diff --git a/keyboards/1upkeyboards/pi40/grid_v1_1/info.json b/keyboards/1upkeyboards/pi40/grid_v1_1/info.json
index c7028f4a4e..3512838186 100644
--- a/keyboards/1upkeyboards/pi40/grid_v1_1/info.json
+++ b/keyboards/1upkeyboards/pi40/grid_v1_1/info.json
@@ -18,16 +18,13 @@
"driver": "vendor"
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"rows": ["GP21", "GP20", "GP19", "GP18"],
diff --git a/keyboards/1upkeyboards/pi40/mit_v1_0/info.json b/keyboards/1upkeyboards/pi40/mit_v1_0/info.json
index 6b89f2c2ab..230ce3d857 100644
--- a/keyboards/1upkeyboards/pi40/mit_v1_0/info.json
+++ b/keyboards/1upkeyboards/pi40/mit_v1_0/info.json
@@ -18,16 +18,13 @@
"driver": "vendor"
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"rows": ["GP21", "GP20", "GP19", "GP18"],
diff --git a/keyboards/1upkeyboards/pi40/mit_v1_1/info.json b/keyboards/1upkeyboards/pi40/mit_v1_1/info.json
index f19ef235d5..47625ecc4d 100644
--- a/keyboards/1upkeyboards/pi40/mit_v1_1/info.json
+++ b/keyboards/1upkeyboards/pi40/mit_v1_1/info.json
@@ -18,16 +18,13 @@
"driver": "vendor"
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"rows": ["GP21", "GP20", "GP19", "GP18"],
diff --git a/keyboards/1upkeyboards/pi50/info.json b/keyboards/1upkeyboards/pi50/info.json
index 2a4fdef384..2ee1aed4cc 100644
--- a/keyboards/1upkeyboards/pi50/info.json
+++ b/keyboards/1upkeyboards/pi50/info.json
@@ -15,8 +15,6 @@
"layer_count": 10
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
@@ -24,7 +22,6 @@
"mousekey": true,
"nkro": false,
"rgb_matrix": true,
- "rgblight": false,
"oled": true
},
"matrix_pins": {
diff --git a/keyboards/1upkeyboards/pi60/info.json b/keyboards/1upkeyboards/pi60/info.json
index 06abb1a4a6..71619db360 100644
--- a/keyboards/1upkeyboards/pi60/info.json
+++ b/keyboards/1upkeyboards/pi60/info.json
@@ -15,8 +15,6 @@
"layer_count": 10
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
@@ -24,8 +22,7 @@
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "GP17",
diff --git a/keyboards/1upkeyboards/pi60_hse/info.json b/keyboards/1upkeyboards/pi60_hse/info.json
index 6b1fcdda41..204e42f48c 100644
--- a/keyboards/1upkeyboards/pi60_hse/info.json
+++ b/keyboards/1upkeyboards/pi60_hse/info.json
@@ -15,16 +15,13 @@
"layer_count": 10
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "GP15",
diff --git a/keyboards/1upkeyboards/pi60_rgb/info.json b/keyboards/1upkeyboards/pi60_rgb/info.json
index 044e0e3b4b..b6580e616a 100644
--- a/keyboards/1upkeyboards/pi60_rgb/info.json
+++ b/keyboards/1upkeyboards/pi60_rgb/info.json
@@ -15,16 +15,13 @@
"layer_count": 10
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "GP19",
diff --git a/keyboards/1upkeyboards/sweet16v2/kb2040/info.json b/keyboards/1upkeyboards/sweet16v2/kb2040/info.json
index 40f96fb736..0d09632a99 100644
--- a/keyboards/1upkeyboards/sweet16v2/kb2040/info.json
+++ b/keyboards/1upkeyboards/sweet16v2/kb2040/info.json
@@ -12,8 +12,6 @@
"vid": "0x6F75"
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
@@ -21,8 +19,7 @@
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "GP6",
diff --git a/keyboards/1upkeyboards/sweet16v2/pro_micro/info.json b/keyboards/1upkeyboards/sweet16v2/pro_micro/info.json
index 31805fc967..d23bc6633d 100644
--- a/keyboards/1upkeyboards/sweet16v2/pro_micro/info.json
+++ b/keyboards/1upkeyboards/sweet16v2/pro_micro/info.json
@@ -11,8 +11,6 @@
"vid": "0x6F75"
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
@@ -20,8 +18,7 @@
"extrakey": true,
"mousekey": true,
"nkro": false,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "D7"
diff --git a/keyboards/4pplet/steezy60/rev_a/info.json b/keyboards/4pplet/steezy60/rev_a/info.json
index 0e00abd215..d64779bec3 100644
--- a/keyboards/4pplet/steezy60/rev_a/info.json
+++ b/keyboards/4pplet/steezy60/rev_a/info.json
@@ -30,8 +30,6 @@
"rows": ["C2", "D0", "B0", "C7", "C5"]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
diff --git a/keyboards/4pplet/steezy60/rev_b/info.json b/keyboards/4pplet/steezy60/rev_b/info.json
index 77302d5a1a..e087ff8d1b 100644
--- a/keyboards/4pplet/steezy60/rev_b/info.json
+++ b/keyboards/4pplet/steezy60/rev_b/info.json
@@ -26,8 +26,6 @@
"rows": ["B8", "A15", "C13", "A2", "A6"]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
diff --git a/keyboards/4pplet/unextended_std/rev_a/info.json b/keyboards/4pplet/unextended_std/rev_a/info.json
index 4362ab761d..5aba94b50a 100644
--- a/keyboards/4pplet/unextended_std/rev_a/info.json
+++ b/keyboards/4pplet/unextended_std/rev_a/info.json
@@ -22,9 +22,7 @@
"console": false,
"command": false,
"nkro": true,
- "backlight": false,
- "rgblight": true,
- "audio": false
+ "rgblight": true
},
"ws2812": {
"pin": "A8"
diff --git a/keyboards/acheron/apollo/87h/delta/config.h b/keyboards/acheron/apollo/87h/delta/config.h
index 578a443e88..17c09f0f57 100644
--- a/keyboards/acheron/apollo/87h/delta/config.h
+++ b/keyboards/acheron/apollo/87h/delta/config.h
@@ -28,5 +28,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/apollo/87htsc/config.h b/keyboards/acheron/apollo/87htsc/config.h
index 578a443e88..17c09f0f57 100644
--- a/keyboards/acheron/apollo/87htsc/config.h
+++ b/keyboards/acheron/apollo/87htsc/config.h
@@ -28,5 +28,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/apollo/88htsc/config.h b/keyboards/acheron/apollo/88htsc/config.h
index 578a443e88..17c09f0f57 100644
--- a/keyboards/acheron/apollo/88htsc/config.h
+++ b/keyboards/acheron/apollo/88htsc/config.h
@@ -28,5 +28,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/athena/alpha/config.h b/keyboards/acheron/athena/alpha/config.h
index ba5c2dedf2..c9f1d29f24 100644
--- a/keyboards/acheron/athena/alpha/config.h
+++ b/keyboards/acheron/athena/alpha/config.h
@@ -27,8 +27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
// If this is defined, the caps lock LED will turn on and off according to the state of caps lock. If not, the LED will shine like all other LEDs despite the caps lock state.
#define CAPSLOCK_INDICATOR
diff --git a/keyboards/acheron/athena/beta/config.h b/keyboards/acheron/athena/beta/config.h
index 30c29fa686..b2a8d2edf8 100644
--- a/keyboards/acheron/athena/beta/config.h
+++ b/keyboards/acheron/athena/beta/config.h
@@ -28,8 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
// If this is defined, the caps lock LED will turn on and off according to the state of caps lock. If not, the LED will shine like all other LEDs despite the caps lock state.
#define CAPSLOCK_INDICATOR
diff --git a/keyboards/acheron/shark/beta/config.h b/keyboards/acheron/shark/beta/config.h
index d862fd016d..1182d39d3b 100644
--- a/keyboards/acheron/shark/beta/config.h
+++ b/keyboards/acheron/shark/beta/config.h
@@ -27,7 +27,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
#define EEPROM_I2C_24LC256
diff --git a/keyboards/acheron/themis/87h/config.h b/keyboards/acheron/themis/87h/config.h
index ed1229c779..fb2a5e1ed7 100644
--- a/keyboards/acheron/themis/87h/config.h
+++ b/keyboards/acheron/themis/87h/config.h
@@ -24,5 +24,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/themis/87h/info.json b/keyboards/acheron/themis/87h/info.json
index a7bfb89997..ce2037bfad 100644
--- a/keyboards/acheron/themis/87h/info.json
+++ b/keyboards/acheron/themis/87h/info.json
@@ -16,10 +16,7 @@
"mousekey": true,
"extrakey": true,
"console": false,
- "backlight": false,
"rgblight": true,
- "audio": false,
- "encoder": false,
"nkro": true
},
"diode_direction": "COL2ROW",
diff --git a/keyboards/acheron/themis/87htsc/config.h b/keyboards/acheron/themis/87htsc/config.h
index ed1229c779..fb2a5e1ed7 100644
--- a/keyboards/acheron/themis/87htsc/config.h
+++ b/keyboards/acheron/themis/87htsc/config.h
@@ -24,5 +24,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/themis/87htsc/info.json b/keyboards/acheron/themis/87htsc/info.json
index 5f38814789..eaf8a323ab 100644
--- a/keyboards/acheron/themis/87htsc/info.json
+++ b/keyboards/acheron/themis/87htsc/info.json
@@ -16,10 +16,7 @@
"mousekey": true,
"extrakey": true,
"console": false,
- "backlight": false,
"rgblight": true,
- "audio": false,
- "encoder": false,
"nkro": true
},
"diode_direction": "COL2ROW",
diff --git a/keyboards/acheron/themis/88htsc/config.h b/keyboards/acheron/themis/88htsc/config.h
index ed1229c779..fb2a5e1ed7 100644
--- a/keyboards/acheron/themis/88htsc/config.h
+++ b/keyboards/acheron/themis/88htsc/config.h
@@ -24,5 +24,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/acheron/themis/88htsc/info.json b/keyboards/acheron/themis/88htsc/info.json
index 20b3d38828..f8e65afbad 100644
--- a/keyboards/acheron/themis/88htsc/info.json
+++ b/keyboards/acheron/themis/88htsc/info.json
@@ -16,10 +16,7 @@
"mousekey": true,
"extrakey": true,
"console": false,
- "backlight": false,
"rgblight": true,
- "audio": false,
- "encoder": false,
"nkro": true
},
"diode_direction": "COL2ROW",
diff --git a/keyboards/adafruit/macropad/config.h b/keyboards/adafruit/macropad/config.h
index 7f2e9ab6f9..725530a512 100644
--- a/keyboards/adafruit/macropad/config.h
+++ b/keyboards/adafruit/macropad/config.h
@@ -48,5 +48,3 @@
#define AUDIO_PWM_CHANNEL RP2040_PWM_CHANNEL_A
#define AUDIO_INIT_DELAY
#define AUDIO_CLICKY
-
-#define SPEAKER_SHUTDOWN GP14
diff --git a/keyboards/adafruit/macropad/info.json b/keyboards/adafruit/macropad/info.json
index 0facf7e0f6..295af78339 100644
--- a/keyboards/adafruit/macropad/info.json
+++ b/keyboards/adafruit/macropad/info.json
@@ -8,6 +8,11 @@
"pid": "0x0108",
"device_version": "0.0.1"
},
+ "audio": {
+ "power_control": {
+ "pin": "GP14"
+ }
+ },
"encoder": {
"rotary": [
{"pin_a": "GP18", "pin_b": "GP17"}
diff --git a/keyboards/adafruit/macropad/macropad.c b/keyboards/adafruit/macropad/macropad.c
deleted file mode 100644
index 5c1d2ba593..0000000000
--- a/keyboards/adafruit/macropad/macropad.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/* Copyright 2022 Jose Pablo Ramirez <[email protected]>
- *
- * 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 "quantum.h"
-
-#ifdef AUDIO_ENABLE
-void keyboard_pre_init_kb(void) {
- // ensure pin is set and enabled pre-audio init
- setPinOutput(SPEAKER_SHUTDOWN);
- writePinHigh(SPEAKER_SHUTDOWN);
- keyboard_pre_init_user();
-}
-
-void keyboard_post_init_kb(void) {
- // set pin based on active status
- writePin(SPEAKER_SHUTDOWN, audio_is_on());
- keyboard_post_init_user();
-}
-
-void audio_on_user(void) {
- writePinHigh(SPEAKER_SHUTDOWN);
-}
-
-void audio_off_user(void) {
- // needs a delay or it runs right after play note.
- wait_ms(200);
- writePinLow(SPEAKER_SHUTDOWN);
-}
-#endif
diff --git a/keyboards/an_achronism/tetromino/info.json b/keyboards/an_achronism/tetromino/info.json
index 8087c6489c..98cb9faf3e 100644
--- a/keyboards/an_achronism/tetromino/info.json
+++ b/keyboards/an_achronism/tetromino/info.json
@@ -17,7 +17,6 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgblight": false,
"rgb_matrix": true
},
"ws2812": {
diff --git a/keyboards/annepro2/c15/config.h b/keyboards/annepro2/c15/config.h
index 9ffce91957..9745cf50cc 100644
--- a/keyboards/annepro2/c15/config.h
+++ b/keyboards/annepro2/c15/config.h
@@ -19,27 +19,12 @@
#include "pin_defs.h"
-// key matrix size
-#define MATRIX_ROWS 5
-#define MATRIX_COLS 14
-// layer size: MATRIX_ROWS * MATRIX_COLS * sizeof(uint16_t) = 140 bytes
-
#define LINE_UART_TX B0 // Master TX, LED RX
#define LINE_UART_RX B1 // Master RX, LED TX
#define LINE_BT_UART_TX A4 // Master TX, BLE RX
#define LINE_BT_UART_RX A5 // Master RX, BLE TX
-// outputs (rows are pulled low)
-#define MATRIX_ROW_PINS \
- { C2, C1, B5, B4, C3 }
-
-// inputs (columns are sampled)
-// PORTA 12,13 conflict with SWD
-
-#define MATRIX_COL_PINS \
- { C4, C5, B10, B11, C0, A15, A8, A10, A11, A12, A13, A14, B2, B3 }
-
// Obins stock firmware has something similar to this already enabled, but disabled by default in QMK
#define PERMISSIVE_HOLD
diff --git a/keyboards/annepro2/c15/info.json b/keyboards/annepro2/c15/info.json
index b92b446e4e..0f738c0999 100644
--- a/keyboards/annepro2/c15/info.json
+++ b/keyboards/annepro2/c15/info.json
@@ -3,124 +3,9 @@
"usb": {
"pid": "0x8008"
},
- "eeprom": {
- "driver": "wear_leveling",
- "wear_leveling": {
- "driver": "spi_flash",
- "backing_size": 2048
- }
- },
- "rgb_matrix": {
- "animations":{
- "alphas_mods": true,
- "gradient_up_down": true,
- "gradient_left_right": true,
- "breathing": true,
- "band_sat": true,
- "band_val": true,
- "band_pinwheel_sat": true,
- "band_pinwheel_val": true,
- "band_spiral_sat": true,
- "band_spiral_val": true,
- "cycle_all": true,
- "cycle_left_right": true,
- "cycle_up_down": true,
- "rainbow_moving_chevron": true,
- "cycle_out_in": true,
- "cycle_out_in_dual": true,
- "cycle_pinwheel": true,
- "cycle_spiral": true,
- "dual_beacon": true,
- "rainbow_beacon": true,
- "rainbow_pinwheels": true,
- "raindrops": true,
- "jellybean_raindrops": true,
- "hue_breathing": true,
- "hue_pendulum": true,
- "hue_wave": true,
- "pixel_fractal": true,
- "pixel_flow": true,
- "pixel_rain": true,
- "typing_heatmap": true,
- "digital_rain": true,
- "solid_reactive_simple": true,
- "solid_reactive": true,
- "solid_reactive_wide": true,
- "solid_reactive_multiwide": true,
- "solid_reactive_cross": true,
- "solid_reactive_multicross": true,
- "solid_reactive_nexus": true,
- "solid_reactive_multinexus": true,
- "splash": true,
- "multisplash": true,
- "solid_splash": true,
- "solid_multisplash": true
- },
- "driver": "custom",
- "layout": [
- {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
- {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4},
- {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4},
- {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4},
- {"matrix": [0, 4], "x": 65, "y": 0, "flags": 4},
- {"matrix": [0, 5], "x": 81, "y": 0, "flags": 4},
- {"matrix": [0, 6], "x": 97, "y": 0, "flags": 4},
- {"matrix": [0, 7], "x": 113, "y": 0, "flags": 4},
- {"matrix": [0, 8], "x": 129, "y": 0, "flags": 4},
- {"matrix": [0, 9], "x": 145, "y": 0, "flags": 4},
- {"matrix": [0, 10], "x": 161, "y": 0, "flags": 4},
- {"matrix": [0, 11], "x": 178, "y": 0, "flags": 4},
- {"matrix": [0, 12], "x": 194, "y": 0, "flags": 4},
- {"matrix": [0, 13], "x": 218, "y": 0, "flags": 4},
- {"matrix": [1, 0], "x": 4, "y": 16, "flags": 4},
- {"matrix": [1, 1], "x": 24, "y": 16, "flags": 4},
- {"matrix": [1, 2], "x": 40, "y": 16, "flags": 4},
- {"matrix": [1, 3], "x": 57, "y": 16, "flags": 4},
- {"matrix": [1, 4], "x": 73, "y": 16, "flags": 4},
- {"matrix": [1, 5], "x": 89, "y": 16, "flags": 4},
- {"matrix": [1, 6], "x": 105, "y": 16, "flags": 4},
- {"matrix": [1, 7], "x": 121, "y": 16, "flags": 4},
- {"matrix": [1, 8], "x": 137, "y": 16, "flags": 4},
- {"matrix": [1, 9], "x": 153, "y": 16, "flags": 4},
- {"matrix": [1, 10], "x": 170, "y": 16, "flags": 4},
- {"matrix": [1, 11], "x": 186, "y": 16, "flags": 4},
- {"matrix": [1, 12], "x": 202, "y": 16, "flags": 4},
- {"matrix": [1, 13], "x": 222, "y": 16, "flags": 4},
- {"matrix": [2, 0], "x": 6, "y": 32, "flags": 4},
- {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4},
- {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4},
- {"matrix": [2, 3], "x": 61, "y": 32, "flags": 4},
- {"matrix": [2, 4], "x": 77, "y": 32, "flags": 4},
- {"matrix": [2, 5], "x": 93, "y": 32, "flags": 4},
- {"matrix": [2, 6], "x": 109, "y": 32, "flags": 4},
- {"matrix": [2, 7], "x": 125, "y": 32, "flags": 4},
- {"matrix": [2, 8], "x": 141, "y": 32, "flags": 4},
- {"matrix": [2, 9], "x": 157, "y": 32, "flags": 4},
- {"matrix": [2, 10], "x": 174, "y": 32, "flags": 4},
- {"matrix": [2, 11], "x": 190, "y": 32, "flags": 4},
- {"matrix": [2, 12], "x": 216, "y": 32, "flags": 4},
- {"matrix": [3, 0], "x": 10, "y": 48, "flags": 1},
- {"matrix": [3, 2], "x": 36, "y": 48, "flags": 4},
- {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4},
- {"matrix": [3, 4], "x": 69, "y": 48, "flags": 4},
- {"matrix": [3, 5], "x": 85, "y": 48, "flags": 4},
- {"matrix": [3, 6], "x": 101, "y": 48, "flags": 4},
- {"matrix": [3, 7], "x": 117, "y": 48, "flags": 4},
- {"matrix": [3, 8], "x": 133, "y": 48, "flags": 4},
- {"matrix": [3, 9], "x": 149, "y": 48, "flags": 4},
- {"matrix": [3, 10], "x": 165, "y": 48, "flags": 4},
- {"matrix": [3, 11], "x": 182, "y": 48, "flags": 4},
- {"matrix": [3, 12], "x": 212, "y": 48, "flags": 1},
- {"matrix": [4, 0], "x": 2, "y": 64, "flags": 1},
- {"matrix": [4, 2], "x": 22, "y": 64, "flags": 1},
- {"matrix": [4, 3], "x": 42, "y": 64, "flags": 1},
- {"matrix": [4, 6], "x": 103, "y": 64, "flags": 4},
- {"matrix": [4, 9], "x": 163, "y": 64, "flags": 1},
- {"matrix": [4, 10], "x": 184, "y": 64, "flags": 1},
- {"matrix": [4, 11], "x": 204, "y": 64, "flags": 1},
- {"matrix": [4, 12], "x": 224, "y": 64, "flags": 1}
- ],
- "led_flush_limit": 40
- },
- "community_layouts": ["60_ansi"]
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["C4", "C5", "B10", "B11", "C0", "A15", "A8", "A10", "A11", "A12", "A13", "A14", "B2", "B3"],
+ "rows": ["C2", "C1", "B5", "B4", "C3"]
+ }
}
diff --git a/keyboards/annepro2/c15/rules.mk b/keyboards/annepro2/c15/rules.mk
index 374d844338..f35d9002ef 100644
--- a/keyboards/annepro2/c15/rules.mk
+++ b/keyboards/annepro2/c15/rules.mk
@@ -13,25 +13,8 @@ BOARD = ANNEPRO2_C15
BOOTLOADER = custom
PROGRAM_CMD = annepro2_tools --boot $(BUILD_DIR)/$(TARGET).bin
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-
-# Custom RGB matrix handling
-RGB_MATRIX_ENABLE = yes
-
-# Keys
-CUSTOM_MATRIX = lite
-
# Anne Pro 2
SRC = \
- matrix.c \
annepro2_ble.c \
ap2_led.c \
protocol.c \
diff --git a/keyboards/annepro2/c18/config.h b/keyboards/annepro2/c18/config.h
index 7010f19a3f..dfc550160c 100644
--- a/keyboards/annepro2/c18/config.h
+++ b/keyboards/annepro2/c18/config.h
@@ -19,25 +19,12 @@
#include "pin_defs.h"
-// key matrix size
-#define MATRIX_ROWS 5
-#define MATRIX_COLS 14
-// layer size: MATRIX_ROWS * MATRIX_COLS * sizeof(uint16_t) = 140 bytes
-
#define LINE_UART_TX B0
#define LINE_UART_RX B1
#define LINE_BT_UART_TX A4 // Master TX, BLE RX
#define LINE_BT_UART_RX A5 // Master RX, BLE TX
-// outputs (rows are pulled low)
-#define MATRIX_ROW_PINS \
- { B5, B4, B3, B2, D1 }
-
-// inputs (columns are sampled)
-#define MATRIX_COL_PINS \
- { C4, C5, D0, B15, C11, A15, C12, C13, A8, A10, A11, A14, D2, D3 }
-
// Obins stock firmware has something similar to this already enabled, but disabled by default in QMK
#define PERMISSIVE_HOLD
diff --git a/keyboards/annepro2/c18/info.json b/keyboards/annepro2/c18/info.json
index 390dd81941..b3f3d367fe 100644
--- a/keyboards/annepro2/c18/info.json
+++ b/keyboards/annepro2/c18/info.json
@@ -3,124 +3,9 @@
"usb": {
"pid": "0x8009"
},
- "eeprom": {
- "driver": "wear_leveling",
- "wear_leveling": {
- "driver": "spi_flash",
- "backing_size": 2048
- }
- },
- "rgb_matrix": {
- "animations":{
- "alphas_mods": true,
- "gradient_up_down": true,
- "gradient_left_right": true,
- "breathing": true,
- "band_sat": true,
- "band_val": true,
- "band_pinwheel_sat": true,
- "band_pinwheel_val": true,
- "band_spiral_sat": true,
- "band_spiral_val": true,
- "cycle_all": true,
- "cycle_left_right": true,
- "cycle_up_down": true,
- "rainbow_moving_chevron": true,
- "cycle_out_in": true,
- "cycle_out_in_dual": true,
- "cycle_pinwheel": true,
- "cycle_spiral": true,
- "dual_beacon": true,
- "rainbow_beacon": true,
- "rainbow_pinwheels": true,
- "raindrops": true,
- "jellybean_raindrops": true,
- "hue_breathing": true,
- "hue_pendulum": true,
- "hue_wave": true,
- "pixel_fractal": true,
- "pixel_flow": true,
- "pixel_rain": true,
- "typing_heatmap": true,
- "digital_rain": true,
- "solid_reactive_simple": true,
- "solid_reactive": true,
- "solid_reactive_wide": true,
- "solid_reactive_multiwide": true,
- "solid_reactive_cross": true,
- "solid_reactive_multicross": true,
- "solid_reactive_nexus": true,
- "solid_reactive_multinexus": true,
- "splash": true,
- "multisplash": true,
- "solid_splash": true,
- "solid_multisplash": true
- },
- "driver": "custom",
- "layout": [
- {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
- {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4},
- {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4},
- {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4},
- {"matrix": [0, 4], "x": 65, "y": 0, "flags": 4},
- {"matrix": [0, 5], "x": 81, "y": 0, "flags": 4},
- {"matrix": [0, 6], "x": 97, "y": 0, "flags": 4},
- {"matrix": [0, 7], "x": 113, "y": 0, "flags": 4},
- {"matrix": [0, 8], "x": 129, "y": 0, "flags": 4},
- {"matrix": [0, 9], "x": 145, "y": 0, "flags": 4},
- {"matrix": [0, 10], "x": 161, "y": 0, "flags": 4},
- {"matrix": [0, 11], "x": 178, "y": 0, "flags": 4},
- {"matrix": [0, 12], "x": 194, "y": 0, "flags": 4},
- {"matrix": [0, 13], "x": 218, "y": 0, "flags": 4},
- {"matrix": [1, 0], "x": 4, "y": 16, "flags": 4},
- {"matrix": [1, 1], "x": 24, "y": 16, "flags": 4},
- {"matrix": [1, 2], "x": 40, "y": 16, "flags": 4},
- {"matrix": [1, 3], "x": 57, "y": 16, "flags": 4},
- {"matrix": [1, 4], "x": 73, "y": 16, "flags": 4},
- {"matrix": [1, 5], "x": 89, "y": 16, "flags": 4},
- {"matrix": [1, 6], "x": 105, "y": 16, "flags": 4},
- {"matrix": [1, 7], "x": 121, "y": 16, "flags": 4},
- {"matrix": [1, 8], "x": 137, "y": 16, "flags": 4},
- {"matrix": [1, 9], "x": 153, "y": 16, "flags": 4},
- {"matrix": [1, 10], "x": 170, "y": 16, "flags": 4},
- {"matrix": [1, 11], "x": 186, "y": 16, "flags": 4},
- {"matrix": [1, 12], "x": 202, "y": 16, "flags": 4},
- {"matrix": [1, 13], "x": 222, "y": 16, "flags": 4},
- {"matrix": [2, 0], "x": 6, "y": 32, "flags": 4},
- {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4},
- {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4},
- {"matrix": [2, 3], "x": 61, "y": 32, "flags": 4},
- {"matrix": [2, 4], "x": 77, "y": 32, "flags": 4},
- {"matrix": [2, 5], "x": 93, "y": 32, "flags": 4},
- {"matrix": [2, 6], "x": 109, "y": 32, "flags": 4},
- {"matrix": [2, 7], "x": 125, "y": 32, "flags": 4},
- {"matrix": [2, 8], "x": 141, "y": 32, "flags": 4},
- {"matrix": [2, 9], "x": 157, "y": 32, "flags": 4},
- {"matrix": [2, 10], "x": 174, "y": 32, "flags": 4},
- {"matrix": [2, 11], "x": 190, "y": 32, "flags": 4},
- {"matrix": [2, 12], "x": 216, "y": 32, "flags": 4},
- {"matrix": [3, 0], "x": 10, "y": 48, "flags": 1},
- {"matrix": [3, 2], "x": 36, "y": 48, "flags": 4},
- {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4},
- {"matrix": [3, 4], "x": 69, "y": 48, "flags": 4},
- {"matrix": [3, 5], "x": 85, "y": 48, "flags": 4},
- {"matrix": [3, 6], "x": 101, "y": 48, "flags": 4},
- {"matrix": [3, 7], "x": 117, "y": 48, "flags": 4},
- {"matrix": [3, 8], "x": 133, "y": 48, "flags": 4},
- {"matrix": [3, 9], "x": 149, "y": 48, "flags": 4},
- {"matrix": [3, 10], "x": 165, "y": 48, "flags": 4},
- {"matrix": [3, 11], "x": 182, "y": 48, "flags": 4},
- {"matrix": [3, 12], "x": 212, "y": 48, "flags": 1},
- {"matrix": [4, 0], "x": 2, "y": 64, "flags": 1},
- {"matrix": [4, 2], "x": 22, "y": 64, "flags": 1},
- {"matrix": [4, 3], "x": 42, "y": 64, "flags": 1},
- {"matrix": [4, 6], "x": 103, "y": 64, "flags": 4},
- {"matrix": [4, 9], "x": 163, "y": 64, "flags": 1},
- {"matrix": [4, 10], "x": 184, "y": 64, "flags": 1},
- {"matrix": [4, 11], "x": 204, "y": 64, "flags": 1},
- {"matrix": [4, 12], "x": 224, "y": 64, "flags": 1}
- ],
- "led_flush_limit": 40
- },
- "community_layouts": ["60_ansi", "60_iso"]
+ "diode_direction": "COL2ROW",
+ "matrix_pins": {
+ "cols": ["C4", "C5", "D0", "B15", "C11", "A15", "C12", "C13", "A8", "A10", "A11", "A14", "D2", "D3"],
+ "rows": ["B5", "B4", "B3", "B2", "D1"]
+ }
}
diff --git a/keyboards/annepro2/c18/rules.mk b/keyboards/annepro2/c18/rules.mk
index 2c9a9077da..b310454c5d 100644
--- a/keyboards/annepro2/c18/rules.mk
+++ b/keyboards/annepro2/c18/rules.mk
@@ -13,25 +13,8 @@ BOARD = ANNEPRO2_C18
BOOTLOADER = custom
PROGRAM_CMD = annepro2_tools --boot $(BUILD_DIR)/$(TARGET).bin
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = no # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-
-# Custom RGB matrix handling
-RGB_MATRIX_ENABLE = yes
-
-# Keys
-CUSTOM_MATRIX = lite
-
# Anne Pro 2
SRC = \
- matrix.c \
annepro2_ble.c \
ap2_led.c \
protocol.c \
diff --git a/keyboards/annepro2/info.json b/keyboards/annepro2/info.json
index d06fe5bed4..8c7041005f 100644
--- a/keyboards/annepro2/info.json
+++ b/keyboards/annepro2/info.json
@@ -6,6 +6,135 @@
"vid": "0xAC20",
"device_version": "13.3.7"
},
+ "build": {
+ "lto": true
+ },
+ "eeprom": {
+ "driver": "wear_leveling",
+ "wear_leveling": {
+ "driver": "spi_flash",
+ "backing_size": 2048
+ }
+ },
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "rgb_matrix": true
+ },
+ "rgb_matrix": {
+ "animations":{
+ "alphas_mods": true,
+ "gradient_up_down": true,
+ "gradient_left_right": true,
+ "breathing": true,
+ "band_sat": true,
+ "band_val": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_up_down": true,
+ "rainbow_moving_chevron": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "dual_beacon": true,
+ "rainbow_beacon": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "jellybean_raindrops": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "pixel_fractal": true,
+ "pixel_flow": true,
+ "pixel_rain": true,
+ "typing_heatmap": true,
+ "digital_rain": true,
+ "solid_reactive_simple": true,
+ "solid_reactive": true,
+ "solid_reactive_wide": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_multinexus": true,
+ "splash": true,
+ "multisplash": true,
+ "solid_splash": true,
+ "solid_multisplash": true
+ },
+ "driver": "custom",
+ "layout": [
+ {"matrix": [0, 0], "x": 0, "y": 0, "flags": 4},
+ {"matrix": [0, 1], "x": 16, "y": 0, "flags": 4},
+ {"matrix": [0, 2], "x": 32, "y": 0, "flags": 4},
+ {"matrix": [0, 3], "x": 48, "y": 0, "flags": 4},
+ {"matrix": [0, 4], "x": 65, "y": 0, "flags": 4},
+ {"matrix": [0, 5], "x": 81, "y": 0, "flags": 4},
+ {"matrix": [0, 6], "x": 97, "y": 0, "flags": 4},
+ {"matrix": [0, 7], "x": 113, "y": 0, "flags": 4},
+ {"matrix": [0, 8], "x": 129, "y": 0, "flags": 4},
+ {"matrix": [0, 9], "x": 145, "y": 0, "flags": 4},
+ {"matrix": [0, 10], "x": 161, "y": 0, "flags": 4},
+ {"matrix": [0, 11], "x": 178, "y": 0, "flags": 4},
+ {"matrix": [0, 12], "x": 194, "y": 0, "flags": 4},
+ {"matrix": [0, 13], "x": 218, "y": 0, "flags": 4},
+ {"matrix": [1, 0], "x": 4, "y": 16, "flags": 4},
+ {"matrix": [1, 1], "x": 24, "y": 16, "flags": 4},
+ {"matrix": [1, 2], "x": 40, "y": 16, "flags": 4},
+ {"matrix": [1, 3], "x": 57, "y": 16, "flags": 4},
+ {"matrix": [1, 4], "x": 73, "y": 16, "flags": 4},
+ {"matrix": [1, 5], "x": 89, "y": 16, "flags": 4},
+ {"matrix": [1, 6], "x": 105, "y": 16, "flags": 4},
+ {"matrix": [1, 7], "x": 121, "y": 16, "flags": 4},
+ {"matrix": [1, 8], "x": 137, "y": 16, "flags": 4},
+ {"matrix": [1, 9], "x": 153, "y": 16, "flags": 4},
+ {"matrix": [1, 10], "x": 170, "y": 16, "flags": 4},
+ {"matrix": [1, 11], "x": 186, "y": 16, "flags": 4},
+ {"matrix": [1, 12], "x": 202, "y": 16, "flags": 4},
+ {"matrix": [1, 13], "x": 222, "y": 16, "flags": 4},
+ {"matrix": [2, 0], "x": 6, "y": 32, "flags": 4},
+ {"matrix": [2, 1], "x": 28, "y": 32, "flags": 4},
+ {"matrix": [2, 2], "x": 44, "y": 32, "flags": 4},
+ {"matrix": [2, 3], "x": 61, "y": 32, "flags": 4},
+ {"matrix": [2, 4], "x": 77, "y": 32, "flags": 4},
+ {"matrix": [2, 5], "x": 93, "y": 32, "flags": 4},
+ {"matrix": [2, 6], "x": 109, "y": 32, "flags": 4},
+ {"matrix": [2, 7], "x": 125, "y": 32, "flags": 4},
+ {"matrix": [2, 8], "x": 141, "y": 32, "flags": 4},
+ {"matrix": [2, 9], "x": 157, "y": 32, "flags": 4},
+ {"matrix": [2, 10], "x": 174, "y": 32, "flags": 4},
+ {"matrix": [2, 11], "x": 190, "y": 32, "flags": 4},
+ {"matrix": [2, 12], "x": 216, "y": 32, "flags": 4},
+ {"matrix": [3, 0], "x": 10, "y": 48, "flags": 1},
+ {"matrix": [3, 2], "x": 36, "y": 48, "flags": 4},
+ {"matrix": [3, 3], "x": 52, "y": 48, "flags": 4},
+ {"matrix": [3, 4], "x": 69, "y": 48, "flags": 4},
+ {"matrix": [3, 5], "x": 85, "y": 48, "flags": 4},
+ {"matrix": [3, 6], "x": 101, "y": 48, "flags": 4},
+ {"matrix": [3, 7], "x": 117, "y": 48, "flags": 4},
+ {"matrix": [3, 8], "x": 133, "y": 48, "flags": 4},
+ {"matrix": [3, 9], "x": 149, "y": 48, "flags": 4},
+ {"matrix": [3, 10], "x": 165, "y": 48, "flags": 4},
+ {"matrix": [3, 11], "x": 182, "y": 48, "flags": 4},
+ {"matrix": [3, 12], "x": 212, "y": 48, "flags": 1},
+ {"matrix": [4, 0], "x": 2, "y": 64, "flags": 1},
+ {"matrix": [4, 2], "x": 22, "y": 64, "flags": 1},
+ {"matrix": [4, 3], "x": 42, "y": 64, "flags": 1},
+ {"matrix": [4, 6], "x": 103, "y": 64, "flags": 4},
+ {"matrix": [4, 9], "x": 163, "y": 64, "flags": 1},
+ {"matrix": [4, 10], "x": 184, "y": 64, "flags": 1},
+ {"matrix": [4, 11], "x": 204, "y": 64, "flags": 1},
+ {"matrix": [4, 12], "x": 224, "y": 64, "flags": 1}
+ ],
+ "led_flush_limit": 40
+ },
+ "community_layouts": ["60_ansi", "60_iso"],
"layouts": {
"LAYOUT_60_ansi": {
"layout": [
diff --git a/keyboards/annepro2/keymaps/default-full-caps/keymap.c b/keyboards/annepro2/keymaps/default-full-caps/keymap.c
index cb6147d40a..7d517a179a 100644
--- a/keyboards/annepro2/keymaps/default-full-caps/keymap.c
+++ b/keyboards/annepro2/keymaps/default-full-caps/keymap.c
@@ -97,10 +97,10 @@ enum anne_pro_layers {
*/
[FN2] = LAYOUT_60_ansi( /* FN2 */
_______, KC_AP2_BT1, KC_AP2_BT2, KC_AP2_BT3, KC_AP2_BT4, _______, _______, _______, _______, KC_AP_RGB_MOD, KC_AP_RGB_TOG, KC_AP_RGB_VAD, KC_AP_RGB_VAI, _______,
- MO(FN2), _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
- _______, _______, _______, _______, _______, MO(FN1), MO(FN2), _______
+ _______, _______, _______, _______, _______, _______, _______, _______
),
};
// clang-format on
diff --git a/keyboards/annepro2/keymaps/default-layer-indicators/keymap.c b/keyboards/annepro2/keymaps/default-layer-indicators/keymap.c
index ca042dcd32..298f44398b 100644
--- a/keyboards/annepro2/keymaps/default-layer-indicators/keymap.c
+++ b/keyboards/annepro2/keymaps/default-layer-indicators/keymap.c
@@ -97,10 +97,10 @@ enum anne_pro_layers {
*/
[FN2] = LAYOUT_60_ansi( /* FN2 */
_______, KC_AP2_BT1, KC_AP2_BT2, KC_AP2_BT3, KC_AP2_BT4, _______, _______, _______, _______, KC_AP_RGB_MOD, KC_AP_RGB_TOG, KC_AP_RGB_VAD, KC_AP_RGB_VAI, _______,
- MO(FN2), _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
- _______, _______, _______, _______, _______, MO(FN1), MO(FN2), _______
+ _______, _______, _______, _______, _______, _______, _______, _______
),
};
// clang-format on
diff --git a/keyboards/annepro2/keymaps/default/keymap.c b/keyboards/annepro2/keymaps/default/keymap.c
index 8af2d9a32c..38be6ec54a 100644
--- a/keyboards/annepro2/keymaps/default/keymap.c
+++ b/keyboards/annepro2/keymaps/default/keymap.c
@@ -97,10 +97,10 @@ enum anne_pro_layers {
*/
[FN2] = LAYOUT_60_ansi( /* FN2 */
_______, KC_AP2_BT1, KC_AP2_BT2, KC_AP2_BT3, KC_AP2_BT4, _______, _______, _______, _______, KC_AP_RGB_MOD, KC_AP_RGB_TOG, KC_AP_RGB_VAD, KC_AP_RGB_VAI, _______,
- MO(FN2), _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
+ _______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END, _______,
_______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
- _______, _______, _______, _______, _______, MO(FN1), MO(FN2), _______
+ _______, _______, _______, _______, _______, _______, _______, _______
),
};
// clang-format on
diff --git a/keyboards/annepro2/keymaps/iso_default/keymap.c b/keyboards/annepro2/keymaps/iso_default/keymap.c
index 4c1b259504..a495390603 100644
--- a/keyboards/annepro2/keymaps/iso_default/keymap.c
+++ b/keyboards/annepro2/keymaps/iso_default/keymap.c
@@ -76,9 +76,9 @@ enum anne_pro_layers {
[FN1] = LAYOUT_60_iso( /* FN1 */
KC_GRV, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_DEL,
_______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END,
- MO(FN1), KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______,
_______, _______, KC_VOLU, KC_VOLD, KC_MUTE, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
- _______, _______, _______, _______, KC_APP, MO(FN1), MO(FN2), _______
+ _______, _______, _______, _______, KC_APP, _______, MO(FN2), _______
),
/*
* Layer FN2
@@ -98,9 +98,9 @@ enum anne_pro_layers {
[FN2] = LAYOUT_60_iso( /* FN2 */
_______, KC_AP2_BT1, KC_AP2_BT2, KC_AP2_BT3, KC_AP2_BT4, _______, _______, _______, _______, KC_AP_RGB_MOD, KC_AP_RGB_TOG, KC_AP_RGB_VAD, KC_AP_RGB_VAI, _______,
_______, _______, KC_UP, _______, _______, _______, _______, _______, _______, _______, KC_PSCR, KC_HOME, KC_END,
- MO(FN1), KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______,
+ _______, KC_LEFT, KC_DOWN, KC_RGHT, _______, _______, _______, _______, _______, _______, KC_PGUP, KC_PGDN, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, KC_INS, KC_DEL, _______,
- _______, _______, _______, _______, KC_APP, MO(FN1), MO(FN2), _______
+ _______, _______, _______, _______, KC_APP, _______, _______, _______
),
};
// clang-format on
diff --git a/keyboards/annepro2/matrix.c b/keyboards/annepro2/matrix.c
deleted file mode 100644
index a1585e4ddf..0000000000
--- a/keyboards/annepro2/matrix.c
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (c) 2018 Charlie Waters
- *
- * 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 <stdint.h>
-#include <stdbool.h>
-#include <string.h>
-#include <hal.h>
-#include "timer.h"
-#include "wait.h"
-#include "print.h"
-#include "matrix.h"
-#include "annepro2.h"
-
-pin_t row_list[MATRIX_ROWS] = MATRIX_ROW_PINS;
-pin_t col_list[MATRIX_COLS] = MATRIX_COL_PINS;
-
-bool matrix_scan_custom(matrix_row_t current_matrix[]) {
- bool matrix_has_changed = false;
- // cache of input ports for columns
- static uint16_t port_cache[4];
- // scan each row
- for (int row = 0; row < MATRIX_ROWS; row++) {
- palClearLine(row_list[row]);
- __NOP();
- __NOP();
- __NOP();
- __NOP();
- // read i/o ports
- port_cache[0] = palReadPort(IOPORTA);
- port_cache[1] = palReadPort(IOPORTB);
- port_cache[2] = palReadPort(IOPORTC);
- port_cache[3] = palReadPort(IOPORTD);
- palSetLine(row_list[row]);
-
- // get columns from ports
- matrix_row_t data = 0;
- for (int col = 0; col < MATRIX_COLS; ++col) {
- pin_t line = col_list[col];
- uint16_t port = port_cache[HT32_PAL_IDX(PAL_PORT(line))];
- data |= (((port & (1 << PAL_PAD(line))) ? 0 : 1) << col);
- }
-
- if (current_matrix[row] != data) {
- current_matrix[row] = data;
- matrix_has_changed = true;
- }
- }
- return matrix_has_changed;
-} \ No newline at end of file
diff --git a/keyboards/argo_works/ishi/80/mk0_avr/info.json b/keyboards/argo_works/ishi/80/mk0_avr/info.json
index 6bee024fed..47414ee0c4 100644
--- a/keyboards/argo_works/ishi/80/mk0_avr/info.json
+++ b/keyboards/argo_works/ishi/80/mk0_avr/info.json
@@ -19,8 +19,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "encoder": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["D3", "F4", "F5", "F6", "F7", "D7", "C6", "D4", "D2"],
diff --git a/keyboards/artifact/lvl/rev_hs01/config.h b/keyboards/artifact/lvl/rev_hs01/config.h
index 674fb1110c..8dec2b56f2 100755
--- a/keyboards/artifact/lvl/rev_hs01/config.h
+++ b/keyboards/artifact/lvl/rev_hs01/config.h
@@ -19,7 +19,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* RGB Light */
#define WS2812_PWM_DRIVER PWMD1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
diff --git a/keyboards/ask55/info.json b/keyboards/ask55/info.json
index 61013e7f23..d47d79612d 100644
--- a/keyboards/ask55/info.json
+++ b/keyboards/ask55/info.json
@@ -5,18 +5,13 @@
"development_board": "promicro",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
- "bluetooth": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "sleep_led": false,
- "unicode": false
+ "rgblight": true
},
"matrix_pins": {
"cols": ["E6", "D0", "D2", "D3", "D5", "D4", "D6", "D7", "B4", "B5", "B6", "C6", "C7", "F7"],
diff --git a/keyboards/aurora65/config.h b/keyboards/aurora65/config.h
index ec0853212c..1b51399c8d 100644
--- a/keyboards/aurora65/config.h
+++ b/keyboards/aurora65/config.h
@@ -22,6 +22,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 2
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
diff --git a/keyboards/bastardkb/charybdis/3x5/blackpill/config.h b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h
index 68901305c4..0467a1261f 100644
--- a/keyboards/bastardkb/charybdis/3x5/blackpill/config.h
+++ b/keyboards/bastardkb/charybdis/3x5/blackpill/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
index 6aa20712f6..7a2bdd0aa8 100644
--- a/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
+++ b/keyboards/bastardkb/charybdis/3x5/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bastardkb/charybdis/3x6/blackpill/config.h b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h
index 985e79fabd..b41a1d3f57 100644
--- a/keyboards/bastardkb/charybdis/3x6/blackpill/config.h
+++ b/keyboards/bastardkb/charybdis/3x6/blackpill/config.h
@@ -25,8 +25,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
index 6aa20712f6..7a2bdd0aa8 100644
--- a/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
+++ b/keyboards/bastardkb/charybdis/3x6/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bastardkb/charybdis/4x6/blackpill/config.h b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h
index 68901305c4..0467a1261f 100644
--- a/keyboards/bastardkb/charybdis/4x6/blackpill/config.h
+++ b/keyboards/bastardkb/charybdis/4x6/blackpill/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
index 6aa20712f6..7a2bdd0aa8 100644
--- a/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
+++ b/keyboards/bastardkb/charybdis/4x6/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bastardkb/scylla/blackpill/config.h b/keyboards/bastardkb/scylla/blackpill/config.h
index 0c40ed74bc..1d86b474ee 100644
--- a/keyboards/bastardkb/scylla/blackpill/config.h
+++ b/keyboards/bastardkb/scylla/blackpill/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/scylla/v2/stemcell/config.h b/keyboards/bastardkb/scylla/v2/stemcell/config.h
index 0bbfd39aee..ca1cc0f719 100644
--- a/keyboards/bastardkb/scylla/v2/stemcell/config.h
+++ b/keyboards/bastardkb/scylla/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bastardkb/skeletyl/blackpill/config.h b/keyboards/bastardkb/skeletyl/blackpill/config.h
index 0c40ed74bc..1d86b474ee 100644
--- a/keyboards/bastardkb/skeletyl/blackpill/config.h
+++ b/keyboards/bastardkb/skeletyl/blackpill/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/skeletyl/v2/stemcell/config.h b/keyboards/bastardkb/skeletyl/v2/stemcell/config.h
index 0bbfd39aee..ca1cc0f719 100644
--- a/keyboards/bastardkb/skeletyl/v2/stemcell/config.h
+++ b/keyboards/bastardkb/skeletyl/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bastardkb/tbkmini/blackpill/config.h b/keyboards/bastardkb/tbkmini/blackpill/config.h
index 0c40ed74bc..1d86b474ee 100644
--- a/keyboards/bastardkb/tbkmini/blackpill/config.h
+++ b/keyboards/bastardkb/tbkmini/blackpill/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
#define WS2812_EXTERNAL_PULLUP
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_PWM_TARGET_PERIOD 800000
/* Serial configuration for split keyboard. */
diff --git a/keyboards/bastardkb/tbkmini/v2/stemcell/config.h b/keyboards/bastardkb/tbkmini/v2/stemcell/config.h
index 0bbfd39aee..ca1cc0f719 100644
--- a/keyboards/bastardkb/tbkmini/v2/stemcell/config.h
+++ b/keyboards/bastardkb/tbkmini/v2/stemcell/config.h
@@ -30,8 +30,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 3
/* CRC. */
#define CRC8_USE_TABLE
diff --git a/keyboards/bestway/config.h b/keyboards/bestway/config.h
index c63a25d9a6..1800a114a0 100644
--- a/keyboards/bestway/config.h
+++ b/keyboards/bestway/config.h
@@ -18,5 +18,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 4
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/black_hellebore/config.h b/keyboards/black_hellebore/config.h
index 53910fed09..e748b3d185 100644
--- a/keyboards/black_hellebore/config.h
+++ b/keyboards/black_hellebore/config.h
@@ -20,5 +20,5 @@
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1 //TIM1_CH1N (AF1)
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
-#define WS2812_DMA_CHANNEL 7 //7 works, CxS[3:0] 0111 = TIM1_UP on Channel 6? (RM0394.pdf pg.298)
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_PWM_DMA_CHANNEL 7 //7 works, CxS[3:0] 0111 = TIM1_UP on Channel 6? (RM0394.pdf pg.298)
diff --git a/keyboards/chickenman/ciel65/info.json b/keyboards/chickenman/ciel65/info.json
index 7657812179..8c316759a8 100644
--- a/keyboards/chickenman/ciel65/info.json
+++ b/keyboards/chickenman/ciel65/info.json
@@ -22,10 +22,7 @@
"console": false,
"command": false,
"nkro": true,
- "backlight": false,
- "rgblight": true,
- "audio": false,
- "key_lock": false
+ "rgblight": true
},
"rgblight": {
"led_count": 14,
diff --git a/keyboards/clueboard/17/info.json b/keyboards/clueboard/17/info.json
index ef03bd11b1..d6aec9cfcc 100644
--- a/keyboards/clueboard/17/info.json
+++ b/keyboards/clueboard/17/info.json
@@ -11,11 +11,9 @@
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"matrix_pins": {
"cols": ["F4", "E6", "B1", "D2"],
diff --git a/keyboards/clueboard/2x1800/2018/info.json b/keyboards/clueboard/2x1800/2018/info.json
index 49e0ae17a8..fe0b521034 100644
--- a/keyboards/clueboard/2x1800/2018/info.json
+++ b/keyboards/clueboard/2x1800/2018/info.json
@@ -11,11 +11,9 @@
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"indicators": {
"num_lock": "B4",
diff --git a/keyboards/clueboard/2x1800/2019/info.json b/keyboards/clueboard/2x1800/2019/info.json
index fc613d6100..6f33a11ca7 100644
--- a/keyboards/clueboard/2x1800/2019/info.json
+++ b/keyboards/clueboard/2x1800/2019/info.json
@@ -12,11 +12,8 @@
"console": true,
"encoder": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["D2", "D3", "D4", "D5", "D7", "E0", "E1", "B0", "E6", "B3", "B2"],
diff --git a/keyboards/clueboard/60/info.json b/keyboards/clueboard/60/info.json
index 322f842680..d0b4d34999 100644
--- a/keyboards/clueboard/60/info.json
+++ b/keyboards/clueboard/60/info.json
@@ -9,7 +9,6 @@
"diode_direction": "COL2ROW",
"features": {
"audio": true,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": true,
diff --git a/keyboards/clueboard/66/rev1/info.json b/keyboards/clueboard/66/rev1/info.json
index fc186d9894..ca1e3a6553 100644
--- a/keyboards/clueboard/66/rev1/info.json
+++ b/keyboards/clueboard/66/rev1/info.json
@@ -6,18 +6,12 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "nkro": true
},
"indicators": {
"caps_lock": "F0"
diff --git a/keyboards/clueboard/66/rev2/info.json b/keyboards/clueboard/66/rev2/info.json
index e4a8c5a03b..fea4f8d39b 100644
--- a/keyboards/clueboard/66/rev2/info.json
+++ b/keyboards/clueboard/66/rev2/info.json
@@ -6,18 +6,13 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": true,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"indicators": {
"caps_lock": "B4"
diff --git a/keyboards/clueboard/66/rev3/info.json b/keyboards/clueboard/66/rev3/info.json
index f0881e5be6..0aa3e7096f 100644
--- a/keyboards/clueboard/66/rev3/info.json
+++ b/keyboards/clueboard/66/rev3/info.json
@@ -6,18 +6,14 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
"backlight": true,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"indicators": {
"caps_lock": "B4"
diff --git a/keyboards/clueboard/66/rev4/info.json b/keyboards/clueboard/66/rev4/info.json
index e90ec9788e..dbc1b94915 100644
--- a/keyboards/clueboard/66/rev4/info.json
+++ b/keyboards/clueboard/66/rev4/info.json
@@ -8,17 +8,12 @@
"diode_direction": "COL2ROW",
"features": {
"audio": true,
- "backlight": false,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["B10", "B2", "B1", "B0", "A7", "B4", "B3", "B5"],
diff --git a/keyboards/clueboard/66_hotswap/prototype/info.json b/keyboards/clueboard/66_hotswap/prototype/info.json
index 779540a8c4..2ef1fbec1e 100644
--- a/keyboards/clueboard/66_hotswap/prototype/info.json
+++ b/keyboards/clueboard/66_hotswap/prototype/info.json
@@ -8,16 +8,13 @@
"features": {
"audio": true,
"backlight": true,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": false,
"nkro": true,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"indicators": {
"caps_lock": "B4"
diff --git a/keyboards/clueboard/card/info.json b/keyboards/clueboard/card/info.json
index 7799110ba6..106b6f823d 100644
--- a/keyboards/clueboard/card/info.json
+++ b/keyboards/clueboard/card/info.json
@@ -9,16 +9,13 @@
"features": {
"audio": true,
"backlight": true,
- "bluetooth": false,
"bootmagic": false,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
"nkro": false,
- "rgblight": true,
- "unicode": false
+ "rgblight": true
},
"build": {
"lto": true
diff --git a/keyboards/crypt_macro/config.h b/keyboards/crypt_macro/config.h
index 4d9d9bf5c2..701ad8da86 100644
--- a/keyboards/crypt_macro/config.h
+++ b/keyboards/crypt_macro/config.h
@@ -24,6 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
diff --git a/keyboards/custommk/evo70_r2/config.h b/keyboards/custommk/evo70_r2/config.h
index 62606cf1ee..bd8744204c 100644
--- a/keyboards/custommk/evo70_r2/config.h
+++ b/keyboards/custommk/evo70_r2/config.h
@@ -78,8 +78,8 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
#define TAP_CODE_DELAY 10
diff --git a/keyboards/dark/magnum_ergo_1/info.json b/keyboards/dark/magnum_ergo_1/info.json
index cdabceec7f..1aecfe8630 100644
--- a/keyboards/dark/magnum_ergo_1/info.json
+++ b/keyboards/dark/magnum_ergo_1/info.json
@@ -17,16 +17,13 @@
}
},
"features": {
- "audio": false,
"backlight": true,
"bootmagic": true,
"command": false,
"console": false,
- "encoder": false,
"extrakey": true,
"mousekey": false,
- "nkro": true,
- "rgblight": false
+ "nkro": true
},
"diode_direction": "COL2ROW",
"backlight": {
diff --git a/keyboards/doio/kb38/info.json b/keyboards/doio/kb38/info.json
index 9a67e3ed5c..a89c5951e3 100644
--- a/keyboards/doio/kb38/info.json
+++ b/keyboards/doio/kb38/info.json
@@ -12,8 +12,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"cols": ["F5", "F4", "F1", "F0", "B7", "B6", "B5", "B4"],
diff --git a/keyboards/ebastler/isometria_75/rev1/config.h b/keyboards/ebastler/isometria_75/rev1/config.h
index 0fc8019a1d..19a79c9df6 100644
--- a/keyboards/ebastler/isometria_75/rev1/config.h
+++ b/keyboards/ebastler/isometria_75/rev1/config.h
@@ -26,8 +26,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
/* ADC - will be used for battery monitoring once BT support is added */
/* #define ADC_PIN B0 */
diff --git a/keyboards/edi/hardlight/mk2/config.h b/keyboards/edi/hardlight/mk2/config.h
index 73f4b2baae..52636c6484 100644
--- a/keyboards/edi/hardlight/mk2/config.h
+++ b/keyboards/edi/hardlight/mk2/config.h
@@ -28,8 +28,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_EXTERNAL_PULLUP
/* I2C driver overrides */
diff --git a/keyboards/fancytech/fancyalice66/info.json b/keyboards/fancytech/fancyalice66/info.json
index b2e219c1c9..869ebe7465 100644
--- a/keyboards/fancytech/fancyalice66/info.json
+++ b/keyboards/fancytech/fancyalice66/info.json
@@ -14,7 +14,6 @@
},
"features": {
"bootmagic": true,
- "encoder": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
diff --git a/keyboards/frobiac/blackbowl/info.json b/keyboards/frobiac/blackbowl/info.json
index 3d5d8483dd..2e99c5806b 100644
--- a/keyboards/frobiac/blackbowl/info.json
+++ b/keyboards/frobiac/blackbowl/info.json
@@ -7,17 +7,13 @@
"processor": "atmega32u4",
"diode_direction": "ROW2COL",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": false,
"dynamic_macro": true,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "unicode": false,
- "rgblight": false
+ "nkro": false
},
"build": {
"lto": true
diff --git a/keyboards/frobiac/blackflat/info.json b/keyboards/frobiac/blackflat/info.json
index 2227f698df..086d90d8f8 100644
--- a/keyboards/frobiac/blackflat/info.json
+++ b/keyboards/frobiac/blackflat/info.json
@@ -7,17 +7,13 @@
"processor": "atmega32u4",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": false,
"dynamic_macro": true,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "unicode": false,
- "rgblight": false
+ "nkro": false
},
"build": {
"lto": true
diff --git a/keyboards/frobiac/hypernano/info.json b/keyboards/frobiac/hypernano/info.json
index b06b281565..403beed952 100644
--- a/keyboards/frobiac/hypernano/info.json
+++ b/keyboards/frobiac/hypernano/info.json
@@ -7,17 +7,13 @@
"processor": "atmega32u4",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": false,
"dynamic_macro": true,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "unicode": false,
- "rgblight": false
+ "nkro": false
},
"build": {
"lto": true
diff --git a/keyboards/frobiac/redtilt/info.json b/keyboards/frobiac/redtilt/info.json
index 633ca1d32d..f3cbd96e1c 100644
--- a/keyboards/frobiac/redtilt/info.json
+++ b/keyboards/frobiac/redtilt/info.json
@@ -7,17 +7,13 @@
"processor": "atmega32u4",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": false,
"dynamic_macro": true,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "unicode": false,
- "rgblight": false
+ "nkro": false
},
"build": {
"lto": true
diff --git a/keyboards/geekboards/macropad_v2/config.h b/keyboards/geekboards/macropad_v2/config.h
index 6aed50ec2f..dca98f0c95 100644
--- a/keyboards/geekboards/macropad_v2/config.h
+++ b/keyboards/geekboards/macropad_v2/config.h
@@ -19,7 +19,7 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
#define WAIT_FOR_USB
diff --git a/keyboards/giabalanai/info.json b/keyboards/giabalanai/info.json
index b10cbe943e..953e0bebc3 100644
--- a/keyboards/giabalanai/info.json
+++ b/keyboards/giabalanai/info.json
@@ -36,9 +36,7 @@
"bootmagic": false,
"console": false,
"mousekey": false,
- "nkro": false,
- "rgblight": false,
- "audio": false
+ "nkro": false
},
"encoder": {
"rotary": []
diff --git a/keyboards/handwired/10k/info.json b/keyboards/handwired/10k/info.json
index af75560e84..9c215a5e86 100644
--- a/keyboards/handwired/10k/info.json
+++ b/keyboards/handwired/10k/info.json
@@ -8,15 +8,12 @@
"rows": ["B6"]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": false,
"command": false,
"console": false,
"extrakey": false,
"mousekey": false,
- "nkro": false,
- "rgblight": false
+ "nkro": false
},
"usb": {
"vid": "0x6869",
diff --git a/keyboards/handwired/3dortho14u/rev1/info.json b/keyboards/handwired/3dortho14u/rev1/info.json
index 9179bd3a1b..63773d405f 100644
--- a/keyboards/handwired/3dortho14u/rev1/info.json
+++ b/keyboards/handwired/3dortho14u/rev1/info.json
@@ -7,18 +7,12 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
- "bluetooth": false,
- "bootmagic": true,
- "command": false,
- "console": true,
- "extrakey": true,
- "midi": false,
- "mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "bootmagic": true,
+ "command": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
},
"indicators": {
"caps_lock": "F0"
diff --git a/keyboards/handwired/3dortho14u/rev2/info.json b/keyboards/handwired/3dortho14u/rev2/info.json
index 499d8603ce..9e048d643d 100644
--- a/keyboards/handwired/3dortho14u/rev2/info.json
+++ b/keyboards/handwired/3dortho14u/rev2/info.json
@@ -7,18 +7,12 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
- "bluetooth": false,
- "bootmagic": true,
- "command": false,
- "console": true,
- "extrakey": true,
- "midi": false,
- "mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "bootmagic": true,
+ "command": false,
+ "console": true,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
},
"indicators": {
"caps_lock": "F4"
diff --git a/keyboards/handwired/baredev/rev1/info.json b/keyboards/handwired/baredev/rev1/info.json
index ab7747d43a..470b926bb4 100644
--- a/keyboards/handwired/baredev/rev1/info.json
+++ b/keyboards/handwired/baredev/rev1/info.json
@@ -23,19 +23,12 @@
"processor": "atmega32u4",
"bootloader": "atmel-dfu",
"features": {
- "audio": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
- "midi": false,
"mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false,
- "bluetooth": false,
- "backlight": false,
- "sleep_led": false
+ "nkro": true
},
"layout_aliases": {
"LAYOUT": "LAYOUT_abnt2"
diff --git a/keyboards/handwired/cyberstar/config.h b/keyboards/handwired/cyberstar/config.h
index 4d9d9bf5c2..701ad8da86 100644
--- a/keyboards/handwired/cyberstar/config.h
+++ b/keyboards/handwired/cyberstar/config.h
@@ -24,6 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
diff --git a/keyboards/handwired/dactyl_kinesis/info.json b/keyboards/handwired/dactyl_kinesis/info.json
index 91cb98e040..ee68a2c515 100644
--- a/keyboards/handwired/dactyl_kinesis/info.json
+++ b/keyboards/handwired/dactyl_kinesis/info.json
@@ -14,10 +14,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "audio": false,
- "backlight": false,
- "rgblight": false
+ "nkro": false
},
"rgblight": {
"led_count": 12
diff --git a/keyboards/handwired/dactyl_lightcycle/info.json b/keyboards/handwired/dactyl_lightcycle/info.json
index 4d581b974e..1b5f2dd39a 100644
--- a/keyboards/handwired/dactyl_lightcycle/info.json
+++ b/keyboards/handwired/dactyl_lightcycle/info.json
@@ -14,9 +14,6 @@
"console": false,
"mousekey": true,
"extrakey": true,
- "audio": false,
- "rgblight": false,
- "backlight": false,
"nkro": false
},
"ws2812": {
diff --git a/keyboards/handwired/dactyl_manuform/5x6_68/info.json b/keyboards/handwired/dactyl_manuform/5x6_68/info.json
index 78a602cb64..59d37ec15b 100644
--- a/keyboards/handwired/dactyl_manuform/5x6_68/info.json
+++ b/keyboards/handwired/dactyl_manuform/5x6_68/info.json
@@ -15,10 +15,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "audio": false,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"split": {
"enabled": true,
diff --git a/keyboards/handwired/dactyl_manuform/6x7/info.json b/keyboards/handwired/dactyl_manuform/6x7/info.json
index 529d92bd3f..5ce0affbee 100644
--- a/keyboards/handwired/dactyl_manuform/6x7/info.json
+++ b/keyboards/handwired/dactyl_manuform/6x7/info.json
@@ -14,10 +14,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": false,
- "audio": false,
- "backlight": false,
- "rgblight": false
+ "nkro": false
},
"ws2812": {
"pin": "D3"
diff --git a/keyboards/handwired/jotanck/info.json b/keyboards/handwired/jotanck/info.json
index 0e4966218a..4c81ac1a61 100644
--- a/keyboards/handwired/jotanck/info.json
+++ b/keyboards/handwired/jotanck/info.json
@@ -1,20 +1,30 @@
{
"keyboard_name": "Jotanck",
"manufacturer": "Jotix",
- "url": "",
+ "url": "https://github.com/qmk/qmk_firmware/tree/master/keyboards/handwired/jotanck",
"maintainer": "jotix",
"usb": {
"vid": "0x4A4F",
"pid": "0x5458",
"device_version": "0.0.1"
},
+ "features": {
+ "bootmagic": true,
+ "command": false,
+ "console": false,
+ "extrakey": true,
+ "mousekey": true,
+ "nkro": true
+ },
+ "tapping": {
+ "term": 175
+ },
+ "development_board": "promicro",
"matrix_pins": {
"cols": ["F4", "F5", "F6", "F7", "B1", "B3", "D3", "D2", "D1", "D0", "D4", "C6"],
"rows": ["D7", "E6", "B6", "B2"]
},
"diode_direction": "COL2ROW",
- "processor": "atmega32u4",
- "bootloader": "caterina",
"community_layouts": ["ortho_4x12"],
"layouts": {
"LAYOUT_ortho_4x12": {
diff --git a/keyboards/handwired/jotanck/rules.mk b/keyboards/handwired/jotanck/rules.mk
index 696f338724..6e7633bfe0 100644
--- a/keyboards/handwired/jotanck/rules.mk
+++ b/keyboards/handwired/jotanck/rules.mk
@@ -1,12 +1 @@
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = no # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = yes # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-AUDIO_ENABLE = no # Audio output
-RGBLIGHT_ENABLE = no # Enable WS2812 RGB underlight.
+# This file intentionally left blank
diff --git a/keyboards/handwired/macroboard/config.h b/keyboards/handwired/macroboard/config.h
index 95e7d9d1aa..b8e437bddf 100644
--- a/keyboards/handwired/macroboard/config.h
+++ b/keyboards/handwired/macroboard/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define WS2812_PWM_TARGET_PERIOD 800000
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
diff --git a/keyboards/handwired/onekey/info.json b/keyboards/handwired/onekey/info.json
index 17bb84a82c..2d266f5ea3 100644
--- a/keyboards/handwired/onekey/info.json
+++ b/keyboards/handwired/onekey/info.json
@@ -17,10 +17,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": false,
- "backlight": false,
- "rgblight": false,
- "audio": false
+ "nkro": false
},
"community_layouts": ["ortho_1x1"],
"layouts": {
diff --git a/keyboards/handwired/polly40/info.json b/keyboards/handwired/polly40/info.json
index 63856fa739..9ff34b339e 100644
--- a/keyboards/handwired/polly40/info.json
+++ b/keyboards/handwired/polly40/info.json
@@ -21,11 +21,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false,
- "audio": false,
- "key_lock": false
+ "nkro": true
},
"layouts": {
"LAYOUT": {
diff --git a/keyboards/handwired/scottokeebs/scotto61/info.json b/keyboards/handwired/scottokeebs/scotto61/info.json
index 8614ec81eb..cf321a2e97 100644
--- a/keyboards/handwired/scottokeebs/scotto61/info.json
+++ b/keyboards/handwired/scottokeebs/scotto61/info.json
@@ -10,8 +10,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "rgblight": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["GP6", "GP7", "GP8", "GP9", "GP10", "GP11", "GP12", "GP13", "GP22", "GP20", "GP19", "GP18", "GP17", "GP16"],
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f303/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/f303/config.h
index 3a7f97f8d2..a2818e7176 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/f303/config.h
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/f303/config.h
@@ -26,8 +26,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_CHANNEL 1 // default: 2
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
-// #define WS2812_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+// #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define DEBUG_LED_PIN C13
diff --git a/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h b/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h
index 2ad18267ad..87f830e175 100644
--- a/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h
+++ b/keyboards/handwired/tractyl_manuform/5x6_right/f411/config.h
@@ -27,8 +27,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
#define WS2812_EXTERNAL_PULLUP
//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#define WS2812_PWM_TARGET_PERIOD 800000
#define DEBUG_LED_PIN C13
diff --git a/keyboards/handwired/wakizashi40/info.json b/keyboards/handwired/wakizashi40/info.json
index 3a72e5d310..495d9a0376 100644
--- a/keyboards/handwired/wakizashi40/info.json
+++ b/keyboards/handwired/wakizashi40/info.json
@@ -6,18 +6,12 @@
"bootloader": "atmel-dfu",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
- "bluetooth": false,
"bootmagic": true,
"command": false,
"console": true,
"extrakey": true,
- "midi": false,
"mousekey": true,
- "nkro": true,
- "rgblight": false,
- "unicode": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["F4", "F6", "F7", "B1", "B3", "B2", "B6", "B5", "B4", "E6", "D7", "C6", "D4"],
diff --git a/keyboards/idobao/id42/info.json b/keyboards/idobao/id42/info.json
index b0702aaa94..ace2033493 100644
--- a/keyboards/idobao/id42/info.json
+++ b/keyboards/idobao/id42/info.json
@@ -10,9 +10,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "B3"
diff --git a/keyboards/idobao/id61/info.json b/keyboards/idobao/id61/info.json
index 255e88fc05..0b1c51279d 100644
--- a/keyboards/idobao/id61/info.json
+++ b/keyboards/idobao/id61/info.json
@@ -10,9 +10,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "F0"
diff --git a/keyboards/idobao/id61/keymaps/idobao/keymap.c b/keyboards/idobao/id61/keymaps/idobao/keymap.c
index bd0b500615..3bfe1db6f4 100644
--- a/keyboards/idobao/id61/keymaps/idobao/keymap.c
+++ b/keyboards/idobao/id61/keymaps/idobao/keymap.c
@@ -186,7 +186,7 @@ void eeconfig_init_user(void) {
ID61_update_rgb_mode();
}
-void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
+bool rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
// Caps Lock key stuff
if (host_keyboard_led_state().caps_lock) {
@@ -204,6 +204,7 @@ void rgb_matrix_indicators_advanced_user(uint8_t led_min, uint8_t led_max) {
} else if (user_config.rgb_disable_perkey) {
rgb_matrix_set_color(ID61_CAPS_LOCK_KEY_INDEX, HSV_OFF); // off
}
+ return false;
}
#endif // RGB_MATRIX_ENABLE
diff --git a/keyboards/idobao/id63/info.json b/keyboards/idobao/id63/info.json
index 02c4d41bf4..573fb44030 100644
--- a/keyboards/idobao/id63/info.json
+++ b/keyboards/idobao/id63/info.json
@@ -10,9 +10,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "B7"
diff --git a/keyboards/idobao/id63/keymaps/idobao/keymap.c b/keyboards/idobao/id63/keymaps/idobao/keymap.c
index 9213e4ffcf..912da63426 100644
--- a/keyboards/idobao/id63/keymaps/idobao/keymap.c
+++ b/keyboards/idobao/id63/keymaps/idobao/keymap.c
@@ -98,7 +98,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
),
[_FN2] = LAYOUT_60_ansi_arrow(
- KC_ESC, KC_BRID, KC_BRIU, KC_MCON, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PWR,
+ KC_ESC, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, KC_PWR,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
diff --git a/keyboards/idobao/id67/info.json b/keyboards/idobao/id67/info.json
index 5618311141..7c5308d315 100644
--- a/keyboards/idobao/id67/info.json
+++ b/keyboards/idobao/id67/info.json
@@ -10,9 +10,7 @@
"extrakey": true,
"command": false,
"console": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "F0"
diff --git a/keyboards/idobao/id80/v3/ansi/info.json b/keyboards/idobao/id80/v3/ansi/info.json
index 5cca0260ea..19dc8c67a7 100644
--- a/keyboards/idobao/id80/v3/ansi/info.json
+++ b/keyboards/idobao/id80/v3/ansi/info.json
@@ -10,9 +10,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"rgb_matrix": {
"animations": {
diff --git a/keyboards/idobao/id87/v2/info.json b/keyboards/idobao/id87/v2/info.json
index cb94ee763e..4a6099207c 100644
--- a/keyboards/idobao/id87/v2/info.json
+++ b/keyboards/idobao/id87/v2/info.json
@@ -10,9 +10,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "E2"
diff --git a/keyboards/idobao/id87/v2/keymaps/idobao/keymap.c b/keyboards/idobao/id87/v2/keymaps/idobao/keymap.c
index 53871f9161..4f7dec65b6 100644
--- a/keyboards/idobao/id87/v2/keymaps/idobao/keymap.c
+++ b/keyboards/idobao/id87/v2/keymaps/idobao/keymap.c
@@ -77,7 +77,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* └────┴────┴────┴────────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘
*/
[1] = LAYOUT_tkl_ansi(
- QK_BOOT, KC_BRID, KC_BRIU, KC_MCON, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
+ QK_BOOT, KC_BRID, KC_BRIU, KC_MCTL, KC_LPAD, RGB_VAD, RGB_VAI, KC_MPRV, KC_MPLY, KC_MNXT, KC_MUTE, KC_VOLD, KC_VOLU, _______, _______, _______,
_______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_HUI, _______,
_______, RGB_TOG, RGB_MOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______, RGB_SAD, RGB_HUD, RGB_SAI,
_______, _______, RGB_RMOD, _______, _______, _______, _______, _______, _______, _______, _______, _______, _______,
diff --git a/keyboards/idobao/montex/v2/info.json b/keyboards/idobao/montex/v2/info.json
index 774cde114f..aefc3e4561 100755
--- a/keyboards/idobao/montex/v2/info.json
+++ b/keyboards/idobao/montex/v2/info.json
@@ -10,9 +10,7 @@
"console": false,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "backlight": false,
- "rgblight": false
+ "nkro": true
},
"ws2812": {
"pin": "B1"
diff --git a/keyboards/idyllic/tinny50_rgb/info.json b/keyboards/idyllic/tinny50_rgb/info.json
index 5407bd9c26..b3eb34a4c0 100644
--- a/keyboards/idyllic/tinny50_rgb/info.json
+++ b/keyboards/idyllic/tinny50_rgb/info.json
@@ -16,9 +16,6 @@
"console": false,
"command": false,
"nkro": true,
- "backlight": false,
- "rgblight": false,
- "audio": false,
"rgb_matrix": true
},
"diode_direction": "COL2ROW",
diff --git a/keyboards/jacky_studio/piggy60/rev2/config.h b/keyboards/jacky_studio/piggy60/rev2/config.h
index 2747834991..8c9b292fb4 100644
--- a/keyboards/jacky_studio/piggy60/rev2/config.h
+++ b/keyboards/jacky_studio/piggy60/rev2/config.h
@@ -19,5 +19,5 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 7
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 7
diff --git a/keyboards/jels/boaty/info.json b/keyboards/jels/boaty/info.json
index ca6257f6ef..6d85c5bd4f 100644
--- a/keyboards/jels/boaty/info.json
+++ b/keyboards/jels/boaty/info.json
@@ -16,8 +16,7 @@
"mousekey": false,
"extrakey": true,
"console": false,
- "command": false,
- "backlight": false
+ "command": false
},
"matrix_pins": {
"cols": ["B1", "C0", "C1", "C2", "D4", "D1", "D0", "C5", "C4", "C3", "D5"],
diff --git a/keyboards/kabedon/kabedon98e/config.h b/keyboards/kabedon/kabedon98e/config.h
index 514a1121b3..8eb549c134 100644
--- a/keyboards/kabedon/kabedon98e/config.h
+++ b/keyboards/kabedon/kabedon98e/config.h
@@ -17,8 +17,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
diff --git a/keyboards/kbdfans/odinmini/info.json b/keyboards/kbdfans/odinmini/info.json
index 19a854c4ce..a9cb1a798f 100644
--- a/keyboards/kbdfans/odinmini/info.json
+++ b/keyboards/kbdfans/odinmini/info.json
@@ -5,8 +5,6 @@
"bootloader": "rp2040",
"diode_direction": "COL2ROW",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"extrakey": true,
diff --git a/keyboards/kbdfans/tiger80/info.json b/keyboards/kbdfans/tiger80/info.json
index 1a2258deea..9761cb892d 100644
--- a/keyboards/kbdfans/tiger80/info.json
+++ b/keyboards/kbdfans/tiger80/info.json
@@ -4,8 +4,6 @@
"maintainer": "kbdfans",
"bootloader": "atmel-dfu",
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
diff --git a/keyboards/keebio/bamfk1/config.h b/keyboards/keebio/bamfk1/config.h
index 6fd93072f5..46fd4d7316 100644
--- a/keyboards/keebio/bamfk1/config.h
+++ b/keyboards/keebio/bamfk1/config.h
@@ -8,25 +8,3 @@
# define STARTUP_SONG SONG(STARTUP_SOUND)
#endif
-#define RGBLIGHT_DEFAULT_MODE (RGBLIGHT_MODE_RAINBOW_SWIRL + 2)
-
-/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
-#define LOCKING_SUPPORT_ENABLE
-/* Locking resynchronize hack */
-#define LOCKING_RESYNC_ENABLE
-
-/*
- * Feature disable options
- * These options are also useful to firmware size reduction.
- */
-
-/* disable debug print */
-//#define NO_DEBUG
-
-/* disable print */
-//#define NO_PRINT
-
-/* disable action features */
-//#define NO_ACTION_LAYER
-//#define NO_ACTION_TAPPING
-//#define NO_ACTION_ONESHOT
diff --git a/keyboards/keebio/bamfk1/info.json b/keyboards/keebio/bamfk1/info.json
index 4fa563f0e8..09e7edbd18 100644
--- a/keyboards/keebio/bamfk1/info.json
+++ b/keyboards/keebio/bamfk1/info.json
@@ -1,52 +1,112 @@
{
- "keyboard_name": "BAMFK-1",
"manufacturer": "Keebio",
- "url": "https://keeb.io",
+ "keyboard_name": "BAMFK-1",
"maintainer": "nooges",
- "usb": {
- "vid": "0xCB10",
- "pid": "0x1111",
- "device_version": "0.0.1"
- },
- "rgblight": {
- "saturation_steps": 8,
- "brightness_steps": 8,
- "led_count": 16,
- "sleep": true,
- "animations": {
- "breathing": true,
- "rainbow_mood": true,
- "rainbow_swirl": true,
- "snake": true,
- "knight": true,
- "christmas": true,
- "static_gradient": true,
- "rgb_test": true,
- "alternating": true
- }
- },
- "ws2812": {
- "pin": "D3"
- },
+ "bootloader": "atmel-dfu",
"encoder": {
"rotary": [
{"pin_a": "C7", "pin_b": "B5"},
{"pin_a": "D7", "pin_b": "D4"}
]
},
- "processor": "atmega32u4",
- "bootloader": "atmel-dfu",
+ "features": {
+ "bootmagic": true,
+ "extrakey": true,
+ "mousekey": true,
+ "rgb_matrix": true
+ },
"matrix_pins": {
"direct": [
["E6", "B6", "D6"]
]
},
+ "processor": "atmega32u4",
+ "rgb_matrix": {
+ "animations": {
+ "alphas_mods": true,
+ "band_pinwheel_sat": true,
+ "band_pinwheel_val": true,
+ "band_sat": true,
+ "band_spiral_sat": true,
+ "band_spiral_val": true,
+ "band_val": true,
+ "breathing": true,
+ "cycle_all": true,
+ "cycle_left_right": true,
+ "cycle_out_in": true,
+ "cycle_out_in_dual": true,
+ "cycle_pinwheel": true,
+ "cycle_spiral": true,
+ "cycle_up_down": true,
+ "digital_rain": true,
+ "dual_beacon": true,
+ "gradient_left_right": true,
+ "gradient_up_down": true,
+ "hue_breathing": true,
+ "hue_pendulum": true,
+ "hue_wave": true,
+ "jellybean_raindrops": true,
+ "multisplash": true,
+ "pixel_flow": true,
+ "pixel_fractal": true,
+ "pixel_rain": true,
+ "rainbow_beacon": true,
+ "rainbow_moving_chevron": true,
+ "rainbow_pinwheels": true,
+ "raindrops": true,
+ "solid_multisplash": true,
+ "solid_reactive": true,
+ "solid_reactive_cross": true,
+ "solid_reactive_multicross": true,
+ "solid_reactive_multinexus": true,
+ "solid_reactive_multiwide": true,
+ "solid_reactive_nexus": true,
+ "solid_reactive_simple": true,
+ "solid_reactive_wide": true,
+ "solid_splash": true,
+ "splash": true,
+ "typing_heatmap": true
+ },
+ "default": {
+ "animation": "cycle_pinwheel",
+ "speed": 48
+ },
+ "driver": "ws2812",
+ "layout": [
+ {"x": 56, "y": 0, "flags": 4},
+ {"x": 168, "y": 0, "flags": 4},
+ {"x": 224, "y": 16, "flags": 4},
+ {"x": 224, "y": 48, "flags": 4},
+ {"matrix": [0, 2], "x": 168, "y": 64, "flags": 4},
+ {"matrix": [0, 1], "x": 56, "y": 64, "flags": 4},
+ {"x": 0, "y": 48, "flags": 4},
+ {"x": 0, "y": 16, "flags": 4},
+ {"x": 0, "y": 0, "flags": 2},
+ {"x": 112, "y": 0, "flags": 2},
+ {"x": 224, "y": 0, "flags": 2},
+ {"x": 224, "y": 32, "flags": 2},
+ {"x": 224, "y": 64, "flags": 2},
+ {"x": 112, "y": 64, "flags": 2},
+ {"x": 224, "y": 64, "flags": 2},
+ {"matrix": [0, 0], "x": 112, "y": 32, "flags": 2}
+ ],
+ "sleep": true
+ },
+ "url": "https://keeb.io",
+ "usb": {
+ "device_version": "0.0.1",
+ "pid": "0x1211",
+ "vid": "0xCB10"
+ },
+ "ws2812": {
+ "pin": "D3"
+ },
"layouts": {
"LAYOUT": {
"layout": [
- {"x": 1, "y": 0, "h": 2, "w": 2, "matrix": [0, 0]},
- {"x": 0, "y": 2.25, "matrix": [0, 1]},
- {"x": 3, "y": 2.25, "matrix": [0, 2]}
+ {"matrix": [0, 0], "x": 1, "y": 0, "w": 2, "h": 2},
+ {"matrix": [0, 1], "x": 0, "y": 2.25},
+ {"matrix": [0, 2], "x": 3, "y": 2.25}
]
}
}
diff --git a/keyboards/keebio/bamfk1/rules.mk b/keyboards/keebio/bamfk1/rules.mk
index 21df40039e..6e7633bfe0 100644
--- a/keyboards/keebio/bamfk1/rules.mk
+++ b/keyboards/keebio/bamfk1/rules.mk
@@ -1,14 +1 @@
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = no # Console for debug
-COMMAND_ENABLE = no # Commands for debug and configuration
-NKRO_ENABLE = no # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
-AUDIO_ENABLE = yes # Audio output
-ENCODER_ENABLE = yes
-LTO_ENABLE = yes
+# This file intentionally left blank
diff --git a/keyboards/keebio/convolution/info.json b/keyboards/keebio/convolution/info.json
index 5e05d70ace..9ea761c1a9 100644
--- a/keyboards/keebio/convolution/info.json
+++ b/keyboards/keebio/convolution/info.json
@@ -10,9 +10,7 @@
"console": true,
"extrakey": true,
"mousekey": false,
- "nkro": false,
- "unicode": false,
- "backlight": false
+ "nkro": false
},
"layout_aliases": {"LAYOUT": "LAYOUT_all"}
}
diff --git a/keyboards/keebio/convolution/rev1/info.json b/keyboards/keebio/convolution/rev1/info.json
index 5ff7c1f8f0..68ac532620 100644
--- a/keyboards/keebio/convolution/rev1/info.json
+++ b/keyboards/keebio/convolution/rev1/info.json
@@ -9,8 +9,6 @@
"diode_direction": "COL2ROW",
"features": {
"console": true,
- "rgblight": false,
- "backlight": false,
"rgb_matrix": true
},
"matrix_pins": {
diff --git a/keyboards/keebio/sinc/info.json b/keyboards/keebio/sinc/info.json
index a55f42649e..aa1e08f39d 100644
--- a/keyboards/keebio/sinc/info.json
+++ b/keyboards/keebio/sinc/info.json
@@ -6,14 +6,12 @@
"vid": "0xCB10"
},
"features": {
- "audio": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": false,
- "nkro": false,
- "unicode": false
+ "nkro": false
},
"split": {
"enabled": true
diff --git a/keyboards/keebio/sinc/rev3/info.json b/keyboards/keebio/sinc/rev3/info.json
index e20cd24f19..da828dbb35 100644
--- a/keyboards/keebio/sinc/rev3/info.json
+++ b/keyboards/keebio/sinc/rev3/info.json
@@ -9,8 +9,6 @@
"diode_direction": "COL2ROW",
"features": {
"console": true,
- "rgblight": false,
- "backlight": false,
"rgb_matrix": true
},
"split": {
diff --git a/keyboards/keychron/q1v1/iso/iso.c b/keyboards/keychron/q1v1/iso/iso.c
index affc41d219..ef4f3425af 100644
--- a/keyboards/keychron/q1v1/iso/iso.c
+++ b/keyboards/keychron/q1v1/iso/iso.c
@@ -121,28 +121,28 @@ led_config_t g_led_config = {
// Key Matrix to LED Index
{ 0, __, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14 },
{ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 },
- { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44 },
- { 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 71, 57, 58 },
- { 59, __, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 80, 70, 13 },
- { 72, 73, 74, __, __, __, 75, __, __, __, 76, 77, 78, 79, 81 }
+ { 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 57, 43 },
+ { 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 72, 56, 58 },
+ { 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 81, 71, 13 },
+ { 73, 74, 75, __, __, __, 76, __, __, __, 77, 78, 79, 80, 82 }
},
{
// LED Index to Physical Position
{0,0}, {18,0}, {33,0}, {48,0}, {62,0}, {81,0}, {95,0}, {110,0}, {125,0}, {143,0}, {158,0}, {173,0}, {187,0}, {206,0}, {224,0},
{0,15}, {15,15}, {29,15}, {44,15}, {59,15}, {73,15}, {88,15}, {103,15}, {118,15}, {132,15}, {147,15}, {162,15}, {176,15}, {198,15}, {224,15},
- {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {140,26}, {154,26}, {169,26}, {184,26}, {202,26}, {224,26},
- {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {129,38}, {143,38}, {158,38}, {173,38}, {196,38}, {224,38},
- {9,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {151,49}, {165,49}, {185,49}, {209,52},
- {2,61}, {20,61}, {39,61}, {94,61}, {147,61}, {162,61}, {176,61}, {195,64}, {209,64}, {224,64}
+ {4,26}, {22,26}, {37,26}, {51,26}, {66,26}, {81,26}, {95,26}, {110,26}, {125,26}, {140,26}, {154,26}, {169,26}, {184,26}, {224,26},
+ {6,38}, {26,38}, {40,38}, {55,38}, {70,38}, {84,38}, {99,38}, {114,38}, {129,38}, {143,38}, {158,38}, {173,38}, {187,38}, {203,32}, {224,38},
+ {2,49}, {18,49}, {33,49}, {48,49}, {62,49}, {77,49}, {92,49}, {106,49}, {121,49}, {136,49}, {151,49}, {165,49}, {185,49}, {209,52},
+ {2,61}, {20,61}, {39,61}, {94,61}, {147,61}, {162,61}, {176,61}, {195,64}, {209,64}, {224,64}
},
{
// RGB LED Index to Flag
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
- 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
- 1, 1, 1, 4, 1, 1, 1, 1, 1, 1
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1,
+ 1, 1, 1, 4, 1, 1, 1, 1, 1, 1
}
};
diff --git a/keyboards/keychron/q4/info.json b/keyboards/keychron/q4/info.json
index e314477ab9..59f6caef92 100644
--- a/keyboards/keychron/q4/info.json
+++ b/keyboards/keychron/q4/info.json
@@ -16,16 +16,13 @@
}
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"cols": ["C14", "C15", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "B0", "B1", "A8", "A9"],
diff --git a/keyboards/keyspensory/kp60/info.json b/keyboards/keyspensory/kp60/info.json
index 469faa2cd2..1172e14d45 100644
--- a/keyboards/keyspensory/kp60/info.json
+++ b/keyboards/keyspensory/kp60/info.json
@@ -22,9 +22,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgblight": true,
- "backlight": false,
- "audio": false
+ "rgblight": true
},
"rgblight": {
"led_count": 8,
diff --git a/keyboards/kinesis/alvicstep/info.json b/keyboards/kinesis/alvicstep/info.json
index 293b0168a4..951f01203c 100644
--- a/keyboards/kinesis/alvicstep/info.json
+++ b/keyboards/kinesis/alvicstep/info.json
@@ -12,9 +12,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"processor": "at90usb1286",
"bootloader": "halfkay",
diff --git a/keyboards/kinesis/kint2pp/info.json b/keyboards/kinesis/kint2pp/info.json
index ecf86658a8..48d77942db 100644
--- a/keyboards/kinesis/kint2pp/info.json
+++ b/keyboards/kinesis/kint2pp/info.json
@@ -13,9 +13,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"build": {
"debounce_type": "sym_eager_pk"
diff --git a/keyboards/kinesis/kint36/info.json b/keyboards/kinesis/kint36/info.json
index 969f819f80..592fade4cb 100644
--- a/keyboards/kinesis/kint36/info.json
+++ b/keyboards/kinesis/kint36/info.json
@@ -13,9 +13,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"build": {
"debounce_type": "sym_eager_pk"
diff --git a/keyboards/kinesis/kint41/info.json b/keyboards/kinesis/kint41/info.json
index eec726cf51..c1eb7b8465 100644
--- a/keyboards/kinesis/kint41/info.json
+++ b/keyboards/kinesis/kint41/info.json
@@ -13,9 +13,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"build": {
"debounce_type": "sym_eager_pk"
diff --git a/keyboards/kinesis/kintlc/info.json b/keyboards/kinesis/kintlc/info.json
index 13c2f9a55c..07c81e1c89 100644
--- a/keyboards/kinesis/kintlc/info.json
+++ b/keyboards/kinesis/kintlc/info.json
@@ -13,9 +13,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"build": {
"debounce_type": "sym_eager_pk"
diff --git a/keyboards/kinesis/kintwin/info.json b/keyboards/kinesis/kintwin/info.json
index ed67c36af3..92727e9ecb 100644
--- a/keyboards/kinesis/kintwin/info.json
+++ b/keyboards/kinesis/kintwin/info.json
@@ -18,9 +18,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"matrix_pins": {
"rows": ["A0", "A1", "A2", "A3", "A4", "A5", "A6"],
diff --git a/keyboards/kinesis/nguyenvietyen/info.json b/keyboards/kinesis/nguyenvietyen/info.json
index 123b42e9bf..2a99a4e600 100644
--- a/keyboards/kinesis/nguyenvietyen/info.json
+++ b/keyboards/kinesis/nguyenvietyen/info.json
@@ -12,9 +12,7 @@
"command": true,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"indicators": {
"caps_lock": "E6",
diff --git a/keyboards/kinesis/stapelberg/info.json b/keyboards/kinesis/stapelberg/info.json
index 44e2a33157..6ad972d247 100644
--- a/keyboards/kinesis/stapelberg/info.json
+++ b/keyboards/kinesis/stapelberg/info.json
@@ -12,9 +12,7 @@
"command": false,
"mousekey": true,
"extrakey": true,
- "nkro": true,
- "audio": false,
- "backlight": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["B0", "B1", "B2", "B3", "B4", "B5", "B6"],
diff --git a/keyboards/kprepublic/bm16a/v1/info.json b/keyboards/kprepublic/bm16a/v1/info.json
index 9e99832b3e..85173a89cc 100644
--- a/keyboards/kprepublic/bm16a/v1/info.json
+++ b/keyboards/kprepublic/bm16a/v1/info.json
@@ -18,8 +18,7 @@
"command": false,
"nkro": true,
"backlight": true,
- "rgblight": true,
- "audio": false
+ "rgblight": true
},
"matrix_pins": {
"rows": ["D3", "D5", "D1", "D2"],
diff --git a/keyboards/kprepublic/bm16a/v2/config.h b/keyboards/kprepublic/bm16a/v2/config.h
index 3ef55f3d42..8014b69a98 100644
--- a/keyboards/kprepublic/bm16a/v2/config.h
+++ b/keyboards/kprepublic/bm16a/v2/config.h
@@ -5,5 +5,5 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 7
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 7
diff --git a/keyboards/kprepublic/bm40hsrgb/rev2/info.json b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
index 64b35fc25c..cfaabd5c9e 100644
--- a/keyboards/kprepublic/bm40hsrgb/rev2/info.json
+++ b/keyboards/kprepublic/bm40hsrgb/rev2/info.json
@@ -12,9 +12,7 @@
"tri_layer": true,
"console": false,
"command": false,
- "nkro": false,
- "backlight": false,
- "audio": false
+ "nkro": false
},
"usb": {
"vid": "0x4B50",
diff --git a/keyboards/kuro/kuro65/info.json b/keyboards/kuro/kuro65/info.json
index fc89b989d3..72549735d9 100644
--- a/keyboards/kuro/kuro65/info.json
+++ b/keyboards/kuro/kuro65/info.json
@@ -25,10 +25,6 @@
"console": false,
"command": false,
"nkro": true,
- "backlight": false,
- "rgblight": false,
- "audio": false,
- "key_lock": false,
"rgb_matrix": true
},
"ws2812": {
diff --git a/keyboards/laneware/raindrop/info.json b/keyboards/laneware/raindrop/info.json
index bc67d437fa..d1896a41b4 100644
--- a/keyboards/laneware/raindrop/info.json
+++ b/keyboards/laneware/raindrop/info.json
@@ -21,11 +21,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "audio": false,
- "rgblight": false,
- "sleep_led": false
+ "nkro": true
},
"layout_aliases": {
"LAYOUT_all": "LAYOUT_64_ansi_split_bs"
diff --git a/keyboards/linworks/fave84h/info.json b/keyboards/linworks/fave84h/info.json
index 11ef16f2a3..1ca6cb911a 100644
--- a/keyboards/linworks/fave84h/info.json
+++ b/keyboards/linworks/fave84h/info.json
@@ -12,8 +12,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "D2"
diff --git a/keyboards/linworks/whale75/config.h b/keyboards/linworks/whale75/config.h
index 629c1dcf70..84b3c45cd9 100644
--- a/keyboards/linworks/whale75/config.h
+++ b/keyboards/linworks/whale75/config.h
@@ -24,5 +24,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 7
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 7
diff --git a/keyboards/loki65/config.h b/keyboards/loki65/config.h
index 3627f4c7e6..ac6b9f5ceb 100644
--- a/keyboards/loki65/config.h
+++ b/keyboards/loki65/config.h
@@ -24,6 +24,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
#define WS2812_BYTE_ORDER WS2812_BYTE_ORDER_RGB
diff --git a/keyboards/mariorion_v25/prod/config.h b/keyboards/mariorion_v25/prod/config.h
index 042f7662d8..8895d16ece 100644
--- a/keyboards/mariorion_v25/prod/config.h
+++ b/keyboards/mariorion_v25/prod/config.h
@@ -7,9 +7,9 @@
#define WS2812_PWM_DRIVER PWMD17
#define WS2812_PWM_CHANNEL 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 1
-// #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 1
+// #define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
#define INDICATOR_0 C9
#define INDICATOR_1 C8
diff --git a/keyboards/mariorion_v25/proto/config.h b/keyboards/mariorion_v25/proto/config.h
index 6865f2dbb0..894b8fbf9e 100644
--- a/keyboards/mariorion_v25/proto/config.h
+++ b/keyboards/mariorion_v25/proto/config.h
@@ -7,9 +7,9 @@
#define WS2812_PWM_DRIVER PWMD17
#define WS2812_PWM_CHANNEL 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 1
-// #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 1
+// #define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM17_UP
#define INDICATOR_0 C8
#define INDICATOR_1 C7
diff --git a/keyboards/maxr1998/phoebe/info.json b/keyboards/maxr1998/phoebe/info.json
index 7bb3832cbe..f6913ece0b 100644
--- a/keyboards/maxr1998/phoebe/info.json
+++ b/keyboards/maxr1998/phoebe/info.json
@@ -10,7 +10,6 @@
"features": {
"bootmagic": true,
"nkro": true,
- "backlight": false,
"rgblight": true,
"key_lock": true,
"leader": true
diff --git a/keyboards/mechlovin/mechlovin9/rev3/info.json b/keyboards/mechlovin/mechlovin9/rev3/info.json
index f5efcc1f6a..faa4cf0a87 100644
--- a/keyboards/mechlovin/mechlovin9/rev3/info.json
+++ b/keyboards/mechlovin/mechlovin9/rev3/info.json
@@ -6,9 +6,6 @@
"pid": "0x6509",
"device_version": "0.0.3"
},
- "features": {
- "backlight": false
- },
"bootmagic": {
"matrix": [0, 13]
},
diff --git a/keyboards/mechlovin/olly/octagon/halconf.h b/keyboards/mechlovin/olly/octagon/halconf.h
index 3635a5c4a2..55add1de63 100644
--- a/keyboards/mechlovin/olly/octagon/halconf.h
+++ b/keyboards/mechlovin/olly/octagon/halconf.h
@@ -20,6 +20,4 @@
#define HAL_USE_SPI TRUE
-
#include_next <halconf.h>
-
diff --git a/keyboards/mechlovin/olly/octagon/info.json b/keyboards/mechlovin/olly/octagon/info.json
index 3ef290d351..81b78b0b1c 100644
--- a/keyboards/mechlovin/olly/octagon/info.json
+++ b/keyboards/mechlovin/olly/octagon/info.json
@@ -8,20 +8,25 @@
"pid": "0xD750",
"device_version": "0.0.1"
},
+ "features": {
+ "bootmagic": true,
+ "mousekey": true,
+ "extrakey": true,
+ "nkro": true,
+ "led_matrix": true,
+ "rgblight": true
+ },
+ "build": {
+ "lto": true
+ },
"rgblight": {
"saturation_steps": 8,
"brightness_steps": 8,
"led_count": 26,
"animations": {
"breathing": true,
- "rainbow_mood": true,
"rainbow_swirl": true,
- "snake": true,
- "knight": true,
- "christmas": true,
"static_gradient": true,
- "rgb_test": true,
- "alternating": true,
"twinkle": true
}
},
diff --git a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
index fcb4929654..353f5f5d6d 100644
--- a/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
+++ b/keyboards/mechlovin/olly/octagon/keymaps/default/keymap.c
@@ -15,16 +15,13 @@
*/
#include QMK_KEYBOARD_H
-#define LT1_CAP LT(1, KC_CAPS)
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_split_bs(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_PAUS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
- LT1_CAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_END,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
-
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
};
diff --git a/keyboards/mechlovin/olly/octagon/keymaps/default/readme.md b/keyboards/mechlovin/olly/octagon/keymaps/default/readme.md
deleted file mode 100644
index 17d8ba9e07..0000000000
--- a/keyboards/mechlovin/olly/octagon/keymaps/default/readme.md
+++ /dev/null
@@ -1 +0,0 @@
-# The default keymap for octagon \ No newline at end of file
diff --git a/keyboards/mechlovin/olly/octagon/keymaps/via/keymap.c b/keyboards/mechlovin/olly/octagon/keymaps/via/keymap.c
index 2de37e94d3..353f5f5d6d 100644
--- a/keyboards/mechlovin/olly/octagon/keymaps/via/keymap.c
+++ b/keyboards/mechlovin/olly/octagon/keymaps/via/keymap.c
@@ -15,40 +15,13 @@
*/
#include QMK_KEYBOARD_H
-#define LT1_CAP LT(1, KC_CAPS)
-
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
[0] = LAYOUT_split_bs(
KC_ESC, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, KC_F11, KC_F12, KC_PSCR, KC_PAUS, KC_DEL,
KC_GRV, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, KC_MINS, KC_EQL, KC_BSPC, KC_DEL, KC_HOME,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_LBRC, KC_RBRC, KC_BSLS, KC_PGUP,
- LT1_CAP, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
+ KC_CAPS, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, KC_QUOT, KC_NUHS, KC_ENT, KC_PGDN,
KC_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LSFT, KC_UP, KC_END,
- KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, MO(1), KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
- ),
- [1] = LAYOUT_split_bs(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
- [1] = LAYOUT_split_bs(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
- [1] = LAYOUT_split_bs(
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
- KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS
- ),
-
+ KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, _______, KC_RCTL, KC_LEFT, KC_DOWN, KC_RGHT
+ )
};
diff --git a/keyboards/mechlovin/olly/octagon/mcuconf.h b/keyboards/mechlovin/olly/octagon/mcuconf.h
index 607305e567..6e4987337d 100644
--- a/keyboards/mechlovin/olly/octagon/mcuconf.h
+++ b/keyboards/mechlovin/olly/octagon/mcuconf.h
@@ -19,7 +19,6 @@
#include_next <mcuconf.h>
-
#undef STM32_SPI_USE_SPI1
#define STM32_SPI_USE_SPI1 TRUE
diff --git a/keyboards/mechlovin/olly/octagon/octagon.c b/keyboards/mechlovin/olly/octagon/octagon.c
index 185ee32a3e..c89565168b 100644
--- a/keyboards/mechlovin/olly/octagon/octagon.c
+++ b/keyboards/mechlovin/olly/octagon/octagon.c
@@ -55,12 +55,13 @@ led_config_t g_led_config = {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
- }
+ }
};
-
bool led_matrix_indicators_kb(void) {
- if (!led_matrix_indicators_user()) { return false; }
+ if (!led_matrix_indicators_user()) {
+ return false;
+ }
if (host_keyboard_led_state().caps_lock) {
led_matrix_set_value(87, 0xFF);
led_matrix_set_value(47, 0xFF);
@@ -80,33 +81,25 @@ bool led_matrix_indicators_kb(void) {
return true;
}
-
layer_state_t layer_state_set_kb(layer_state_t state) {
- // if on layer 1, turn on L1 LED, otherwise off.
- if (get_highest_layer(state) == 0) {
- led_matrix_set_value(90, 0xFF);
- } else {
- led_matrix_set_value(90, 0x00);
- }
- // if on layer 2, turn on L2 LED, otherwise off.
- if (get_highest_layer(state) == 1) {
- led_matrix_set_value(91, 0xFF);
- } else {
- led_matrix_set_value(91, 0x00);
- }
-
- // if on layer 3, turn on L3 LED, otherwise off.
- if (get_highest_layer(state) == 2) {
- led_matrix_set_value(92, 0xFF);
- } else {
- led_matrix_set_value(92, 0x00);
- }
-
- // if on layer 4, turn on L4 LED, otherwise off.
- if (get_highest_layer(state) == 3) {
- led_matrix_set_value(93, 0xFF);
- } else {
- led_matrix_set_value(93, 0x00);
+ switch (get_highest_layer(state)) {
+ case 0:
+ led_matrix_set_value(90, 0xFF);
+ break;
+ case 1:
+ led_matrix_set_value(91, 0xFF);
+ break;
+ case 2:
+ led_matrix_set_value(92, 0xFF);
+ break;
+ case 3:
+ led_matrix_set_value(93, 0xFF);
+ break;
+ default:
+ led_matrix_set_value(90, 0x00);
+ led_matrix_set_value(91, 0x00);
+ led_matrix_set_value(92, 0x00);
+ led_matrix_set_value(93, 0x00);
}
return layer_state_set_user(state);
-} \ No newline at end of file
+}
diff --git a/keyboards/mechlovin/olly/octagon/readme.md b/keyboards/mechlovin/olly/octagon/readme.md
index 6f1833a571..5bf144ff5b 100644
--- a/keyboards/mechlovin/olly/octagon/readme.md
+++ b/keyboards/mechlovin/olly/octagon/readme.md
@@ -1,6 +1,6 @@
# Olly Octagon
-![Olly Octagon](https://i.imgur.com/lDMnyS4l.png)
+![Olly Octagon](https://i.imgur.com/lDMnyS4lh.png)
A replacement PCB for Duck Octagon 75% keyboard.
@@ -24,5 +24,5 @@ Enter the bootloader in 3 ways:
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (Escape) and plug in the keyboard
* **Bootloader reset**: Hold down the key at (0,14) in the matrix (Backspace) and plug in the keyboard
-* **Keycode in layout**: Press the key mapped to `RESET` if it is available
+* **Keycode in layout**: Press the key mapped to `QK_BOOT` if it is available
* **Hardware reset**: Press reset button (located on the bottom side of the PCB)
diff --git a/keyboards/mechlovin/olly/octagon/rules.mk b/keyboards/mechlovin/olly/octagon/rules.mk
index 97303c7e2f..6e7633bfe0 100644
--- a/keyboards/mechlovin/olly/octagon/rules.mk
+++ b/keyboards/mechlovin/olly/octagon/rules.mk
@@ -1,14 +1 @@
-# Build Options
-# change yes to no to disable
-#
-BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite
-MOUSEKEY_ENABLE = yes # Mouse keys
-EXTRAKEY_ENABLE = yes # Audio control and System control
-CONSOLE_ENABLE = yes # Console for debug
-COMMAND_ENABLE = yes # Commands for debug and configuration
-NKRO_ENABLE = yes # Enable N-Key Rollover
-BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
-RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow
-AUDIO_ENABLE = no # Audio output
-LED_MATRIX_ENABLE = yes
-RGBLIGHT_ENABLE = yes \ No newline at end of file
+# This file intentionally left blank
diff --git a/keyboards/mechlovin/zed65/910/info.json b/keyboards/mechlovin/zed65/910/info.json
index d1de863c03..3b1472014d 100644
--- a/keyboards/mechlovin/zed65/910/info.json
+++ b/keyboards/mechlovin/zed65/910/info.json
@@ -9,7 +9,6 @@
"device_version": "0.0.1"
},
"features": {
- "backlight": false,
"nkro": true,
"rgblight": true
},
diff --git a/keyboards/meetlab/kalice/config.h b/keyboards/meetlab/kalice/config.h
index 80bae79fd8..052bfa4bdf 100644
--- a/keyboards/meetlab/kalice/config.h
+++ b/keyboards/meetlab/kalice/config.h
@@ -19,5 +19,5 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5 \ No newline at end of file
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5 \ No newline at end of file
diff --git a/keyboards/meetlab/rena/config.h b/keyboards/meetlab/rena/config.h
index ef8715e384..6a6a4a2cae 100644
--- a/keyboards/meetlab/rena/config.h
+++ b/keyboards/meetlab/rena/config.h
@@ -18,5 +18,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 3
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/miiiw/blackio83/info.json b/keyboards/miiiw/blackio83/info.json
index ef0e15efb9..24dc644405 100644
--- a/keyboards/miiiw/blackio83/info.json
+++ b/keyboards/miiiw/blackio83/info.json
@@ -6,7 +6,6 @@
"debounce": 3,
"diode_direction": "COL2ROW",
"features": {
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
@@ -15,8 +14,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"indicators": {
"caps_lock": "B2",
diff --git a/keyboards/misterknife/knife66/config.h b/keyboards/misterknife/knife66/config.h
index 7f7e117303..2b8d7b8b9f 100644
--- a/keyboards/misterknife/knife66/config.h
+++ b/keyboards/misterknife/knife66/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1 // default: PWMD1
#define WS2812_PWM_CHANNEL 2 // default: 2
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
diff --git a/keyboards/misterknife/knife66_iso/config.h b/keyboards/misterknife/knife66_iso/config.h
index cb847450ba..f9f0707ff1 100644
--- a/keyboards/misterknife/knife66_iso/config.h
+++ b/keyboards/misterknife/knife66_iso/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1 // default: PWMD1
#define WS2812_PWM_CHANNEL 2 // default: 2
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
diff --git a/keyboards/mk65/info.json b/keyboards/mk65/info.json
index 44a8e15f15..9135deaf19 100644
--- a/keyboards/mk65/info.json
+++ b/keyboards/mk65/info.json
@@ -30,10 +30,7 @@
"console": false,
"command": false,
"nkro": true,
- "backlight": false,
- "rgblight": true,
- "audio": false,
- "key_lock": false
+ "rgblight": true
},
"rgblight": {
"led_count": 7,
diff --git a/keyboards/mlego/m65/rev1/info.json b/keyboards/mlego/m65/rev1/info.json
index d8bb91de30..2f77137eec 100644
--- a/keyboards/mlego/m65/rev1/info.json
+++ b/keyboards/mlego/m65/rev1/info.json
@@ -11,8 +11,6 @@
]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
diff --git a/keyboards/mlego/m65/rev2/info.json b/keyboards/mlego/m65/rev2/info.json
index e8575e23e8..0014767309 100644
--- a/keyboards/mlego/m65/rev2/info.json
+++ b/keyboards/mlego/m65/rev2/info.json
@@ -10,8 +10,6 @@
]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": true,
"console": false,
diff --git a/keyboards/mlego/m65/rev3/info.json b/keyboards/mlego/m65/rev3/info.json
index d48d52d9d9..4b7980b63b 100644
--- a/keyboards/mlego/m65/rev3/info.json
+++ b/keyboards/mlego/m65/rev3/info.json
@@ -11,8 +11,6 @@
]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
diff --git a/keyboards/mlego/m65/rev4/info.json b/keyboards/mlego/m65/rev4/info.json
index 56fed15317..ab2a708ba8 100644
--- a/keyboards/mlego/m65/rev4/info.json
+++ b/keyboards/mlego/m65/rev4/info.json
@@ -11,8 +11,6 @@
]
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": true,
diff --git a/keyboards/mode/m256wh/config.h b/keyboards/mode/m256wh/config.h
index c976b6bcc5..06f1658ea5 100644
--- a/keyboards/mode/m256wh/config.h
+++ b/keyboards/mode/m256wh/config.h
@@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
#define EECONFIG_KB_DATA_SIZE (1)
diff --git a/keyboards/mode/m256ws/config.h b/keyboards/mode/m256ws/config.h
index c976b6bcc5..06f1658ea5 100644
--- a/keyboards/mode/m256ws/config.h
+++ b/keyboards/mode/m256ws/config.h
@@ -21,7 +21,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
#define EECONFIG_KB_DATA_SIZE (1)
diff --git a/keyboards/mode/m60h/config.h b/keyboards/mode/m60h/config.h
index f984cf28de..cde4ffdbc6 100644
--- a/keyboards/mode/m60h/config.h
+++ b/keyboards/mode/m60h/config.h
@@ -5,6 +5,6 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_PWM_DMA_CHANNEL 2
#define WS2812_PWM_TARGET_PERIOD 800000 \ No newline at end of file
diff --git a/keyboards/mode/m60h_f/config.h b/keyboards/mode/m60h_f/config.h
index f984cf28de..cde4ffdbc6 100644
--- a/keyboards/mode/m60h_f/config.h
+++ b/keyboards/mode/m60h_f/config.h
@@ -5,6 +5,6 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_PWM_DMA_CHANNEL 2
#define WS2812_PWM_TARGET_PERIOD 800000 \ No newline at end of file
diff --git a/keyboards/mode/m60s/config.h b/keyboards/mode/m60s/config.h
index f984cf28de..cde4ffdbc6 100644
--- a/keyboards/mode/m60s/config.h
+++ b/keyboards/mode/m60s/config.h
@@ -5,6 +5,6 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_PWM_DMA_CHANNEL 2
#define WS2812_PWM_TARGET_PERIOD 800000 \ No newline at end of file
diff --git a/keyboards/momokai/aurora/info.json b/keyboards/momokai/aurora/info.json
index 888398aa36..84ecbdeb4a 100644
--- a/keyboards/momokai/aurora/info.json
+++ b/keyboards/momokai/aurora/info.json
@@ -43,6 +43,12 @@
"pin": "C7"
},
"rgb_matrix": {
+ "default": {
+ "animation": "solid_color",
+ "hue": 0,
+ "sat": 0,
+ "val": 200
+ },
"animations": {
"gradient_up_down": true,
"gradient_left_right": true,
diff --git a/keyboards/momokai/tap_duo/info.json b/keyboards/momokai/tap_duo/info.json
index 9a0a9a2e1d..cbf5ce94d7 100644
--- a/keyboards/momokai/tap_duo/info.json
+++ b/keyboards/momokai/tap_duo/info.json
@@ -12,6 +12,12 @@
"pin": "F0"
},
"rgb_matrix": {
+ "default": {
+ "animation": "solid_color",
+ "hue": 0,
+ "sat": 0,
+ "val": 200
+ },
"animations": {
"gradient_left_right": true,
"breathing": true,
diff --git a/keyboards/momokai/tap_trio/info.json b/keyboards/momokai/tap_trio/info.json
index f995501969..c2ff9a5ff7 100644
--- a/keyboards/momokai/tap_trio/info.json
+++ b/keyboards/momokai/tap_trio/info.json
@@ -12,6 +12,12 @@
"pin": "F0"
},
"rgb_matrix": {
+ "default": {
+ "animation": "solid_color",
+ "hue": 0,
+ "sat": 0,
+ "val": 200
+ },
"animations": {
"gradient_up_down": true,
"gradient_left_right": true,
diff --git a/keyboards/montsinger/palmetto/info.json b/keyboards/montsinger/palmetto/info.json
index efe81dd9c3..9ff29ba893 100755
--- a/keyboards/montsinger/palmetto/info.json
+++ b/keyboards/montsinger/palmetto/info.json
@@ -8,8 +8,7 @@
"bootmagic": true,
"extrakey": true,
"mousekey": true,
- "nkro": true,
- "rgblight": false
+ "nkro": true
},
"matrix_pins": {
"cols": ["GP28", "GP27", "GP29", "GP0", "GP1", "GP9", "GP26", "GP18", "GP10", "GP11", "GP25", "GP24", "GP12", "GP21", "GP13"],
diff --git a/keyboards/mwstudio/mmk_3/config.h b/keyboards/mwstudio/mmk_3/config.h
index 0265d3ed6e..f8916cddd0 100644
--- a/keyboards/mwstudio/mmk_3/config.h
+++ b/keyboards/mwstudio/mmk_3/config.h
@@ -22,5 +22,5 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/mwstudio/mw660/config.h b/keyboards/mwstudio/mw660/config.h
index 87659c1f67..58d0eee9e0 100644
--- a/keyboards/mwstudio/mw660/config.h
+++ b/keyboards/mwstudio/mw660/config.h
@@ -20,5 +20,5 @@
#define WS2812_PWM_CHANNEL 3 // default: 2
//#define WS2812_PWM_COMPLEMENTARY_OUTPUT // Define for a complementary timer output (TIMx_CHyN); omit for a normal timer output (TIMx_CHy).
#define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 2 \ No newline at end of file
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 2 \ No newline at end of file
diff --git a/keyboards/navi60/info.json b/keyboards/navi60/info.json
index dde3b09ff8..42c3e5da1d 100644
--- a/keyboards/navi60/info.json
+++ b/keyboards/navi60/info.json
@@ -21,11 +21,7 @@
"extrakey": true,
"console": false,
"command": false,
- "nkro": true,
- "backlight": false,
- "rgblight": false,
- "audio": false,
- "key_lock": false
+ "nkro": true
},
"layouts": {
"LAYOUT": {
diff --git a/keyboards/novelkeys/nk20/config.h b/keyboards/novelkeys/nk20/config.h
index 317cc2c3e8..750a033568 100644
--- a/keyboards/novelkeys/nk20/config.h
+++ b/keyboards/novelkeys/nk20/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/novelkeys/nk65b/config.h b/keyboards/novelkeys/nk65b/config.h
index 40e3b54053..eaddb87b82 100755
--- a/keyboards/novelkeys/nk65b/config.h
+++ b/keyboards/novelkeys/nk65b/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/novelkeys/nk87b/config.h b/keyboards/novelkeys/nk87b/config.h
index a79137e7d9..933d4ed5c0 100644
--- a/keyboards/novelkeys/nk87b/config.h
+++ b/keyboards/novelkeys/nk87b/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/novelkeys/nk_plus/config.h b/keyboards/novelkeys/nk_plus/config.h
index 40e3b54053..eaddb87b82 100644
--- a/keyboards/novelkeys/nk_plus/config.h
+++ b/keyboards/novelkeys/nk_plus/config.h
@@ -20,5 +20,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/novelkeys/nk_plus/info.json b/keyboards/novelkeys/nk_plus/info.json
index 41beca3682..b823d2808b 100755
--- a/keyboards/novelkeys/nk_plus/info.json
+++ b/keyboards/novelkeys/nk_plus/info.json
@@ -14,15 +14,13 @@
"rows": ["B2", "B1", "B0", "B10", "B3"]
},
"features": {
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"processor": "STM32F072",
"bootloader": "stm32-dfu",
diff --git a/keyboards/planck/ez/config.h b/keyboards/planck/ez/config.h
index 74d8d21155..e4fa0924d3 100644
--- a/keyboards/planck/ez/config.h
+++ b/keyboards/planck/ez/config.h
@@ -46,8 +46,8 @@
// #define WS2812_TIM_CH 2
// #define PORT_WS2812 GPIOA
// #define PIN_WS2812 1
-// #define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection)
-//#define WS2812_DMA_CHANNEL 7 // DMA channel for TIMx_UP
+// #define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA stream for TIMx_UP (look up in reference manual under DMA Channel selection)
+//#define WS2812_PWM_DMA_CHANNEL 7 // DMA channel for TIMx_UP
//#define WS2812_EXTERNAL_PULLUP
#define IS31FL3737_I2C_ADDRESS_1 IS31FL3737_I2C_ADDRESS_GND
diff --git a/keyboards/planck/rev6/config.h b/keyboards/planck/rev6/config.h
index 7fec8be56b..0935fad358 100644
--- a/keyboards/planck/rev6/config.h
+++ b/keyboards/planck/rev6/config.h
@@ -46,5 +46,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/planck/rev6_drop/config.h b/keyboards/planck/rev6_drop/config.h
index 7fec8be56b..0935fad358 100644
--- a/keyboards/planck/rev6_drop/config.h
+++ b/keyboards/planck/rev6_drop/config.h
@@ -46,5 +46,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/planck/rev7/config.h b/keyboards/planck/rev7/config.h
index a5e49c8a53..9ccbf4cc8a 100644
--- a/keyboards/planck/rev7/config.h
+++ b/keyboards/planck/rev7/config.h
@@ -27,8 +27,8 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
/*
* Feature disable options
diff --git a/keyboards/preonic/rev3/config.h b/keyboards/preonic/rev3/config.h
index 7800131a90..6a842105b2 100644
--- a/keyboards/preonic/rev3/config.h
+++ b/keyboards/preonic/rev3/config.h
@@ -44,5 +44,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/preonic/rev3_drop/config.h b/keyboards/preonic/rev3_drop/config.h
index 7800131a90..6a842105b2 100644
--- a/keyboards/preonic/rev3_drop/config.h
+++ b/keyboards/preonic/rev3_drop/config.h
@@ -44,5 +44,5 @@
#define WS2812_PWM_DRIVER PWMD2
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 2
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 2
diff --git a/keyboards/protozoa/p01/config.h b/keyboards/protozoa/p01/config.h
index fd58bda912..3b14a164f6 100644
--- a/keyboards/protozoa/p01/config.h
+++ b/keyboards/protozoa/p01/config.h
@@ -21,5 +21,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
diff --git a/keyboards/qwertykeys/qk100/ansi/info.json b/keyboards/qwertykeys/qk100/ansi/info.json
index 3469f1c62e..fb52f388de 100644
--- a/keyboards/qwertykeys/qk100/ansi/info.json
+++ b/keyboards/qwertykeys/qk100/ansi/info.json
@@ -140,7 +140,6 @@
"hue_breathing": true,
"hue_pendulum": true,
"hue_wave": true,
- "pixel_fractal": true,
"pixel_flow": true,
"pixel_rain": true,
"typing_heatmap": true,
@@ -148,15 +147,11 @@
"solid_reactive_simple": true,
"solid_reactive": true,
"solid_reactive_wide": true,
- "solid_reactive_multiwide": true,
"solid_reactive_cross": true,
- "solid_reactive_multicross": true,
"solid_reactive_nexus": true,
- "solid_reactive_multinexus": true,
"splash": true,
"multisplash": true,
- "solid_splash": true,
- "solid_multisplash": true
+ "solid_splash": true
},
"default": {
"val": 128
@@ -270,4 +265,4 @@
]
}
}
-} \ No newline at end of file
+}
diff --git a/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk b/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk
index 43061db1dd..1e5b99807c 100644
--- a/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk
+++ b/keyboards/qwertykeys/qk100/ansi/keymaps/via/rules.mk
@@ -1,2 +1 @@
VIA_ENABLE = yes
-LTO_ENABLE = yes \ No newline at end of file
diff --git a/keyboards/qwertykeys/qk100/info.json b/keyboards/qwertykeys/qk100/info.json
index d020ca8ad2..6edea6dff7 100644
--- a/keyboards/qwertykeys/qk100/info.json
+++ b/keyboards/qwertykeys/qk100/info.json
@@ -1,6 +1,5 @@
{
"manufacturer": "Qwertykeys",
- "url": "",
"maintainer": "Qwertykeys",
"usb": {
"vid": "0x4F53"
@@ -17,6 +16,9 @@
"rgblight": true,
"nkro": true
},
+ "build": {
+ "lto": true
+ },
"processor": "STM32F103",
"bootloader": "stm32duino",
"ws2812": {
@@ -47,4 +49,4 @@
"dynamic_keymap": {
"layer_count": 2
}
-} \ No newline at end of file
+}
diff --git a/keyboards/rgbkb/mun/config.h b/keyboards/rgbkb/mun/config.h
index b247fa91cd..74db14c061 100644
--- a/keyboards/rgbkb/mun/config.h
+++ b/keyboards/rgbkb/mun/config.h
@@ -54,8 +54,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
#define TOUCH_UPDATE_INTERVAL 33
#define OLED_UPDATE_INTERVAL 33
diff --git a/keyboards/rgbkb/sol3/config.h b/keyboards/rgbkb/sol3/config.h
index 2d3caeea4e..8348b44f96 100644
--- a/keyboards/rgbkb/sol3/config.h
+++ b/keyboards/rgbkb/sol3/config.h
@@ -46,8 +46,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
#define TOUCH_UPDATE_INTERVAL 33
#define OLED_UPDATE_INTERVAL 33
diff --git a/keyboards/sawnsprojects/eclipse/eclipse60/info.json b/keyboards/sawnsprojects/eclipse/eclipse60/info.json
index ad6c974136..7586ed5a34 100644
--- a/keyboards/sawnsprojects/eclipse/eclipse60/info.json
+++ b/keyboards/sawnsprojects/eclipse/eclipse60/info.json
@@ -22,10 +22,7 @@
"console": false,
"command": false,
"nkro": false,
- "backlight": false,
- "rgblight": true,
- "audio": false,
- "key_lock": false
+ "rgblight": true
},
"rgblight": {
"led_count": 18,
diff --git a/keyboards/sawnsprojects/eclipse/tinyneko/info.json b/keyboards/sawnsprojects/eclipse/tinyneko/info.json
index 387532d58b..80ae2558f2 100644
--- a/keyboards/sawnsprojects/eclipse/tinyneko/info.json
+++ b/keyboards/sawnsprojects/eclipse/tinyneko/info.json
@@ -22,10 +22,7 @@
"console": false,
"command": false,
"nkro": false,
- "backlight": false,
- "rgblight": true,
- "audio": false,
- "key_lock": false
+ "rgblight": true
},
"rgblight": {
"led_count": 18,
diff --git a/keyboards/sharkoon/skiller_sgk50_s3/info.json b/keyboards/sharkoon/skiller_sgk50_s3/info.json
index 0b228b034b..6535ec63b7 100644
--- a/keyboards/sharkoon/skiller_sgk50_s3/info.json
+++ b/keyboards/sharkoon/skiller_sgk50_s3/info.json
@@ -18,8 +18,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"matrix_pins": {
"cols": ["C0", "C1", "C2", "C3", "A6", "B1", "B10", "B11", "B12", "B13", "B14", "B15", "C6", "C7", "C8", "C9"],
diff --git a/keyboards/skyloong/dt40/config.h b/keyboards/skyloong/dt40/config.h
index b0aa978063..7e101addcb 100644
--- a/keyboards/skyloong/dt40/config.h
+++ b/keyboards/skyloong/dt40/config.h
@@ -24,5 +24,5 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/smithrune/iron165r2/f411/config.h b/keyboards/smithrune/iron165r2/f411/config.h
index 8ed73d3ff4..bcd506ade3 100644
--- a/keyboards/smithrune/iron165r2/f411/config.h
+++ b/keyboards/smithrune/iron165r2/f411/config.h
@@ -24,5 +24,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/smithrune/magnus/m75h/config.h b/keyboards/smithrune/magnus/m75h/config.h
index e72ba06969..18fd960d8f 100644
--- a/keyboards/smithrune/magnus/m75h/config.h
+++ b/keyboards/smithrune/magnus/m75h/config.h
@@ -25,5 +25,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/smithrune/magnus/m75h/info.json b/keyboards/smithrune/magnus/m75h/info.json
index a4f2ce5768..325db7d1da 100644
--- a/keyboards/smithrune/magnus/m75h/info.json
+++ b/keyboards/smithrune/magnus/m75h/info.json
@@ -17,12 +17,9 @@
}
},
"features": {
- "audio": false,
- "backlight": false,
"bootmagic": true,
"command": false,
"console": false,
- "encoder": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
diff --git a/keyboards/smithrune/magnus/m75s/config.h b/keyboards/smithrune/magnus/m75s/config.h
index 1e8874caa4..95fb2a420c 100644
--- a/keyboards/smithrune/magnus/m75s/config.h
+++ b/keyboards/smithrune/magnus/m75s/config.h
@@ -27,5 +27,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/smithrune/magnus/m75s/info.json b/keyboards/smithrune/magnus/m75s/info.json
index 5b834631f7..352b529bb0 100644
--- a/keyboards/smithrune/magnus/m75s/info.json
+++ b/keyboards/smithrune/magnus/m75s/info.json
@@ -17,12 +17,10 @@
}
},
"features": {
- "audio": false,
"backlight": true,
"bootmagic": true,
"command": false,
"console": false,
- "encoder": false,
"extrakey": true,
"mousekey": true,
"nkro": true,
@@ -36,7 +34,7 @@
},
"indicators": {
"caps_lock": "A10"
- }
+ },
"ws2812": {
"pin": "B15"
},
diff --git a/keyboards/spaceholdings/nebula68/config.h b/keyboards/spaceholdings/nebula68/config.h
index 1b2441556b..85d3261dd1 100755
--- a/keyboards/spaceholdings/nebula68/config.h
+++ b/keyboards/spaceholdings/nebula68/config.h
@@ -20,8 +20,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2
#define WS2812_PWM_CHANNEL 2 // default: 2
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
/* Backlight options */
diff --git a/keyboards/splitkb/kyria/rev1/config.h b/keyboards/splitkb/kyria/rev1/config.h
index d666099135..4f130293e2 100644
--- a/keyboards/splitkb/kyria/rev1/config.h
+++ b/keyboards/splitkb/kyria/rev1/config.h
@@ -33,9 +33,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define WS2812_PWM_DRIVER PWMD2 // default: PWMD2
# define WS2812_PWM_CHANNEL 4 // default: 2
# define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-# define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-# define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-# define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
#else
# define WS2812_DI_PIN D3
# define SOFT_SERIAL_PIN D2
diff --git a/keyboards/splitkb/kyria/rev2/config.h b/keyboards/splitkb/kyria/rev2/config.h
index 452e011f0a..54d8f0985a 100644
--- a/keyboards/splitkb/kyria/rev2/config.h
+++ b/keyboards/splitkb/kyria/rev2/config.h
@@ -38,9 +38,9 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
# define WS2812_PWM_DRIVER PWMD2 // default: PWMD2
# define WS2812_PWM_CHANNEL 4 // default: 2
# define WS2812_PWM_PAL_MODE 1 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-# define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-# define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-# define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_CHANNEL 2 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM2_UP // DMAMUX configuration for TIMx_UP -- only required if your MCU has a DMAMUX peripheral, see the respective reference manual for the appropriate values for your MCU.
#else
# define WS2812_DI_PIN D3
# define SOFT_SERIAL_PIN D2
diff --git a/keyboards/splitography/info.json b/keyboards/splitography/info.json
index 45ee7beed8..3805f1ca2b 100644
--- a/keyboards/splitography/info.json
+++ b/keyboards/splitography/info.json
@@ -11,9 +11,7 @@
"mousekey": false,
"extrakey": true,
"console": false,
- "audio": false,
- "command": false,
- "backlight": false
+ "command": false
},
"matrix_pins": {
"rows": ["D0", "D1", "D2", "D3"],
diff --git a/keyboards/stront/info.json b/keyboards/stront/info.json
index 88ccb2c6d0..d2726c85f0 100644
--- a/keyboards/stront/info.json
+++ b/keyboards/stront/info.json
@@ -85,7 +85,6 @@
"encoder": true,
"backlight": true,
"extrakey": true,
- "rgblight": false,
"rgb_matrix": true,
"nkro": false
},
diff --git a/keyboards/synthlabs/060/info.json b/keyboards/synthlabs/060/info.json
index 0c5870b46a..2fe90c96fd 100644
--- a/keyboards/synthlabs/060/info.json
+++ b/keyboards/synthlabs/060/info.json
@@ -13,7 +13,6 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgblight": false,
"rgb_matrix": true
},
"ws2812": {
diff --git a/keyboards/tg67/config.h b/keyboards/tg67/config.h
index 7ede76f551..0d54e925ae 100644
--- a/keyboards/tg67/config.h
+++ b/keyboards/tg67/config.h
@@ -19,5 +19,5 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_COMPLEMENTARY_OUTPUT
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
diff --git a/keyboards/tkw/grandiceps/config.h b/keyboards/tkw/grandiceps/config.h
index a963fbfb51..a02e14f91f 100644
--- a/keyboards/tkw/grandiceps/config.h
+++ b/keyboards/tkw/grandiceps/config.h
@@ -20,5 +20,5 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 5
diff --git a/keyboards/tkw/stoutgat/v2/config.h b/keyboards/tkw/stoutgat/v2/config.h
index bf68edcfae..79f47b9bb3 100644
--- a/keyboards/tkw/stoutgat/v2/config.h
+++ b/keyboards/tkw/stoutgat/v2/config.h
@@ -18,8 +18,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
diff --git a/keyboards/tweetydabird/lotus58/elite_c/info.json b/keyboards/tweetydabird/lotus58/elite_c/info.json
index 606784570c..af1a9f913c 100644
--- a/keyboards/tweetydabird/lotus58/elite_c/info.json
+++ b/keyboards/tweetydabird/lotus58/elite_c/info.json
@@ -1,3 +1,32 @@
{
- "bootloader": "atmel-dfu"
+ "build": {
+ "lto": true
+ },
+ "development_board": "elite_c",
+ "pin_compatible": "elite_c",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "F5", "pin_b": "F4", "resolution": 2}
+ ]
+ },
+ "matrix_pins": {
+ "cols": ["B1", "B2", "B3", "B6", "F7", "F6"],
+ "rows": ["D4", "C6", "D7", "E6", "B4"]
+ },
+ "split": {
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "F4", "pin_b": "F5", "resolution": 2}
+ ]
+ }
+ },
+ "handedness": {
+ "pin": "B5"
+ },
+ "soft_serial_pin": "D2",
+ },
+ "ws2812": {
+ "pin": "D3"
+ },
}
diff --git a/keyboards/tweetydabird/lotus58/info.json b/keyboards/tweetydabird/lotus58/info.json
index 646843e765..f4660c3ad9 100644
--- a/keyboards/tweetydabird/lotus58/info.json
+++ b/keyboards/tweetydabird/lotus58/info.json
@@ -1,17 +1,9 @@
{
"manufacturer": "Tweetys Wild Thinking",
- "keyboard_name": "Lotus 58 Glow (QMK)",
+ "keyboard_name": "Lotus 58 Glow",
"maintainer": "TweetyDaBird",
"bootloader_instructions": "Short marked pads on PCB, or hold top-outer key when plugging in each hand.",
- "build": {
- "lto": true
- },
"diode_direction": "COL2ROW",
- "encoder": {
- "rotary": [
- {"pin_a": "F5", "pin_b": "F4", "resolution": 2}
- ]
- },
"features": {
"bootmagic": true,
"command": false,
@@ -25,12 +17,6 @@
"split": true,
"tri_layer": true
},
- "matrix_pins": {
- "cols": ["B1", "B2", "B3", "B6", "F7", "F6"],
- "rows": ["D4", "C6", "D7", "E6", "B4"]
- },
- "pin_compatible": "promicro",
- "processor": "atmega32u4",
"rgblight": {
"default": {
"val": 87
@@ -46,19 +32,7 @@
"matrix": [5, 0]
},
"enabled": true,
- "encoder": {
- "right": {
- "rotary": [
- {"pin_a": "F4", "pin_b": "F5", "resolution": 2}
- ]
- }
- },
- "handedness": {
- "pin": "B5"
- },
- "soft_serial_pin": "D2",
"transport": {
- "protocol": "serial",
"sync": {
"indicators": true,
"layer_state": true,
@@ -78,9 +52,6 @@
"pid": "0x23B0",
"vid": "0xFEED"
},
- "ws2812": {
- "pin": "D3"
- },
"layouts": {
"LAYOUT": {
"layout": [
diff --git a/keyboards/tweetydabird/lotus58/nanoboot/info.json b/keyboards/tweetydabird/lotus58/nanoboot/info.json
new file mode 100644
index 0000000000..e7586e6f2f
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/nanoboot/info.json
@@ -0,0 +1,32 @@
+{
+ "build": {
+ "lto": true
+ },
+ "pin_compatible": "promicro",
+ "processor": "atmega32u4",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "F5", "pin_b": "F4", "resolution": 2}
+ ]
+ },
+ "matrix_pins": {
+ "cols": ["B1", "B2", "B3", "B6", "F7", "F6"],
+ "rows": ["D4", "C6", "D7", "E6", "B4"]
+ },
+ "split": {
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "F4", "pin_b": "F5", "resolution": 2}
+ ]
+ }
+ },
+ "handedness": {
+ "pin": "B5"
+ },
+ "soft_serial_pin": "D2",
+ },
+ "ws2812": {
+ "pin": "D3"
+ },
+}
diff --git a/keyboards/tweetydabird/lotus58/promicro/info.json b/keyboards/tweetydabird/lotus58/promicro/info.json
index 56062f7ad3..62ee0355ef 100644
--- a/keyboards/tweetydabird/lotus58/promicro/info.json
+++ b/keyboards/tweetydabird/lotus58/promicro/info.json
@@ -1,3 +1,31 @@
{
- "bootloader": "caterina"
+ "build": {
+ "lto": true
+ },
+ "development_board": "promicro",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "F5", "pin_b": "F4", "resolution": 2}
+ ]
+ },
+ "matrix_pins": {
+ "cols": ["B1", "B2", "B3", "B6", "F7", "F6"],
+ "rows": ["D4", "C6", "D7", "E6", "B4"]
+ },
+ "split": {
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "F4", "pin_b": "F5", "resolution": 2}
+ ]
+ }
+ },
+ "handedness": {
+ "pin": "B5"
+ },
+ "soft_serial_pin": "D2",
+ },
+ "ws2812": {
+ "pin": "D3"
+ },
}
diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/config.h b/keyboards/tweetydabird/lotus58/rp2040_ce/config.h
new file mode 100644
index 0000000000..e4a23b7d7f
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/rp2040_ce/config.h
@@ -0,0 +1,9 @@
+// Copyright 2024 Markus Knutsson (@TweetyDaBird)
+// SPDX-License-Identifier: GPL-2.0-or-later
+#pragma once
+
+#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral
+
+#define I2C_DRIVER I2CD1
+#define I2C1_SDA_PIN GP2
+#define I2C1_SCL_PIN GP3
diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h b/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h
new file mode 100644
index 0000000000..2e098f5113
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/rp2040_ce/halconf.h
@@ -0,0 +1,21 @@
+/* Copyright 2022 QMK
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#define HAL_USE_I2C TRUE
+
+#include_next <halconf.h>
diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/info.json b/keyboards/tweetydabird/lotus58/rp2040_ce/info.json
new file mode 100644
index 0000000000..c8bf711747
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/rp2040_ce/info.json
@@ -0,0 +1,29 @@
+{
+ "development_board": "promicro_rp2040",
+ "encoder": {
+ "rotary": [
+ {"pin_a": "GP28", "pin_b": "GP29", "resolution": 2}
+ ]
+ },
+ "matrix_pins": {
+ "cols": ["GP22", "GP23", "GP20", "GP21", "GP26", "GP27"],
+ "rows": ["GP4", "GP5", "GP6", "GP7", "GP8"]
+ },
+ "split": {
+ "encoder": {
+ "right": {
+ "rotary": [
+ {"pin_a": "GP29", "pin_b": "GP28", "resolution": 2}
+ ]
+ }
+ },
+ "soft_serial_pin": "GP1",
+ "handedness": {
+ "pin": "GP9"
+ }
+ },
+ "ws2812": {
+ "driver": "vendor",
+ "pin": "GP0"
+ }
+}
diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h b/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h
new file mode 100644
index 0000000000..2ae39bf675
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/rp2040_ce/mcuconf.h
@@ -0,0 +1,22 @@
+/* Copyright 2022 QMK
+ *
+ * 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/>.
+ */
+
+#pragma once
+
+#include_next <mcuconf.h>
+
+#undef RP_I2C_USE_I2C1
+#define RP_I2C_USE_I2C1 TRUE
diff --git a/keyboards/tweetydabird/lotus58/rp2040_ce/rules.mk b/keyboards/tweetydabird/lotus58/rp2040_ce/rules.mk
new file mode 100644
index 0000000000..161ec22b16
--- /dev/null
+++ b/keyboards/tweetydabird/lotus58/rp2040_ce/rules.mk
@@ -0,0 +1 @@
+SERIAL_DRIVER = vendor
diff --git a/keyboards/tzarc/djinn/config.h b/keyboards/tzarc/djinn/config.h
index 74bb00edc2..24357b6a35 100644
--- a/keyboards/tzarc/djinn/config.h
+++ b/keyboards/tzarc/djinn/config.h
@@ -39,9 +39,9 @@
#define WS2812_PWM_DRIVER PWMD20
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 3
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM1
-#define WS2812_DMA_CHANNEL 1
-#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM20_UP
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM1
+#define WS2812_PWM_DMA_CHANNEL 1
+#define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM20_UP
// Audio configuration
#define AUDIO_PIN A5
diff --git a/keyboards/tzarc/djinn/djinn_portscan_matrix.c b/keyboards/tzarc/djinn/djinn_portscan_matrix.c
index cb73c47def..ac81ad18c1 100644
--- a/keyboards/tzarc/djinn/djinn_portscan_matrix.c
+++ b/keyboards/tzarc/djinn/djinn_portscan_matrix.c
@@ -1,7 +1,8 @@
// Copyright 2018-2022 Nick Brassel (@tzarc)
// SPDX-License-Identifier: GPL-2.0-or-later
+#include <ch.h>
+#include <hal.h>
#include "quantum.h"
-#include <hal_pal.h>
#include "djinn.h"
#define GPIOB_BITMASK (1 << 13 | 1 << 14 | 1 << 15) // B13, B14, B15
@@ -34,6 +35,8 @@ void matrix_wait_for_port(stm32_gpio_t *port, uint32_t target_bitmask) {
}
}
+static void dummy_vt_callback(virtual_timer_t *vtp, void *p) {}
+
void matrix_init_custom(void) {
for (int i = 0; i < MATRIX_ROWS; ++i) {
setPinInputHigh(row_pins[i]);
@@ -41,6 +44,11 @@ void matrix_init_custom(void) {
for (int i = 0; i < MATRIX_COLS; ++i) {
setPinInputHigh(col_pins[i]);
}
+
+ // Start a virtual timer so we'll still get periodic wakeups, now that USB SOF doesn't wake up the main loop
+ static virtual_timer_t vt;
+ chVTObjectInit(&vt);
+ chVTSetContinuous(&vt, TIME_MS2I(10), dummy_vt_callback, NULL);
}
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
diff --git a/keyboards/tzarc/djinn/info.json b/keyboards/tzarc/djinn/info.json
index 64ed1da690..fddee1c21f 100644
--- a/keyboards/tzarc/djinn/info.json
+++ b/keyboards/tzarc/djinn/info.json
@@ -23,7 +23,6 @@
"nkro": true,
"quantum_painter": true,
"rgb_matrix": true,
- "unicode": false,
"usbpd": true,
"wpm": true
},
diff --git a/keyboards/tzarc/ghoul/rev1/stm32/config.h b/keyboards/tzarc/ghoul/rev1/stm32/config.h
index 1dbc164039..a835b341db 100644
--- a/keyboards/tzarc/ghoul/rev1/stm32/config.h
+++ b/keyboards/tzarc/ghoul/rev1/stm32/config.h
@@ -28,8 +28,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 5
#define RGB_ENABLE_PIN C0
// ADC Configuration
diff --git a/keyboards/viendi8l/config.h b/keyboards/viendi8l/config.h
index 050a0cca22..a449301c2b 100644
--- a/keyboards/viendi8l/config.h
+++ b/keyboards/viendi8l/config.h
@@ -37,5 +37,5 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA2_STREAM5
-#define WS2812_DMA_CHANNEL 6
+#define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 6
diff --git a/keyboards/vinhcatba/uncertainty/config.h b/keyboards/vinhcatba/uncertainty/config.h
index 5c02b78efe..82671dfdc0 100644
--- a/keyboards/vinhcatba/uncertainty/config.h
+++ b/keyboards/vinhcatba/uncertainty/config.h
@@ -11,8 +11,8 @@
#define WS2812_PWM_CHANNEL 4 // CH4
#define WS2812_PWM_PAL_MODE 2 // AF2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA1 Stream 2 for TIM3_UP (table 28 in reference manual)
-#define WS2812_DMA_CHANNEL 5 // DMA Channel 5 for TIM3_UP (table 28 in reference manual)
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA1 Stream 2 for TIM3_UP (table 28 in reference manual)
+#define WS2812_PWM_DMA_CHANNEL 5 // DMA Channel 5 for TIM3_UP (table 28 in reference manual)
#define I2C1_CLOCK_SPEED 400000
diff --git a/keyboards/wolf/m60_b/info.json b/keyboards/wolf/m60_b/info.json
index 6d39d0bbf8..474974d383 100644
--- a/keyboards/wolf/m60_b/info.json
+++ b/keyboards/wolf/m60_b/info.json
@@ -11,8 +11,7 @@
"extrakey": true,
"mousekey": true,
"nkro": true,
- "rgb_matrix": true,
- "rgblight": false
+ "rgb_matrix": true
},
"ws2812": {
"pin": "D1"
diff --git a/keyboards/xelus/ninjin/config.h b/keyboards/xelus/ninjin/config.h
index 9db59dcc66..7a8ac2f013 100644
--- a/keyboards/xelus/ninjin/config.h
+++ b/keyboards/xelus/ninjin/config.h
@@ -20,8 +20,8 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 3
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 3
#define WS2812_EXTERNAL_PULLUP
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
diff --git a/keyboards/xelus/valor/rev2/config.h b/keyboards/xelus/valor/rev2/config.h
index f601945a15..9491d1f175 100644
--- a/keyboards/xelus/valor/rev2/config.h
+++ b/keyboards/xelus/valor/rev2/config.h
@@ -40,9 +40,9 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM6
-#define WS2812_DMA_CHANNEL 7
-#define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM1_UP
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM6
+#define WS2812_PWM_DMA_CHANNEL 7
+#define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM1_UP
// RGB Pullup
#define WS2812_EXTERNAL_PULLUP
diff --git a/keyboards/yandrstudio/buff67v3/config.h b/keyboards/yandrstudio/buff67v3/config.h
index 9d3f3e44c0..7ff7636087 100644
--- a/keyboards/yandrstudio/buff67v3/config.h
+++ b/keyboards/yandrstudio/buff67v3/config.h
@@ -23,8 +23,8 @@
# define WS2812_PWM_DRIVER PWMD3 // default: PWMD2
# define WS2812_PWM_CHANNEL 1 // default: 2
-# define WS2812_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-# define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+# define WS2812_PWM_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
#endif
diff --git a/keyboards/yandrstudio/eau_r2/config.h b/keyboards/yandrstudio/eau_r2/config.h
index aa9b295e02..3a741b3dff 100644
--- a/keyboards/yandrstudio/eau_r2/config.h
+++ b/keyboards/yandrstudio/eau_r2/config.h
@@ -17,5 +17,5 @@
#define WS2812_PWM_DRIVER PWMD1
#define WS2812_PWM_CHANNEL 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM5
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM5
+#define WS2812_PWM_DMA_CHANNEL 5
diff --git a/keyboards/yandrstudio/nightstar75/config.h b/keyboards/yandrstudio/nightstar75/config.h
index 4d5c662999..f29bd573b8 100644
--- a/keyboards/yandrstudio/nightstar75/config.h
+++ b/keyboards/yandrstudio/nightstar75/config.h
@@ -20,5 +20,5 @@
#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2
#define WS2812_PWM_CHANNEL 2 // default: 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/yandrstudio/nz64/config.h b/keyboards/yandrstudio/nz64/config.h
index 81b549b60d..6dd155f74e 100644
--- a/keyboards/yandrstudio/nz64/config.h
+++ b/keyboards/yandrstudio/nz64/config.h
@@ -18,5 +18,5 @@
#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2
#define WS2812_PWM_CHANNEL 2 // default: 2
#define WS2812_PWM_PAL_MODE 2 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 5 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
diff --git a/keyboards/yandrstudio/nz67v2/config.h b/keyboards/yandrstudio/nz67v2/config.h
index 7ecdfeafcf..a7ae3e713c 100644
--- a/keyboards/yandrstudio/nz67v2/config.h
+++ b/keyboards/yandrstudio/nz67v2/config.h
@@ -18,5 +18,5 @@
#define WS2812_PWM_DRIVER PWMD3 // default: PWMD2
#define WS2812_PWM_CHANNEL 2 // default: 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
-#define WS2812_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3 // DMA Stream for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
+#define WS2812_PWM_DMA_CHANNEL 3 // DMA Channel for TIMx_UP, see the respective reference manual for the appropriate values for your MCU.
diff --git a/keyboards/yandrstudio/tg67/config.h b/keyboards/yandrstudio/tg67/config.h
index 686696be7d..99deee32ac 100644
--- a/keyboards/yandrstudio/tg67/config.h
+++ b/keyboards/yandrstudio/tg67/config.h
@@ -18,5 +18,5 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/yandrstudio/yr6095/config.h b/keyboards/yandrstudio/yr6095/config.h
index 05a8922788..9837216626 100644
--- a/keyboards/yandrstudio/yr6095/config.h
+++ b/keyboards/yandrstudio/yr6095/config.h
@@ -19,5 +19,5 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/yandrstudio/yr80/config.h b/keyboards/yandrstudio/yr80/config.h
index 08e10e243e..71d8e72587 100644
--- a/keyboards/yandrstudio/yr80/config.h
+++ b/keyboards/yandrstudio/yr80/config.h
@@ -21,5 +21,5 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 2
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
diff --git a/keyboards/yanghu/unicorne/config.h b/keyboards/yanghu/unicorne/config.h
index 99d38fe44a..8e625c6336 100644
--- a/keyboards/yanghu/unicorne/config.h
+++ b/keyboards/yanghu/unicorne/config.h
@@ -31,6 +31,6 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 5
#define WS2812_EXTERNAL_PULLUP
diff --git a/keyboards/ymdk/id75/config.h b/keyboards/ymdk/id75/config.h
index 14ed1d644c..cb5ac78304 100644
--- a/keyboards/ymdk/id75/config.h
+++ b/keyboards/ymdk/id75/config.h
@@ -19,5 +19,5 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 7
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 7
diff --git a/keyboards/ymdk/melody96/hotswap/info.json b/keyboards/ymdk/melody96/hotswap/info.json
index 61112d88ab..6a00e05050 100644
--- a/keyboards/ymdk/melody96/hotswap/info.json
+++ b/keyboards/ymdk/melody96/hotswap/info.json
@@ -14,7 +14,6 @@
},
"diode_direction": "ROW2COL",
"features": {
- "audio": false,
"backlight": true,
"bootmagic": true,
"command": false,
diff --git a/keyboards/ymdk/ymd75/rev4/iso/config.h b/keyboards/ymdk/ymd75/rev4/iso/config.h
index 58c4b34d61..3a0dddaad8 100644
--- a/keyboards/ymdk/ymd75/rev4/iso/config.h
+++ b/keyboards/ymdk/ymd75/rev4/iso/config.h
@@ -5,5 +5,5 @@
#define WS2812_PWM_DRIVER PWMD4
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM7
-#define WS2812_DMA_CHANNEL 7
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM7
+#define WS2812_PWM_DMA_CHANNEL 7
diff --git a/keyboards/yoichiro/lunakey_pico/info.json b/keyboards/yoichiro/lunakey_pico/info.json
index bf4b2a2510..d80aaf0612 100644
--- a/keyboards/yoichiro/lunakey_pico/info.json
+++ b/keyboards/yoichiro/lunakey_pico/info.json
@@ -11,8 +11,7 @@
"console": false,
"command": false,
"nkro": false,
- "rgblight": true,
- "audio": false
+ "rgblight": true
},
"matrix_pins": {
"cols": ["GP21", "GP20", "GP19", "GP18", "GP17", "GP16"],
diff --git a/keyboards/zvecr/split_blackpill/config.h b/keyboards/zvecr/split_blackpill/config.h
index 4173935642..dd26e9ca32 100644
--- a/keyboards/zvecr/split_blackpill/config.h
+++ b/keyboards/zvecr/split_blackpill/config.h
@@ -20,8 +20,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 1
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM3
-#define WS2812_DMA_CHANNEL 3
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM3
+#define WS2812_PWM_DMA_CHANNEL 3
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
diff --git a/keyboards/zvecr/zv48/config.h b/keyboards/zvecr/zv48/config.h
index e503f07b80..a67a46a185 100644
--- a/keyboards/zvecr/zv48/config.h
+++ b/keyboards/zvecr/zv48/config.h
@@ -22,8 +22,8 @@
#define WS2812_PWM_DRIVER PWMD3
#define WS2812_PWM_CHANNEL 4
#define WS2812_PWM_PAL_MODE 2
-#define WS2812_DMA_STREAM STM32_DMA1_STREAM2
-#define WS2812_DMA_CHANNEL 5
+#define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2
+#define WS2812_PWM_DMA_CHANNEL 5
/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */
#define LOCKING_SUPPORT_ENABLE
diff --git a/keyboards/zvecr/zv48/f401/info.json b/keyboards/zvecr/zv48/f401/keyboard.json
index acd7e83f77..acd7e83f77 100644
--- a/keyboards/zvecr/zv48/f401/info.json
+++ b/keyboards/zvecr/zv48/f401/keyboard.json
diff --git a/keyboards/zvecr/zv48/f401/rules.mk b/keyboards/zvecr/zv48/f401/rules.mk
deleted file mode 100644
index 4df55cd220..0000000000
--- a/keyboards/zvecr/zv48/f401/rules.mk
+++ /dev/null
@@ -1,3 +0,0 @@
-# Disable unsupported hardware
-AUDIO_SUPPORTED = no
-BACKLIGHT_SUPPORTED = no
diff --git a/lib/python/qmk/cli/__init__.py b/lib/python/qmk/cli/__init__.py
index e4a8166349..6d05a5fc21 100644
--- a/lib/python/qmk/cli/__init__.py
+++ b/lib/python/qmk/cli/__init__.py
@@ -81,6 +81,7 @@ subcommands = [
'qmk.cli.new.keymap',
'qmk.cli.painter',
'qmk.cli.pytest',
+ 'qmk.cli.test.c',
'qmk.cli.userspace.add',
'qmk.cli.userspace.compile',
'qmk.cli.userspace.doctor',
diff --git a/lib/python/qmk/cli/generate/make_dependencies.py b/lib/python/qmk/cli/generate/make_dependencies.py
index 9b695e907d..331132a20f 100755
--- a/lib/python/qmk/cli/generate/make_dependencies.py
+++ b/lib/python/qmk/cli/generate/make_dependencies.py
@@ -18,10 +18,11 @@ from qmk.path import normpath, FileType
@cli.argument('-km', '--keymap', completer=keymap_completer, help='The keymap to build a firmware for. Ignored when a configurator export is supplied.')
@cli.subcommand('Generates the list of dependencies associated with a keyboard build and its generated files.', hidden=True)
def generate_make_dependencies(cli):
- """Generates the list of dependent info.json, rules.mk, and config.h files for a keyboard.
+ """Generates the list of dependent config files for a keyboard.
"""
interesting_files = [
'info.json',
+ 'keyboard.json',
'rules.mk',
'post_rules.mk',
'config.h',
diff --git a/lib/python/qmk/cli/new/keyboard.py b/lib/python/qmk/cli/new/keyboard.py
index cb50acf8bb..700afc96a6 100644
--- a/lib/python/qmk/cli/new/keyboard.py
+++ b/lib/python/qmk/cli/new/keyboard.py
@@ -251,7 +251,7 @@ def new_keyboard(cli):
# merge in infos
community_info = Path(COMMUNITY / f'{default_layout}/info.json')
- augment_community_info(community_info, keyboard(kb_name) / community_info.name)
+ augment_community_info(community_info, keyboard(kb_name) / 'keyboard.json')
cli.log.info(f'{{fg_green}}Created a new keyboard called {{fg_cyan}}{kb_name}{{fg_green}}.{{fg_reset}}')
cli.log.info(f"Build Command: {{fg_yellow}}qmk compile -kb {kb_name} -km default{{fg_reset}}.")
diff --git a/lib/python/qmk/cli/painter/convert_graphics.py b/lib/python/qmk/cli/painter/convert_graphics.py
index 2519c49b25..553c26aa5d 100644
--- a/lib/python/qmk/cli/painter/convert_graphics.py
+++ b/lib/python/qmk/cli/painter/convert_graphics.py
@@ -1,10 +1,8 @@
"""This script tests QGF functionality.
"""
-import re
-import datetime
from io import BytesIO
from qmk.path import normpath
-from qmk.painter import render_header, render_source, render_license, render_bytes, valid_formats
+from qmk.painter import generate_subs, render_header, render_source, valid_formats
from milc import cli
from PIL import Image
@@ -12,7 +10,7 @@ from PIL import Image
@cli.argument('-v', '--verbose', arg_only=True, action='store_true', help='Turns on verbose output.')
@cli.argument('-i', '--input', required=True, help='Specify input graphic file.')
@cli.argument('-o', '--output', default='', help='Specify output directory. Defaults to same directory as input.')
[email protected]('-f', '--format', required=True, help='Output format, valid types: %s' % (', '.join(valid_formats.keys())))
[email protected]('-f', '--format', required=True, help=f'Output format, valid types: {", ".join(valid_formats.keys())}')
@cli.argument('-r', '--no-rle', arg_only=True, action='store_true', help='Disables the use of RLE when encoding images.')
@cli.argument('-d', '--no-deltas', arg_only=True, action='store_true', help='Disables the use of delta frames when encoding animations.')
@cli.argument('-w', '--raw', arg_only=True, action='store_true', help='Writes out the QGF file as raw data instead of c/h combo.')
@@ -51,43 +49,31 @@ def painter_convert_graphics(cli):
# Convert the image to QGF using PIL
out_data = BytesIO()
- input_img.save(out_data, "QGF", use_deltas=(not cli.args.no_deltas), use_rle=(not cli.args.no_rle), qmk_format=format, verbose=cli.args.verbose)
+ metadata = []
+ input_img.save(out_data, "QGF", use_deltas=(not cli.args.no_deltas), use_rle=(not cli.args.no_rle), qmk_format=format, verbose=cli.args.verbose, metadata=metadata)
out_bytes = out_data.getvalue()
if cli.args.raw:
- raw_file = cli.args.output / (cli.args.input.stem + ".qgf")
+ raw_file = cli.args.output / f"{cli.args.input.stem}.qgf"
with open(raw_file, 'wb') as raw:
raw.write(out_bytes)
return
# Work out the text substitutions for rendering the output data
- subs = {
- 'generated_type': 'image',
- 'var_prefix': 'gfx',
- 'generator_command': f'qmk painter-convert-graphics -i {cli.args.input.name} -f {cli.args.format}',
- 'year': datetime.date.today().strftime("%Y"),
- 'input_file': cli.args.input.name,
- 'sane_name': re.sub(r"[^a-zA-Z0-9]", "_", cli.args.input.stem),
- 'byte_count': len(out_bytes),
- 'bytes_lines': render_bytes(out_bytes),
- 'format': cli.args.format,
- }
-
- # Render the license
- subs.update({'license': render_license(subs)})
+ args_str = " ".join((f"--{arg} {getattr(cli.args, arg.replace('-', '_'))}" for arg in ["input", "output", "format", "no-rle", "no-deltas"]))
+ command = f"qmk painter-convert-graphics {args_str}"
+ subs = generate_subs(cli, out_bytes, image_metadata=metadata, command=command)
# Render and write the header file
header_text = render_header(subs)
- header_file = cli.args.output / (cli.args.input.stem + ".qgf.h")
+ header_file = cli.args.output / f"{cli.args.input.stem}.qgf.h"
with open(header_file, 'w') as header:
print(f"Writing {header_file}...")
header.write(header_text)
- header.close()
# Render and write the source file
source_text = render_source(subs)
- source_file = cli.args.output / (cli.args.input.stem + ".qgf.c")
+ source_file = cli.args.output / f"{cli.args.input.stem}.qgf.c"
with open(source_file, 'w') as source:
print(f"Writing {source_file}...")
source.write(source_text)
- source.close()
diff --git a/lib/python/qmk/cli/painter/make_font.py b/lib/python/qmk/cli/painter/make_font.py
index c0189920d2..19db844931 100644
--- a/lib/python/qmk/cli/painter/make_font.py
+++ b/lib/python/qmk/cli/painter/make_font.py
@@ -1,12 +1,10 @@
"""This script automates the conversion of font files into a format QMK firmware understands.
"""
-import re
-import datetime
from io import BytesIO
from qmk.path import normpath
-from qmk.painter_qff import QFFFont
-from qmk.painter import render_header, render_source, render_license, render_bytes, valid_formats
+from qmk.painter_qff import _generate_font_glyphs_list, QFFFont
+from qmk.painter import generate_subs, render_header, render_source, valid_formats
from milc import cli
@@ -31,7 +29,7 @@ def painter_make_font_image(cli):
@cli.argument('-o', '--output', default='', help='Specify output directory. Defaults to same directory as input.')
@cli.argument('-n', '--no-ascii', arg_only=True, action='store_true', help='Disables output of the full ASCII character set (0x20..0x7E), exporting only the glyphs specified.')
@cli.argument('-u', '--unicode-glyphs', default='', help='Also generate the specified unicode glyphs.')
[email protected]('-f', '--format', required=True, help='Output format, valid types: %s' % (', '.join(valid_formats.keys())))
[email protected]('-f', '--format', required=True, help=f'Output format, valid types: {", ".join(valid_formats.keys())}')
@cli.argument('-r', '--no-rle', arg_only=True, action='store_true', help='Disable the use of RLE to minimise converted image size.')
@cli.argument('-w', '--raw', arg_only=True, action='store_true', help='Writes out the QFF file as raw data instead of c/h combo.')
@cli.subcommand('Converts an input font image to something QMK firmware understands')
@@ -53,43 +51,31 @@ def painter_convert_font_image(cli):
# Render out the data
out_data = BytesIO()
- font.save_to_qff(format, (False if cli.args.no_rle else True), out_data)
+ font.save_to_qff(format, not cli.args.no_rle, out_data)
out_bytes = out_data.getvalue()
if cli.args.raw:
- raw_file = cli.args.output / (cli.args.input.stem + ".qff")
+ raw_file = cli.args.output / f"{cli.args.input.stem}.qff"
with open(raw_file, 'wb') as raw:
raw.write(out_bytes)
return
# Work out the text substitutions for rendering the output data
- subs = {
- 'generated_type': 'font',
- 'var_prefix': 'font',
- 'generator_command': f'qmk painter-convert-font-image -i {cli.args.input.name} -f {cli.args.format}',
- 'year': datetime.date.today().strftime("%Y"),
- 'input_file': cli.args.input.name,
- 'sane_name': re.sub(r"[^a-zA-Z0-9]", "_", cli.args.input.stem),
- 'byte_count': len(out_bytes),
- 'bytes_lines': render_bytes(out_bytes),
- 'format': cli.args.format,
- }
-
- # Render the license
- subs.update({'license': render_license(subs)})
+ args_str = " ".join((f"--{arg} {getattr(cli.args, arg.replace('-', '_'))}" for arg in ["input", "output", "no-ascii", "unicode-glyphs", "format", "no-rle"]))
+ command = f"qmk painter-convert-font-image {args_str}"
+ metadata = {"glyphs": _generate_font_glyphs_list(not cli.args.no_ascii, cli.args.unicode_glyphs)}
+ subs = generate_subs(cli, out_bytes, font_metadata=metadata, command=command)
# Render and write the header file
header_text = render_header(subs)
- header_file = cli.args.output / (cli.args.input.stem + ".qff.h")
+ header_file = cli.args.output / f"{cli.args.input.stem}.qff.h"
with open(header_file, 'w') as header:
print(f"Writing {header_file}...")
header.write(header_text)
- header.close()
# Render and write the source file
source_text = render_source(subs)
- source_file = cli.args.output / (cli.args.input.stem + ".qff.c")
+ source_file = cli.args.output / f"{cli.args.input.stem}.qff.c"
with open(source_file, 'w') as source:
print(f"Writing {source_file}...")
source.write(source_text)
- source.close()
diff --git a/lib/python/qmk/cli/test/__init__.py b/lib/python/qmk/cli/test/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/lib/python/qmk/cli/test/__init__.py
diff --git a/lib/python/qmk/cli/test/c.py b/lib/python/qmk/cli/test/c.py
new file mode 100644
index 0000000000..7a4e20d5e6
--- /dev/null
+++ b/lib/python/qmk/cli/test/c.py
@@ -0,0 +1,47 @@
+import fnmatch
+import re
+from subprocess import DEVNULL
+
+from milc import cli
+
+from qmk.commands import find_make, get_make_parallel_args, build_environment
+
+
[email protected]('-j', '--parallel', type=int, default=1, help="Set the number of parallel make jobs; 0 means unlimited.")
[email protected]('-e', '--env', arg_only=True, action='append', default=[], help="Set a variable to be passed to make. May be passed multiple times.")
[email protected]('-c', '--clean', arg_only=True, action='store_true', help="Remove object files before compiling.")
[email protected]('-l', '--list', arg_only=True, action='store_true', help='List available tests.')
[email protected]('-t', '--test', arg_only=True, action='append', default=[], help="Test to run from the available list. Supports wildcard globs. May be passed multiple times.")
[email protected]("QMK C Unit Tests.", hidden=False if cli.config.user.developer else True)
+def test_c(cli):
+ """Run native unit tests.
+ """
+ list_tests = cli.run([find_make(), 'list-tests', 'SILENT=true'])
+ available_tests = sorted(list_tests.stdout.strip().split())
+
+ if cli.args.list:
+ return print("\n".join(available_tests))
+
+ # expand any wildcards
+ filtered_tests = set()
+ for test in cli.args.test:
+ regex = re.compile(fnmatch.translate(test))
+ filtered_tests |= set(filter(regex.match, available_tests))
+
+ for invalid in filtered_tests - set(available_tests):
+ cli.log.warning(f'Invalid test provided: {invalid}')
+
+ # convert test names to build targets
+ targets = list(map(lambda x: f'test:{x}', filtered_tests or ['all']))
+
+ if cli.args.clean:
+ targets.insert(0, 'clean')
+
+ # Add in the environment vars
+ for key, value in build_environment(cli.args.env).items():
+ targets.append(f'{key}={value}')
+
+ command = [find_make(), *get_make_parallel_args(cli.config.test_c.parallel), *targets]
+
+ cli.log.info('Compiling tests with {fg_cyan}%s', ' '.join(command))
+ return cli.run(command, capture_output=False, stdin=DEVNULL).returncode
diff --git a/lib/python/qmk/info.py b/lib/python/qmk/info.py
index 815b851474..00da4936e1 100644
--- a/lib/python/qmk/info.py
+++ b/lib/python/qmk/info.py
@@ -868,7 +868,17 @@ def unknown_processor_rules(info_data, rules):
def merge_info_jsons(keyboard, info_data):
"""Return a merged copy of all the info.json files for a keyboard.
"""
- for info_file in find_info_json(keyboard):
+ config_files = find_info_json(keyboard)
+
+ # keyboard.json can only exist at the deepest part of the tree
+ keyboard_json_count = 0
+ for index, info_file in enumerate(config_files):
+ if Path(info_file).name == 'keyboard.json':
+ keyboard_json_count += 1
+ if index != 0 or keyboard_json_count > 1:
+ _log_error(info_data, f'Invalid keyboard.json location detected: {info_file}.')
+
+ for info_file in config_files:
# Load and validate the JSON data
new_info_data = json_load(info_file)
@@ -926,7 +936,7 @@ def find_info_json(keyboard):
base_path = Path('keyboards')
keyboard_path = base_path / keyboard
keyboard_parent = keyboard_path.parent
- info_jsons = [keyboard_path / 'info.json']
+ info_jsons = [keyboard_path / 'info.json', keyboard_path / 'keyboard.json']
# Add DEFAULT_FOLDER before parents, if present
rules = rules_mk(keyboard)
@@ -938,6 +948,7 @@ def find_info_json(keyboard):
if keyboard_parent == base_path:
break
info_jsons.append(keyboard_parent / 'info.json')
+ info_jsons.append(keyboard_parent / 'keyboard.json')
keyboard_parent = keyboard_parent.parent
# Return a list of the info.json files that actually exist
diff --git a/lib/python/qmk/keyboard.py b/lib/python/qmk/keyboard.py
index b56505d649..0fcc2e868d 100644
--- a/lib/python/qmk/keyboard.py
+++ b/lib/python/qmk/keyboard.py
@@ -166,9 +166,9 @@ def keyboard_folder_or_all(keyboard):
def _find_name(path):
- """Determine the keyboard name by stripping off the base_path and rules.mk.
+ """Determine the keyboard name by stripping off the base_path and filename.
"""
- return path.replace(base_path, "").replace(os.path.sep + "rules.mk", "")
+ return path.replace(base_path, "").rsplit(os.path.sep, 1)[0]
def keyboard_completer(prefix, action, parser, parsed_args):
@@ -181,8 +181,10 @@ def list_keyboards(resolve_defaults=True):
"""Returns a list of all keyboards - optionally processing any DEFAULT_FOLDER.
"""
# We avoid pathlib here because this is performance critical code.
- kb_wildcard = os.path.join(base_path, "**", "rules.mk")
- paths = [path for path in glob(kb_wildcard, recursive=True) if os.path.sep + 'keymaps' + os.path.sep not in path]
+ paths = []
+ for marker in ['rules.mk', 'keyboard.json']:
+ kb_wildcard = os.path.join(base_path, "**", marker)
+ paths += [path for path in glob(kb_wildcard, recursive=True) if os.path.sep + 'keymaps' + os.path.sep not in path]
found = map(_find_name, paths)
if resolve_defaults:
diff --git a/lib/python/qmk/painter.py b/lib/python/qmk/painter.py
index 381a996443..512a486ce8 100644
--- a/lib/python/qmk/painter.py
+++ b/lib/python/qmk/painter.py
@@ -1,5 +1,6 @@
"""Functions that help us work with Quantum Painter's file formats.
"""
+import datetime
import math
import re
from string import Template
@@ -79,6 +80,105 @@ valid_formats = {
}
}
+
+def _render_text(values):
+ # FIXME: May need more chars with GIFs containing lots of frames (or longer durations)
+ return "|".join([f"{i:4d}" for i in values])
+
+
+def _render_numeration(metadata):
+ return _render_text(range(len(metadata)))
+
+
+def _render_values(metadata, key):
+ return _render_text([i[key] for i in metadata])
+
+
+def _render_image_metadata(metadata):
+ size = metadata.pop(0)
+
+ lines = [
+ "// Image's metadata",
+ "// ----------------",
+ f"// Width: {size['width']}",
+ f"// Height: {size['height']}",
+ ]
+
+ if len(metadata) == 1:
+ lines.append("// Single frame")
+
+ else:
+ lines.extend([
+ f"// Frame: {_render_numeration(metadata)}",
+ f"// Duration(ms): {_render_values(metadata, 'delay')}",
+ f"// Compression: {_render_values(metadata, 'compression')} >> See qp.h, painter_compression_t",
+ f"// Delta: {_render_values(metadata, 'delta')}",
+ ])
+
+ deltas = []
+ for i, v in enumerate(metadata):
+ # Not a delta frame, go to next one
+ if not v["delta"]:
+ continue
+
+ # Unpack rect's coords
+ l, t, r, b = v["delta_rect"]
+
+ delta_px = (r - l) * (b - t)
+ px = size["width"] * size["height"]
+
+ # FIXME: May need need more chars here too
+ deltas.append(f"// Frame {i:3d}: ({l:3d}, {t:3d}) - ({r:3d}, {b:3d}) >> {delta_px:4d}/{px:4d} pixels ({100*delta_px/px:.2f}%)")
+
+ if deltas:
+ lines.append("// Areas on delta frames")
+ lines.extend(deltas)
+
+ return "\n".join(lines)
+
+
+def generate_subs(cli, out_bytes, *, font_metadata=None, image_metadata=None, command):
+ if font_metadata is not None and image_metadata is not None:
+ raise ValueError("Cant generate subs for font and image at the same time")
+
+ subs = {
+ "year": datetime.date.today().strftime("%Y"),
+ "input_file": cli.args.input.name,
+ "sane_name": re.sub(r"[^a-zA-Z0-9]", "_", cli.args.input.stem),
+ "byte_count": len(out_bytes),
+ "bytes_lines": render_bytes(out_bytes),
+ "format": cli.args.format,
+ "generator_command": command,
+ }
+
+ if font_metadata is not None:
+ subs.update({
+ "generated_type": "font",
+ "var_prefix": "font",
+ # not using triple quotes to avoid extra indentation/weird formatted code
+ "metadata": "\n".join([
+ "// Font's metadata",
+ "// ---------------",
+ f"// Glyphs: {', '.join([i for i in font_metadata['glyphs']])}",
+ ]),
+ })
+
+ elif image_metadata is not None:
+ subs.update({
+ "generated_type": "image",
+ "var_prefix": "gfx",
+ "generator_command": command,
+ "metadata": _render_image_metadata(image_metadata),
+ })
+
+ else:
+ raise ValueError("Pass metadata for either an image or a font")
+
+ subs.update({"license": render_license(subs)})
+
+ return subs
+
+
license_template = """\
// Copyright ${year} QMK -- generated source code only, ${generated_type} retains original copyright
// SPDX-License-Identifier: GPL-2.0-or-later
@@ -110,6 +210,8 @@ def render_header(subs):
source_file_template = """\
${license}
+${metadata}
+
#include <qp.h>
const uint32_t ${var_prefix}_${sane_name}_length = ${byte_count};
diff --git a/lib/python/qmk/painter_qgf.py b/lib/python/qmk/painter_qgf.py
index cc4697f1c6..67ef0dd233 100644
--- a/lib/python/qmk/painter_qgf.py
+++ b/lib/python/qmk/painter_qgf.py
@@ -327,8 +327,9 @@ def _compress_image(frame, last_frame, *, use_rle, use_deltas, format_, **_kwarg
# Helper function to save each frame to the output file
-def _write_frame(idx, frame, last_frame, *, fp, frame_offsets, **kwargs):
- # Not an argument of the function as it would consume from **kwargs
+def _write_frame(idx, frame, last_frame, *, fp, frame_offsets, metadata, **kwargs):
+ # Not an argument of the function as it would then not be part of kwargs
+ # This would cause an issue with `_compress_image(**kwargs)` missing an argument
format_ = kwargs["format_"]
# (potentially) Apply RLE and/or delta, and work out output image's information
@@ -370,6 +371,21 @@ def _write_frame(idx, frame, last_frame, *, fp, frame_offsets, **kwargs):
vprint(f'{f"Frame {idx:3d} delta":26s} {fp.tell():5d}d / {fp.tell():04X}h')
delta_descriptor.write(fp)
+ # Store metadata, showed later in a comment in the generated file
+ frame_metadata = {
+ "compression": frame_descriptor.compression,
+ "delta": frame_descriptor.is_delta,
+ "delay": frame_descriptor.delay,
+ }
+ if frame_metadata["delta"]:
+ frame_metadata.update({"delta_rect": [
+ delta_descriptor.left,
+ delta_descriptor.top,
+ delta_descriptor.right,
+ delta_descriptor.bottom,
+ ]})
+ metadata.append(frame_metadata)
+
# Write out the data for this frame to the output
data_descriptor = QGFFrameDataDescriptorV1()
data_descriptor.data = image_data
@@ -383,6 +399,10 @@ def _save(im, fp, _filename):
# Work out from the parameters if we need to do anything special
encoderinfo = im.encoderinfo.copy()
+ # Store image file in metadata structure
+ metadata = encoderinfo.get("metadata", [])
+ metadata.append({"width": im.width, "height": im.height})
+
# Helper for prints, noop taking any args if not verbose
global vprint
verbose = encoderinfo.get("verbose", False)
@@ -417,7 +437,7 @@ def _save(im, fp, _filename):
frame_offsets.write(fp)
# Iterate over each if the input frames, writing it to the output in the process
- write_frame = functools.partial(_write_frame, format_=encoderinfo["qmk_format"], fp=fp, use_deltas=encoderinfo.get("use_deltas", True), use_rle=encoderinfo.get("use_rle", True), frame_offsets=frame_offsets)
+ write_frame = functools.partial(_write_frame, format_=encoderinfo["qmk_format"], fp=fp, use_deltas=encoderinfo.get("use_deltas", True), use_rle=encoderinfo.get("use_rle", True), frame_offsets=frame_offsets, metadata=metadata)
for_all_frames(write_frame)
# Go back and update the graphics descriptor now that we can determine the final file size
diff --git a/lib/python/qmk/path.py b/lib/python/qmk/path.py
index 74364ee04b..85a8f48c4f 100644
--- a/lib/python/qmk/path.py
+++ b/lib/python/qmk/path.py
@@ -15,8 +15,9 @@ def is_keyboard(keyboard_name):
if keyboard_name:
keyboard_path = QMK_FIRMWARE / 'keyboards' / keyboard_name
rules_mk = keyboard_path / 'rules.mk'
+ keyboard_json = keyboard_path / 'keyboard.json'
- return rules_mk.exists()
+ return rules_mk.exists() or keyboard_json.exists()
def under_qmk_firmware(path=Path(os.environ['ORIG_CWD'])):
diff --git a/platforms/avr/drivers/audio_pwm_hardware.c b/platforms/avr/drivers/audio_pwm_hardware.c
index d484fba00f..16264cf0a2 100644
--- a/platforms/avr/drivers/audio_pwm_hardware.c
+++ b/platforms/avr/drivers/audio_pwm_hardware.c
@@ -213,7 +213,7 @@ void channel_2_stop(void) {
}
#endif
-void audio_driver_initialize(void) {
+void audio_driver_initialize_impl(void) {
#ifdef AUDIO1_PIN_SET
channel_1_stop();
gpio_set_pin_output(AUDIO1_PIN);
@@ -254,7 +254,7 @@ void audio_driver_initialize(void) {
#endif
}
-void audio_driver_stop(void) {
+void audio_driver_stop_impl(void) {
#ifdef AUDIO1_PIN_SET
channel_1_stop();
#endif
@@ -264,7 +264,7 @@ void audio_driver_stop(void) {
#endif
}
-void audio_driver_start(void) {
+void audio_driver_start_impl(void) {
#ifdef AUDIO1_PIN_SET
channel_1_start();
if (playing_note) {
diff --git a/platforms/chibios/boards/BONSAI_C4/configs/config.h b/platforms/chibios/boards/BONSAI_C4/configs/config.h
index 193b028bde..e933cd6fd1 100644
--- a/platforms/chibios/boards/BONSAI_C4/configs/config.h
+++ b/platforms/chibios/boards/BONSAI_C4/configs/config.h
@@ -77,11 +77,11 @@
# ifndef WS2812_PWM_PAL_MODE
# define WS2812_PWM_PAL_MODE 1
# endif
-# ifndef WS2812_DMA_STREAM
-# define WS2812_DMA_STREAM STM32_DMA2_STREAM5
+# ifndef WS2812_PWM_DMA_STREAM
+# define WS2812_PWM_DMA_STREAM STM32_DMA2_STREAM5
# endif
-# ifndef WS2812_DMA_CHANNEL
-# define WS2812_DMA_CHANNEL 6
+# ifndef WS2812_PWM_DMA_CHANNEL
+# define WS2812_PWM_DMA_CHANNEL 6
# endif
#endif
diff --git a/platforms/chibios/drivers/audio_dac_additive.c b/platforms/chibios/drivers/audio_dac_additive.c
index d6fde42b68..8e29053301 100644
--- a/platforms/chibios/drivers/audio_dac_additive.c
+++ b/platforms/chibios/drivers/audio_dac_additive.c
@@ -303,7 +303,7 @@ static const DACConfig dac_conf = {.init = AUDIO_DAC_OFF_VALUE, .datamode = DAC_
*/
static const DACConversionGroup dac_conv_cfg = {.num_channels = 1U, .end_cb = dac_end, .error_cb = dac_error, .trigger = DAC_TRG(0b000)};
-void audio_driver_initialize(void) {
+void audio_driver_initialize_impl(void) {
if ((AUDIO_PIN == A4) || (AUDIO_PIN_ALT == A4)) {
palSetLineMode(A4, PAL_MODE_INPUT_ANALOG);
dacStart(&DACD1, &dac_conf);
@@ -350,11 +350,11 @@ void audio_driver_initialize(void) {
gptStart(&GPTD6, &gpt6cfg1);
}
-void audio_driver_stop(void) {
+void audio_driver_stop_impl(void) {
state = OUTPUT_SHOULD_STOP;
}
-void audio_driver_start(void) {
+void audio_driver_start_impl(void) {
gptStartContinuous(&GPTD6, 2U);
for (uint8_t i = 0; i < AUDIO_MAX_SIMULTANEOUS_TONES; i++) {
diff --git a/platforms/chibios/drivers/audio_dac_basic.c b/platforms/chibios/drivers/audio_dac_basic.c
index 9a3f3fea1f..99b938e610 100644
--- a/platforms/chibios/drivers/audio_dac_basic.c
+++ b/platforms/chibios/drivers/audio_dac_basic.c
@@ -190,7 +190,7 @@ static void gpt_audio_state_cb(GPTDriver *gptp) {
}
}
-void audio_driver_initialize(void) {
+void audio_driver_initialize_impl(void) {
if ((AUDIO_PIN == A4) || (AUDIO_PIN_ALT == A4)) {
palSetPadMode(GPIOA, 4, PAL_MODE_INPUT_ANALOG);
dacStart(&DACD1, &dac_conf_ch1);
@@ -223,7 +223,7 @@ void audio_driver_initialize(void) {
gptStart(&AUDIO_STATE_TIMER, &gptStateUpdateCfg);
}
-void audio_driver_stop(void) {
+void audio_driver_stop_impl(void) {
if ((AUDIO_PIN == A4) || (AUDIO_PIN_ALT == A4)) {
gptStopTimer(&GPTD6);
@@ -241,7 +241,7 @@ void audio_driver_stop(void) {
gptStopTimer(&AUDIO_STATE_TIMER);
}
-void audio_driver_start(void) {
+void audio_driver_start_impl(void) {
if ((AUDIO_PIN == A4) || (AUDIO_PIN_ALT == A4)) {
dacStartConversion(&DACD1, &dac_conv_grp_ch1, (dacsample_t *)dac_buffer_1, AUDIO_DAC_BUFFER_SIZE);
}
diff --git a/platforms/chibios/drivers/audio_pwm_hardware.c b/platforms/chibios/drivers/audio_pwm_hardware.c
index 21b5c6892c..1ba7ec13bc 100644
--- a/platforms/chibios/drivers/audio_pwm_hardware.c
+++ b/platforms/chibios/drivers/audio_pwm_hardware.c
@@ -87,7 +87,7 @@ static void audio_callback(virtual_timer_t *vtp, void *p) {
chSysUnlockFromISR();
}
-void audio_driver_initialize(void) {
+void audio_driver_initialize_impl(void) {
pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
// connect the AUDIO_PIN to the PWM hardware
@@ -100,7 +100,7 @@ void audio_driver_initialize(void) {
chVTObjectInit(&audio_vt);
}
-void audio_driver_start(void) {
+void audio_driver_start_impl(void) {
channel_1_stop();
channel_1_start();
@@ -115,7 +115,7 @@ void audio_driver_start(void) {
}
}
-void audio_driver_stop(void) {
+void audio_driver_stop_impl(void) {
channel_1_stop();
chVTReset(&audio_vt);
}
diff --git a/platforms/chibios/drivers/audio_pwm_software.c b/platforms/chibios/drivers/audio_pwm_software.c
index 663a9eca16..f48323900b 100644
--- a/platforms/chibios/drivers/audio_pwm_software.c
+++ b/platforms/chibios/drivers/audio_pwm_software.c
@@ -121,7 +121,7 @@ GPTConfig gptCFG = {
.callback = gpt_callback,
};
-void audio_driver_initialize(void) {
+void audio_driver_initialize_impl(void) {
pwmStart(&AUDIO_PWM_DRIVER, &pwmCFG);
palSetLineMode(AUDIO_PIN, PAL_MODE_OUTPUT_PUSHPULL);
@@ -138,7 +138,7 @@ void audio_driver_initialize(void) {
gptStart(&AUDIO_STATE_TIMER, &gptCFG);
}
-void audio_driver_start(void) {
+void audio_driver_start_impl(void) {
channel_1_stop();
channel_1_start();
@@ -147,7 +147,7 @@ void audio_driver_start(void) {
}
}
-void audio_driver_stop(void) {
+void audio_driver_stop_impl(void) {
channel_1_stop();
gptStopTimer(&AUDIO_STATE_TIMER);
}
diff --git a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c
index de317e269a..799d96b3c6 100644
--- a/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c
+++ b/platforms/chibios/drivers/vendor/RP/RP2040/ws2812_vendor.c
@@ -136,7 +136,7 @@ static const pio_program_t ws2812_program = {
};
static uint32_t WS2812_BUFFER[WS2812_LED_COUNT];
-static const rp_dma_channel_t* WS2812_DMA_CHANNEL;
+static const rp_dma_channel_t* dma_channel;
static uint32_t RP_DMA_MODE_WS2812;
static int STATE_MACHINE = -1;
@@ -236,9 +236,9 @@ bool ws2812_init(void) {
pio_sm_init(pio, STATE_MACHINE, offset, &config);
pio_sm_set_enabled(pio, STATE_MACHINE, true);
- WS2812_DMA_CHANNEL = dmaChannelAlloc(RP_DMA_CHANNEL_ID_ANY, RP_DMA_PRIORITY_WS2812, (rp_dmaisr_t)ws2812_dma_callback, NULL);
- dmaChannelEnableInterruptX(WS2812_DMA_CHANNEL);
- dmaChannelSetDestinationX(WS2812_DMA_CHANNEL, (uint32_t)&pio->txf[STATE_MACHINE]);
+ dma_channel = dmaChannelAlloc(RP_DMA_CHANNEL_ID_ANY, RP_DMA_PRIORITY_WS2812, (rp_dmaisr_t)ws2812_dma_callback, NULL);
+ dmaChannelEnableInterruptX(dma_channel);
+ dmaChannelSetDestinationX(dma_channel, (uint32_t)&pio->txf[STATE_MACHINE]);
// clang-format off
RP_DMA_MODE_WS2812 = DMA_CTRL_TRIG_INCR_READ |
@@ -256,7 +256,7 @@ static inline void sync_ws2812_transfer(void) {
// count of LEDs in milliseconds. This is safely much longer than it
// would take to push all the data out.
dprintln("ERROR: WS2812 DMA transfer has stalled, aborting!");
- dmaChannelDisableX(WS2812_DMA_CHANNEL);
+ dmaChannelDisableX(dma_channel);
pio_sm_clear_fifos(pio, STATE_MACHINE);
pio_sm_restart(pio, STATE_MACHINE);
chSemReset(&TRANSFER_COUNTER, 0);
@@ -284,8 +284,8 @@ void ws2812_setleds(rgb_led_t* ledarray, uint16_t leds) {
#endif
}
- dmaChannelSetSourceX(WS2812_DMA_CHANNEL, (uint32_t)WS2812_BUFFER);
- dmaChannelSetCounterX(WS2812_DMA_CHANNEL, leds);
- dmaChannelSetModeX(WS2812_DMA_CHANNEL, RP_DMA_MODE_WS2812);
- dmaChannelEnableX(WS2812_DMA_CHANNEL);
+ dmaChannelSetSourceX(dma_channel, (uint32_t)WS2812_BUFFER);
+ dmaChannelSetCounterX(dma_channel, leds);
+ dmaChannelSetModeX(dma_channel, RP_DMA_MODE_WS2812);
+ dmaChannelEnableX(dma_channel);
}
diff --git a/platforms/chibios/drivers/ws2812_pwm.c b/platforms/chibios/drivers/ws2812_pwm.c
index 6bba22767f..e0b3bfd5b5 100644
--- a/platforms/chibios/drivers/ws2812_pwm.c
+++ b/platforms/chibios/drivers/ws2812_pwm.c
@@ -2,6 +2,18 @@
#include "gpio.h"
#include "chibios_config.h"
+// ======== DEPRECATED DEFINES - DO NOT USE ========
+#ifdef WS2812_DMA_STREAM
+# define WS2812_PWM_DMA_STREAM WS2812_DMA_STREAM
+#endif
+#ifdef WS2812_DMA_CHANNEL
+# define WS2812_PWM_DMA_CHANNEL WS2812_DMA_CHANNEL
+#endif
+#ifdef WS2812_DMAMUX_ID
+# define WS2812_PWM_DMAMUX_ID WS2812_DMAMUX_ID
+#endif
+// ========
+
/* Adapted from https://github.com/joewa/WS2812-LED-Driver_ChibiOS/ */
#ifdef RGBW
@@ -19,14 +31,14 @@
#ifndef WS2812_PWM_PAL_MODE
# define WS2812_PWM_PAL_MODE 2 // DI Pin's alternate function value
#endif
-#ifndef WS2812_DMA_STREAM
-# define WS2812_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP
+#ifndef WS2812_PWM_DMA_STREAM
+# define WS2812_PWM_DMA_STREAM STM32_DMA1_STREAM2 // DMA Stream for TIMx_UP
#endif
-#ifndef WS2812_DMA_CHANNEL
-# define WS2812_DMA_CHANNEL 2 // DMA Channel for TIMx_UP
+#ifndef WS2812_PWM_DMA_CHANNEL
+# define WS2812_PWM_DMA_CHANNEL 2 // DMA Channel for TIMx_UP
#endif
-#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_DMAMUX_ID)
-# error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
+#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE) && !defined(WS2812_PWM_DMAMUX_ID)
+# error "please consult your MCU's datasheet and specify in your config.h: #define WS2812_PWM_DMAMUX_ID STM32_DMAMUX1_TIM?_UP"
#endif
/* Summarize https://www.st.com/resource/en/application_note/an4013-stm32-crossseries-timer-overview-stmicroelectronics.pdf to
@@ -270,20 +282,20 @@
// For all other STM32 DMA transfer will automatically zero pad. We only need to set the right peripheral width.
#if defined(STM32F2XX) || defined(STM32F4XX) || defined(STM32F7XX)
# if defined(WS2812_PWM_TIMER_32BIT)
-# define WS2812_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_WORD
-# define WS2812_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_WORD
+# define WS2812_PWM_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_WORD
+# define WS2812_PWM_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_WORD
typedef uint32_t ws2812_buffer_t;
# else
-# define WS2812_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_HWORD
-# define WS2812_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_HWORD
+# define WS2812_PWM_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_HWORD
+# define WS2812_PWM_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_HWORD
typedef uint16_t ws2812_buffer_t;
# endif
#else
-# define WS2812_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_BYTE
+# define WS2812_PWM_DMA_MEMORY_WIDTH STM32_DMA_CR_MSIZE_BYTE
# if defined(WS2812_PWM_TIMER_32BIT)
-# define WS2812_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_WORD
+# define WS2812_PWM_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_WORD
# else
-# define WS2812_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_HWORD
+# define WS2812_PWM_DMA_PERIPHERAL_WIDTH STM32_DMA_CR_PSIZE_HWORD
# endif
typedef uint8_t ws2812_buffer_t;
#endif
@@ -326,26 +338,26 @@ void ws2812_init(void) {
// Configure DMA
// dmaInit(); // Joe added this
#if defined(WB32F3G71xx) || defined(WB32FQ95xx)
- dmaStreamAlloc(WS2812_DMA_STREAM - WB32_DMA_STREAM(0), 10, NULL, NULL);
- dmaStreamSetSource(WS2812_DMA_STREAM, ws2812_frame_buffer);
- dmaStreamSetDestination(WS2812_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register
- dmaStreamSetMode(WS2812_DMA_STREAM, WB32_DMA_CHCFG_HWHIF(WS2812_DMA_CHANNEL) | WB32_DMA_CHCFG_DIR_M2P | WB32_DMA_CHCFG_PSIZE_WORD | WB32_DMA_CHCFG_MSIZE_WORD | WB32_DMA_CHCFG_MINC | WB32_DMA_CHCFG_CIRC | WB32_DMA_CHCFG_TCIE | WB32_DMA_CHCFG_PL(3));
+ dmaStreamAlloc(WS2812_PWM_DMA_STREAM - WB32_DMA_STREAM(0), 10, NULL, NULL);
+ dmaStreamSetSource(WS2812_PWM_DMA_STREAM, ws2812_frame_buffer);
+ dmaStreamSetDestination(WS2812_PWM_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register
+ dmaStreamSetMode(WS2812_PWM_DMA_STREAM, WB32_DMA_CHCFG_HWHIF(WS2812_PWM_DMA_CHANNEL) | WB32_DMA_CHCFG_DIR_M2P | WB32_DMA_CHCFG_PSIZE_WORD | WB32_DMA_CHCFG_MSIZE_WORD | WB32_DMA_CHCFG_MINC | WB32_DMA_CHCFG_CIRC | WB32_DMA_CHCFG_TCIE | WB32_DMA_CHCFG_PL(3));
#else
- dmaStreamAlloc(WS2812_DMA_STREAM - STM32_DMA_STREAM(0), 10, NULL, NULL);
- dmaStreamSetPeripheral(WS2812_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register
- dmaStreamSetMemory0(WS2812_DMA_STREAM, ws2812_frame_buffer);
- dmaStreamSetMode(WS2812_DMA_STREAM, STM32_DMA_CR_CHSEL(WS2812_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | WS2812_DMA_PERIPHERAL_WIDTH | WS2812_DMA_MEMORY_WIDTH | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3));
+ dmaStreamAlloc(WS2812_PWM_DMA_STREAM - STM32_DMA_STREAM(0), 10, NULL, NULL);
+ dmaStreamSetPeripheral(WS2812_PWM_DMA_STREAM, &(WS2812_PWM_DRIVER.tim->CCR[WS2812_PWM_CHANNEL - 1])); // Ziel ist der An-Zeit im Cap-Comp-Register
+ dmaStreamSetMemory0(WS2812_PWM_DMA_STREAM, ws2812_frame_buffer);
+ dmaStreamSetMode(WS2812_PWM_DMA_STREAM, STM32_DMA_CR_CHSEL(WS2812_PWM_DMA_CHANNEL) | STM32_DMA_CR_DIR_M2P | WS2812_PWM_DMA_PERIPHERAL_WIDTH | WS2812_PWM_DMA_MEMORY_WIDTH | STM32_DMA_CR_MINC | STM32_DMA_CR_CIRC | STM32_DMA_CR_PL(3));
#endif
- dmaStreamSetTransactionSize(WS2812_DMA_STREAM, WS2812_BIT_N);
+ dmaStreamSetTransactionSize(WS2812_PWM_DMA_STREAM, WS2812_BIT_N);
// M2P: Memory 2 Periph; PL: Priority Level
#if (STM32_DMA_SUPPORTS_DMAMUX == TRUE)
// If the MCU has a DMAMUX we need to assign the correct resource
- dmaSetRequestSource(WS2812_DMA_STREAM, WS2812_DMAMUX_ID);
+ dmaSetRequestSource(WS2812_PWM_DMA_STREAM, WS2812_PWM_DMAMUX_ID);
#endif
// Start DMA
- dmaStreamEnable(WS2812_DMA_STREAM);
+ dmaStreamEnable(WS2812_PWM_DMA_STREAM);
// Configure PWM
// NOTE: It's required that preload be enabled on the timer channel CCR register. This is currently enabled in the
diff --git a/platforms/test/drivers/audio_pwm_hardware.c b/platforms/test/drivers/audio_pwm_hardware.c
index 336e4f5844..3a0384117a 100644
--- a/platforms/test/drivers/audio_pwm_hardware.c
+++ b/platforms/test/drivers/audio_pwm_hardware.c
@@ -15,6 +15,6 @@
#include "audio.h"
-void audio_driver_initialize(void) {}
-void audio_driver_start() {}
-void audio_driver_stop() {}
+void audio_driver_initialize_impl(void) {}
+void audio_driver_start_impl() {}
+void audio_driver_stop_impl() {}
diff --git a/quantum/audio/audio.c b/quantum/audio/audio.c
index c1a1500493..b2611c5f09 100644
--- a/quantum/audio/audio.c
+++ b/quantum/audio/audio.c
@@ -20,6 +20,7 @@
#include "debug.h"
#include "wait.h"
#include "util.h"
+#include "gpio.h"
/* audio system:
*
@@ -121,6 +122,32 @@ static bool audio_initialized = false;
static bool audio_driver_stopped = true;
audio_config_t audio_config;
+#ifndef AUDIO_POWER_CONTROL_PIN_ON_STATE
+# define AUDIO_POWER_CONTROL_PIN_ON_STATE 1
+#endif
+
+void audio_driver_initialize(void) {
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_set_pin_output_push_pull(AUDIO_POWER_CONTROL_PIN);
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, !AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+ audio_driver_initialize_impl();
+}
+
+void audio_driver_stop(void) {
+ audio_driver_stop_impl();
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, !AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+}
+
+void audio_driver_start(void) {
+#ifdef AUDIO_POWER_CONTROL_PIN
+ gpio_write_pin(AUDIO_POWER_CONTROL_PIN, AUDIO_POWER_CONTROL_PIN_ON_STATE);
+#endif
+ audio_driver_start_impl();
+}
+
void eeconfig_update_audio_current(void) {
eeconfig_update_audio(audio_config.raw);
}
diff --git a/quantum/audio/audio.h b/quantum/audio/audio.h
index eb0bedc6f9..054331d6f3 100644
--- a/quantum/audio/audio.h
+++ b/quantum/audio/audio.h
@@ -215,9 +215,9 @@ void audio_startup(void);
// hardware interface
// implementation in the driver_avr/arm_* respective parts
-void audio_driver_initialize(void);
-void audio_driver_start(void);
-void audio_driver_stop(void);
+void audio_driver_initialize_impl(void);
+void audio_driver_start_impl(void);
+void audio_driver_stop_impl(void);
/**
* @brief get the number of currently active tones
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.c b/quantum/pointing_device/pointing_device_auto_mouse.c
index 1b11fffedb..d9f924e258 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.c
+++ b/quantum/pointing_device/pointing_device_auto_mouse.c
@@ -45,7 +45,7 @@ static inline bool layer_hold_check(void) {
}
/* check all layer activation criteria */
-static inline bool is_auto_mouse_active(void) {
+bool is_auto_mouse_active(void) {
return auto_mouse_context.status.is_activated || auto_mouse_context.status.mouse_key_tracker || layer_hold_check();
}
@@ -99,6 +99,15 @@ bool get_auto_mouse_toggle(void) {
}
/**
+ * @brief get key tracker value
+ *
+ * @return bool of current layer_toggled state
+ */
+int8_t get_auto_mouse_key_tracker(void) {
+ return auto_mouse_context.status.mouse_key_tracker;
+}
+
+/**
* @brief Reset auto mouse context
*
* Clear timers and status
@@ -164,6 +173,15 @@ void set_auto_mouse_debounce(uint8_t debounce) {
}
/**
+ * @brief Changes the timeout for the mouse auto layer to be disabled
+ *
+ * @param key_tracker
+ */
+void set_auto_mouse_key_tracker(int8_t key_tracker) {
+ auto_mouse_context.status.mouse_key_tracker = key_tracker;
+}
+
+/**
* @brief toggle mouse layer setting
*
* Change state of local layer_toggled bool meant to track when the mouse layer is toggled on by other means
diff --git a/quantum/pointing_device/pointing_device_auto_mouse.h b/quantum/pointing_device/pointing_device_auto_mouse.h
index 904f18b68e..a596c065a3 100644
--- a/quantum/pointing_device/pointing_device_auto_mouse.h
+++ b/quantum/pointing_device/pointing_device_auto_mouse.h
@@ -81,9 +81,11 @@ void set_auto_mouse_timeout(uint16_t timeout); // set l
uint16_t get_auto_mouse_timeout(void); // get layer timeout
void set_auto_mouse_debounce(uint8_t debounce); // set debounce
uint8_t get_auto_mouse_debounce(void); // get debounce
+void set_auto_mouse_key_tracker(int8_t key_tracker); // set key tracker
+int8_t get_auto_mouse_key_tracker(void); // get key tracker
void auto_mouse_layer_off(void); // disable target layer if appropriate (DO NOT USE in layer_state_set stack!!)
layer_state_t remove_auto_mouse_layer(layer_state_t state, bool force); // remove auto mouse target layer from state if appropriate (can be forced)
-
+bool is_auto_mouse_active(void); // check if target layer is active
/* ----------For custom pointing device activation----------------------------------------------------------- */
bool auto_mouse_activation(report_mouse_t mouse_report); // handles pointing device trigger conditions for target layer activation (overwritable)
diff --git a/readme.md b/readme.md
index f0e49a08e9..c277ca0aad 100644
--- a/readme.md
+++ b/readme.md
@@ -1,3 +1,7 @@
+# THIS IS THE DEVELOP BRANCH
+
+Warning- This is the `develop` branch of QMK Firmware. You may encounter broken code here. Please see [Breaking Changes](https://docs.qmk.fm/#/breaking_changes) for more information.
+
# Quantum Mechanical Keyboard Firmware
[![Current Version](https://img.shields.io/github/tag/qmk/qmk_firmware.svg)](https://github.com/qmk/qmk_firmware/tags)
diff --git a/tmk_core/protocol/chibios/chibios.c b/tmk_core/protocol/chibios/chibios.c
index 91bb252c7c..76a37ae538 100644
--- a/tmk_core/protocol/chibios/chibios.c
+++ b/tmk_core/protocol/chibios/chibios.c
@@ -192,15 +192,18 @@ void protocol_pre_task(void) {
/* Remote wakeup */
if ((USB_DRIVER.status & USB_GETSTATUS_REMOTE_WAKEUP_ENABLED) && suspend_wakeup_condition()) {
usbWakeupHost(&USB_DRIVER);
- restart_usb_driver(&USB_DRIVER);
+# if USB_SUSPEND_WAKEUP_DELAY > 0
+ // Some hubs, kvm switches, and monitors do
+ // weird things, with USB device state bouncing
+ // around wildly on wakeup, yielding race
+ // conditions that can corrupt the keyboard state.
+ //
+ // Pause for a while to let things settle...
+ wait_ms(USB_SUSPEND_WAKEUP_DELAY);
+# endif
}
}
/* Woken up */
- // variables has been already cleared by the wakeup hook
- send_keyboard_report();
-# ifdef MOUSEKEY_ENABLE
- mousekey_send();
-# endif /* MOUSEKEY_ENABLE */
}
#endif
}
@@ -218,4 +221,5 @@ void protocol_post_task(void) {
#ifdef RAW_ENABLE
raw_hid_task();
#endif
+ usb_idle_task();
}
diff --git a/tmk_core/protocol/chibios/chibios.mk b/tmk_core/protocol/chibios/chibios.mk
index 8eaf5b10d2..aee3f5f056 100644
--- a/tmk_core/protocol/chibios/chibios.mk
+++ b/tmk_core/protocol/chibios/chibios.mk
@@ -6,6 +6,8 @@ SRC += $(CHIBIOS_DIR)/usb_main.c
SRC += $(CHIBIOS_DIR)/chibios.c
SRC += usb_descriptor.c
SRC += $(CHIBIOS_DIR)/usb_driver.c
+SRC += $(CHIBIOS_DIR)/usb_endpoints.c
+SRC += $(CHIBIOS_DIR)/usb_report_handling.c
SRC += $(CHIBIOS_DIR)/usb_util.c
SRC += $(LIBSRC)
diff --git a/tmk_core/protocol/chibios/usb_driver.c b/tmk_core/protocol/chibios/usb_driver.c
index ad45f9b1da..7c3ce44687 100644
--- a/tmk_core/protocol/chibios/usb_driver.c
+++ b/tmk_core/protocol/chibios/usb_driver.c
@@ -1,127 +1,51 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file hal_serial_usb.c
- * @brief Serial over USB Driver code.
- *
- * @addtogroup SERIAL_USB
- * @{
- */
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// Copyright 2021 Purdea Andrei
+// Copyright 2021 Michael Stapelberg
+// Copyright 2020 Ryan (@fauxpark)
+// Copyright 2016 Fredizzimo
+// Copyright 2016 Giovanni Di Sirio
+// SPDX-License-Identifier: GPL-3.0-or-later OR Apache-2.0
#include <hal.h>
-#include "usb_driver.h"
#include <string.h>
-/*===========================================================================*/
-/* Driver local definitions. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver exported variables. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Driver local variables and types. */
-/*===========================================================================*/
-
-/*
- * Current Line Coding.
- */
-static cdc_linecoding_t linecoding = {{0x00, 0x96, 0x00, 0x00}, /* 38400. */
- LC_STOP_1,
- LC_PARITY_NONE,
- 8};
+#include "usb_driver.h"
+#include "util.h"
/*===========================================================================*/
/* Driver local functions. */
/*===========================================================================*/
-static bool qmkusb_start_receive(QMKUSBDriver *qmkusbp) {
- uint8_t *buf;
-
+static void usb_start_receive(usb_endpoint_out_t *endpoint) {
/* If the USB driver is not in the appropriate state then transactions
must not be started.*/
- if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) {
- return true;
+ if ((usbGetDriverStateI(endpoint->config.usbp) != USB_ACTIVE)) {
+ return;
}
/* Checking if there is already a transaction ongoing on the endpoint.*/
- if (usbGetReceiveStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_out)) {
- return true;
+ if (usbGetReceiveStatusI(endpoint->config.usbp, endpoint->config.ep)) {
+ return;
}
/* Checking if there is a buffer ready for incoming data.*/
- buf = ibqGetEmptyBufferI(&qmkusbp->ibqueue);
- if (buf == NULL) {
- return true;
+ uint8_t *buffer = ibqGetEmptyBufferI(&endpoint->ibqueue);
+ if (buffer == NULL) {
+ return;
}
/* Buffer found, starting a new transaction.*/
- usbStartReceiveI(qmkusbp->config->usbp, qmkusbp->config->bulk_out, buf, qmkusbp->ibqueue.bsize - sizeof(size_t));
-
- return false;
-}
-
-/*
- * Interface implementation.
- */
-
-static size_t _write(void *ip, const uint8_t *bp, size_t n) {
- return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, TIME_INFINITE);
-}
-
-static size_t _read(void *ip, uint8_t *bp, size_t n) {
- return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, TIME_INFINITE);
-}
-
-static msg_t _put(void *ip, uint8_t b) {
- return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, TIME_INFINITE);
-}
-
-static msg_t _get(void *ip) {
- return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, TIME_INFINITE);
-}
-
-static msg_t _putt(void *ip, uint8_t b, sysinterval_t timeout) {
- return obqPutTimeout(&((QMKUSBDriver *)ip)->obqueue, b, timeout);
-}
-
-static msg_t _gett(void *ip, sysinterval_t timeout) {
- return ibqGetTimeout(&((QMKUSBDriver *)ip)->ibqueue, timeout);
+ usbStartReceiveI(endpoint->config.usbp, endpoint->config.ep, buffer, endpoint->ibqueue.bsize - sizeof(size_t));
}
-static size_t _writet(void *ip, const uint8_t *bp, size_t n, sysinterval_t timeout) {
- return obqWriteTimeout(&((QMKUSBDriver *)ip)->obqueue, bp, n, timeout);
-}
-
-static size_t _readt(void *ip, uint8_t *bp, size_t n, sysinterval_t timeout) {
- return ibqReadTimeout(&((QMKUSBDriver *)ip)->ibqueue, bp, n, timeout);
-}
-
-static const struct QMKUSBDriverVMT vmt = {0, _write, _read, _put, _get, _putt, _gett, _writet, _readt};
-
/**
* @brief Notification of empty buffer released into the input buffers queue.
*
* @param[in] bqp the buffers queue pointer.
*/
static void ibnotify(io_buffers_queue_t *bqp) {
- QMKUSBDriver *qmkusbp = bqGetLinkX(bqp);
- (void)qmkusb_start_receive(qmkusbp);
+ usb_endpoint_out_t *endpoint = bqGetLinkX(bqp);
+ usb_start_receive(endpoint);
}
/**
@@ -130,22 +54,22 @@ static void ibnotify(io_buffers_queue_t *bqp) {
* @param[in] bqp the buffers queue pointer.
*/
static void obnotify(io_buffers_queue_t *bqp) {
- size_t n;
- QMKUSBDriver *qmkusbp = bqGetLinkX(bqp);
+ usb_endpoint_in_t *endpoint = bqGetLinkX(bqp);
- /* If the USB driver is not in the appropriate state then transactions
+ /* If the USB endpoint is not in the appropriate state then transactions
must not be started.*/
- if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) {
+ if ((usbGetDriverStateI(endpoint->config.usbp) != USB_ACTIVE)) {
return;
}
/* Checking if there is already a transaction ongoing on the endpoint.*/
- if (!usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) {
+ if (!usbGetTransmitStatusI(endpoint->config.usbp, endpoint->config.ep)) {
/* Trying to get a full buffer.*/
- uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n);
- if (buf != NULL) {
+ size_t n;
+ uint8_t *buffer = obqGetFullBufferI(&endpoint->obqueue, &n);
+ if (buffer != NULL) {
/* Buffer found, starting a new transaction.*/
- usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n);
+ usbStartTransmitI(endpoint->config.usbp, endpoint->config.ep, buffer, n);
}
}
}
@@ -154,264 +78,149 @@ static void obnotify(io_buffers_queue_t *bqp) {
/* Driver exported functions. */
/*===========================================================================*/
-/**
- * @brief Serial Driver initialization.
- * @note This function is implicitly invoked by @p halInit(), there is
- * no need to explicitly initialize the driver.
- *
- * @init
- */
-void qmkusbInit(void) {}
+void usb_endpoint_in_init(usb_endpoint_in_t *endpoint) {
+ usb_endpoint_config_t *config = &endpoint->config;
+ endpoint->ep_config.in_state = &endpoint->ep_in_state;
-/**
- * @brief Initializes a generic full duplex driver object.
- * @details The HW dependent part of the initialization has to be performed
- * outside, usually in the hardware initialization code.
- *
- * @param[out] qmkusbp pointer to a @p QMKUSBDriver structure
- *
- * @init
- */
-void qmkusbObjectInit(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) {
- qmkusbp->vmt = &vmt;
- osalEventObjectInit(&qmkusbp->event);
- qmkusbp->state = QMKUSB_STOP;
- // Note that the config uses the USB direction naming
- ibqObjectInit(&qmkusbp->ibqueue, true, config->ob, config->out_size, config->out_buffers, ibnotify, qmkusbp);
- obqObjectInit(&qmkusbp->obqueue, true, config->ib, config->in_size, config->in_buffers, obnotify, qmkusbp);
+#if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ if (endpoint->is_shared) {
+ endpoint->ep_config.out_state = &endpoint->ep_out_state;
+ }
+#endif
+ obqObjectInit(&endpoint->obqueue, true, config->buffer, config->buffer_size, config->buffer_capacity, obnotify, endpoint);
}
-/**
- * @brief Configures and starts the driver.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- * @param[in] config the serial over USB driver configuration
- *
- * @api
- */
-void qmkusbStart(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config) {
- USBDriver *usbp = config->usbp;
+void usb_endpoint_out_init(usb_endpoint_out_t *endpoint) {
+ usb_endpoint_config_t *config = &endpoint->config;
+ endpoint->ep_config.out_state = &endpoint->ep_out_state;
+ ibqObjectInit(&endpoint->ibqueue, true, config->buffer, config->buffer_size, config->buffer_capacity, ibnotify, endpoint);
+}
- osalDbgCheck(qmkusbp != NULL);
+void usb_endpoint_in_start(usb_endpoint_in_t *endpoint) {
+ osalDbgCheck(endpoint != NULL);
osalSysLock();
- osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), "invalid state");
- usbp->in_params[config->bulk_in - 1U] = qmkusbp;
- usbp->out_params[config->bulk_out - 1U] = qmkusbp;
- if (config->int_in > 0U) {
- usbp->in_params[config->int_in - 1U] = qmkusbp;
- }
- qmkusbp->config = config;
- qmkusbp->state = QMKUSB_READY;
+ osalDbgAssert((usbGetDriverStateI(endpoint->config.usbp) == USB_STOP) || (usbGetDriverStateI(endpoint->config.usbp) == USB_READY), "invalid state");
+ endpoint->config.usbp->in_params[endpoint->config.ep - 1U] = endpoint;
+ endpoint->timed_out = false;
osalSysUnlock();
}
-/**
- * @brief Stops the driver.
- * @details Any thread waiting on the driver's queues will be awakened with
- * the message @p MSG_RESET.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- *
- * @api
- */
-void qmkusbStop(QMKUSBDriver *qmkusbp) {
- USBDriver *usbp = qmkusbp->config->usbp;
-
- osalDbgCheck(qmkusbp != NULL);
+void usb_endpoint_out_start(usb_endpoint_out_t *endpoint) {
+ osalDbgCheck(endpoint != NULL);
osalSysLock();
+ osalDbgAssert((usbGetDriverStateI(endpoint->config.usbp) == USB_STOP) || (usbGetDriverStateI(endpoint->config.usbp) == USB_READY), "invalid state");
+ endpoint->config.usbp->out_params[endpoint->config.ep - 1U] = endpoint;
+ endpoint->timed_out = false;
+ osalSysUnlock();
+}
- osalDbgAssert((qmkusbp->state == QMKUSB_STOP) || (qmkusbp->state == QMKUSB_READY), "invalid state");
+void usb_endpoint_in_stop(usb_endpoint_in_t *endpoint) {
+ osalDbgCheck(endpoint != NULL);
- /* Driver in stopped state.*/
- usbp->in_params[qmkusbp->config->bulk_in - 1U] = NULL;
- usbp->out_params[qmkusbp->config->bulk_out - 1U] = NULL;
- if (qmkusbp->config->int_in > 0U) {
- usbp->in_params[qmkusbp->config->int_in - 1U] = NULL;
- }
- qmkusbp->config = NULL;
- qmkusbp->state = QMKUSB_STOP;
+ osalSysLock();
+ endpoint->config.usbp->in_params[endpoint->config.ep - 1U] = NULL;
- /* Enforces a disconnection.*/
- chnAddFlagsI(qmkusbp, CHN_DISCONNECTED);
- ibqResetI(&qmkusbp->ibqueue);
- obqResetI(&qmkusbp->obqueue);
+ bqSuspendI(&endpoint->obqueue);
+ obqResetI(&endpoint->obqueue);
+ if (endpoint->report_storage != NULL) {
+ endpoint->report_storage->reset_report(endpoint->report_storage->reports);
+ }
osalOsRescheduleS();
-
osalSysUnlock();
}
-/**
- * @brief USB device suspend handler.
- * @details Generates a @p CHN_DISCONNECT event and puts queues in
- * non-blocking mode, this way the application cannot get stuck
- * in the middle of an I/O operations.
- * @note If this function is not called from an ISR then an explicit call
- * to @p osalOsRescheduleS() in necessary afterward.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- *
- * @iclass
- */
-void qmkusbSuspendHookI(QMKUSBDriver *qmkusbp) {
- chnAddFlagsI(qmkusbp, CHN_DISCONNECTED);
- bqSuspendI(&qmkusbp->ibqueue);
- bqSuspendI(&qmkusbp->obqueue);
-}
+void usb_endpoint_out_stop(usb_endpoint_out_t *endpoint) {
+ osalDbgCheck(endpoint != NULL);
-/**
- * @brief USB device wakeup handler.
- * @details Generates a @p CHN_CONNECT event and resumes normal queues
- * operations.
- *
- * @note If this function is not called from an ISR then an explicit call
- * to @p osalOsRescheduleS() in necessary afterward.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- *
- * @iclass
- */
-void qmkusbWakeupHookI(QMKUSBDriver *qmkusbp) {
- chnAddFlagsI(qmkusbp, CHN_CONNECTED);
- bqResumeX(&qmkusbp->ibqueue);
- bqResumeX(&qmkusbp->obqueue);
-}
+ osalSysLock();
+ osalDbgAssert((usbGetDriverStateI(endpoint->config.usbp) == USB_STOP) || (usbGetDriverStateI(endpoint->config.usbp) == USB_READY), "invalid state");
-/**
- * @brief USB device configured handler.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- *
- * @iclass
- */
-void qmkusbConfigureHookI(QMKUSBDriver *qmkusbp) {
- ibqResetI(&qmkusbp->ibqueue);
- bqResumeX(&qmkusbp->ibqueue);
- obqResetI(&qmkusbp->obqueue);
- bqResumeX(&qmkusbp->obqueue);
- chnAddFlagsI(qmkusbp, CHN_CONNECTED);
- (void)qmkusb_start_receive(qmkusbp);
+ bqSuspendI(&endpoint->ibqueue);
+ ibqResetI(&endpoint->ibqueue);
+ osalOsRescheduleS();
+ osalSysUnlock();
}
-/**
- * @brief Default requests hook.
- * @details Applications wanting to use the Serial over USB driver can use
- * this function as requests hook in the USB configuration.
- * The following requests are emulated:
- * - CDC_GET_LINE_CODING.
- * - CDC_SET_LINE_CODING.
- * - CDC_SET_CONTROL_LINE_STATE.
- * .
- *
- * @param[in] usbp pointer to the @p USBDriver object
- * @return The hook status.
- * @retval true Message handled internally.
- * @retval false Message not handled.
- */
-bool qmkusbRequestsHook(USBDriver *usbp) {
- if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) {
- switch (usbp->setup[1]) {
- case CDC_GET_LINE_CODING:
- usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL);
- return true;
- case CDC_SET_LINE_CODING:
- usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL);
- return true;
- case CDC_SET_CONTROL_LINE_STATE:
- /* Nothing to do, there are no control lines.*/
- usbSetupTransfer(usbp, NULL, 0, NULL);
- return true;
- default:
- return false;
- }
- }
- return false;
-}
+void usb_endpoint_in_suspend_cb(usb_endpoint_in_t *endpoint) {
+ bqSuspendI(&endpoint->obqueue);
+ obqResetI(&endpoint->obqueue);
-/**
- * @brief SOF handler.
- * @details The SOF interrupt is used for automatic flushing of incomplete
- * buffers pending in the output queue.
- *
- * @param[in] qmkusbp pointer to a @p QMKUSBDriver object
- *
- * @iclass
- */
-void qmkusbSOFHookI(QMKUSBDriver *qmkusbp) {
- /* If the USB driver is not in the appropriate state then transactions
- must not be started.*/
- if ((usbGetDriverStateI(qmkusbp->config->usbp) != USB_ACTIVE) || (qmkusbp->state != QMKUSB_READY)) {
- return;
+ if (endpoint->report_storage != NULL) {
+ endpoint->report_storage->reset_report(endpoint->report_storage->reports);
}
+}
- /* If there is already a transaction ongoing then another one cannot be
- started.*/
- if (usbGetTransmitStatusI(qmkusbp->config->usbp, qmkusbp->config->bulk_in)) {
- return;
- }
+void usb_endpoint_out_suspend_cb(usb_endpoint_out_t *endpoint) {
+ bqSuspendI(&endpoint->ibqueue);
+ ibqResetI(&endpoint->ibqueue);
+}
- /* Checking if there only a buffer partially filled, if so then it is
- enforced in the queue and transmitted.*/
- if (obqTryFlushI(&qmkusbp->obqueue)) {
- size_t n;
- uint8_t *buf = obqGetFullBufferI(&qmkusbp->obqueue, &n);
+void usb_endpoint_in_wakeup_cb(usb_endpoint_in_t *endpoint) {
+ bqResumeX(&endpoint->obqueue);
+}
- /* For fixed size drivers, fill the end with zeros */
- if (qmkusbp->config->fixed_size) {
- memset(buf + n, 0, qmkusbp->config->in_size - n);
- n = qmkusbp->config->in_size;
- }
+void usb_endpoint_out_wakeup_cb(usb_endpoint_out_t *endpoint) {
+ bqResumeX(&endpoint->ibqueue);
+}
- osalDbgAssert(buf != NULL, "queue is empty");
+void usb_endpoint_in_configure_cb(usb_endpoint_in_t *endpoint) {
+ usbInitEndpointI(endpoint->config.usbp, endpoint->config.ep, &endpoint->ep_config);
+ obqResetI(&endpoint->obqueue);
+ bqResumeX(&endpoint->obqueue);
+}
- usbStartTransmitI(qmkusbp->config->usbp, qmkusbp->config->bulk_in, buf, n);
- }
+void usb_endpoint_out_configure_cb(usb_endpoint_out_t *endpoint) {
+ /* The current assumption is that there are no standalone OUT endpoints,
+ * therefore if we share an endpoint with an IN endpoint, it is already
+ * initialized. */
+#if !defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ usbInitEndpointI(endpoint->config.usbp, endpoint->config.ep, &endpoint->ep_config);
+#endif
+ ibqResetI(&endpoint->ibqueue);
+ bqResumeX(&endpoint->ibqueue);
+ (void)usb_start_receive(endpoint);
}
-/**
- * @brief Default data transmitted callback.
- * @details The application must use this function as callback for the IN
- * data endpoint.
- *
- * @param[in] usbp pointer to the @p USBDriver object
- * @param[in] ep IN endpoint number
- */
-void qmkusbDataTransmitted(USBDriver *usbp, usbep_t ep) {
- uint8_t * buf;
- size_t n;
- QMKUSBDriver *qmkusbp = usbp->in_params[ep - 1U];
+void usb_endpoint_in_tx_complete_cb(USBDriver *usbp, usbep_t ep) {
+ usb_endpoint_in_t *endpoint = usbp->in_params[ep - 1U];
+ size_t n;
+ uint8_t * buffer;
- if (qmkusbp == NULL) {
+ if (endpoint == NULL) {
return;
}
osalSysLockFromISR();
- /* Signaling that space is available in the output queue.*/
- chnAddFlagsI(qmkusbp, CHN_OUTPUT_EMPTY);
+ /* Sending succeded, so we can reset the timed out state. */
+ endpoint->timed_out = false;
/* Freeing the buffer just transmitted, if it was not a zero size packet.*/
- if (usbp->epc[ep]->in_state->txsize > 0U) {
- obqReleaseEmptyBufferI(&qmkusbp->obqueue);
+ if (!obqIsEmptyI(&endpoint->obqueue) && usbp->epc[ep]->in_state->txsize > 0U) {
+ /* Store the last send report in the endpoint to be retrieved by a
+ * GET_REPORT request or IDLE report handling. */
+ if (endpoint->report_storage != NULL) {
+ buffer = obqGetFullBufferI(&endpoint->obqueue, &n);
+ endpoint->report_storage->set_report(endpoint->report_storage->reports, buffer, n);
+ }
+ obqReleaseEmptyBufferI(&endpoint->obqueue);
}
/* Checking if there is a buffer ready for transmission.*/
- buf = obqGetFullBufferI(&qmkusbp->obqueue, &n);
+ buffer = obqGetFullBufferI(&endpoint->obqueue, &n);
- if (buf != NULL) {
+ if (buffer != NULL) {
/* The endpoint cannot be busy, we are in the context of the callback,
so it is safe to transmit without a check.*/
- usbStartTransmitI(usbp, ep, buf, n);
- } else if ((usbp->epc[ep]->in_state->txsize > 0U) && ((usbp->epc[ep]->in_state->txsize & ((size_t)usbp->epc[ep]->in_maxsize - 1U)) == 0U)) {
+ usbStartTransmitI(usbp, ep, buffer, n);
+ } else if ((usbp->epc[ep]->ep_mode == USB_EP_MODE_TYPE_BULK) && (usbp->epc[ep]->in_state->txsize > 0U) && ((usbp->epc[ep]->in_state->txsize & ((size_t)usbp->epc[ep]->in_maxsize - 1U)) == 0U)) {
/* Transmit zero sized packet in case the last one has maximum allowed
- size. Otherwise the recipient may expect more data coming soon and
- not return buffered data to app. See section 5.8.3 Bulk Transfer
- Packet Size Constraints of the USB Specification document.*/
- if (!qmkusbp->config->fixed_size) {
- usbStartTransmitI(usbp, ep, usbp->setup, 0);
- }
-
+ * size. Otherwise the recipient may expect more data coming soon and
+ * not return buffered data to app. See section 5.8.3 Bulk Transfer
+ * Packet Size Constraints of the USB Specification document. */
+ usbStartTransmitI(usbp, ep, usbp->setup, 0);
} else {
/* Nothing to transmit.*/
}
@@ -419,47 +228,114 @@ void qmkusbDataTransmitted(USBDriver *usbp, usbep_t ep) {
osalSysUnlockFromISR();
}
-/**
- * @brief Default data received callback.
- * @details The application must use this function as callback for the OUT
- * data endpoint.
- *
- * @param[in] usbp pointer to the @p USBDriver object
- * @param[in] ep OUT endpoint number
- */
-void qmkusbDataReceived(USBDriver *usbp, usbep_t ep) {
- QMKUSBDriver *qmkusbp = usbp->out_params[ep - 1U];
- if (qmkusbp == NULL) {
+void usb_endpoint_out_rx_complete_cb(USBDriver *usbp, usbep_t ep) {
+ usb_endpoint_out_t *endpoint = usbp->out_params[ep - 1U];
+ if (endpoint == NULL) {
return;
}
osalSysLockFromISR();
- /* Signaling that data is available in the input queue.*/
- chnAddFlagsI(qmkusbp, CHN_INPUT_AVAILABLE);
-
- /* Posting the filled buffer in the queue.*/
- ibqPostFullBufferI(&qmkusbp->ibqueue, usbGetReceiveTransactionSizeX(qmkusbp->config->usbp, qmkusbp->config->bulk_out));
+ size_t size = usbGetReceiveTransactionSizeX(usbp, ep);
+ if (size > 0) {
+ /* Posting the filled buffer in the queue.*/
+ ibqPostFullBufferI(&endpoint->ibqueue, usbGetReceiveTransactionSizeX(endpoint->config.usbp, endpoint->config.ep));
+ }
- /* The endpoint cannot be busy, we are in the context of the callback,
- so a packet is in the buffer for sure. Trying to get a free buffer
- for the next transaction.*/
- (void)qmkusb_start_receive(qmkusbp);
+ /* The endpoint cannot be busy, we are in the context of the callback, so a
+ * packet is in the buffer for sure. Trying to get a free buffer for the
+ * next transaction.*/
+ usb_start_receive(endpoint);
osalSysUnlockFromISR();
}
-/**
- * @brief Default data received callback.
- * @details The application must use this function as callback for the IN
- * interrupt endpoint.
- *
- * @param[in] usbp pointer to the @p USBDriver object
- * @param[in] ep endpoint number
- */
-void qmkusbInterruptTransmitted(USBDriver *usbp, usbep_t ep) {
- (void)usbp;
- (void)ep;
+bool usb_endpoint_in_send(usb_endpoint_in_t *endpoint, const uint8_t *data, size_t size, sysinterval_t timeout, bool buffered) {
+ osalDbgCheck((endpoint != NULL) && (data != NULL) && (size > 0U) && (size <= endpoint->config.buffer_size));
+
+ osalSysLock();
+ if (usbGetDriverStateI(endpoint->config.usbp) != USB_ACTIVE) {
+ osalSysUnlock();
+ return false;
+ }
+
+ /* Short circuit the waiting if this endpoint timed out before, e.g. if
+ * nobody is listening on this endpoint (is disconnected) such as
+ * `hid_listen`/`qmk console` or we are in an environment with a very
+ * restricted USB stack. The reason is to not introduce micro lock-ups if
+ * the report is send periodically. */
+ if (endpoint->timed_out && timeout != TIME_INFINITE) {
+ timeout = TIME_IMMEDIATE;
+ }
+ osalSysUnlock();
+
+ while (true) {
+ size_t sent = obqWriteTimeout(&endpoint->obqueue, data, size, timeout);
+
+ if (sent < size) {
+ osalSysLock();
+ endpoint->timed_out |= sent == 0;
+ bqSuspendI(&endpoint->obqueue);
+ obqResetI(&endpoint->obqueue);
+ bqResumeX(&endpoint->obqueue);
+ osalOsRescheduleS();
+ osalSysUnlock();
+ continue;
+ }
+
+ if (!buffered) {
+ obqFlush(&endpoint->obqueue);
+ }
+
+ return true;
+ }
+}
+
+void usb_endpoint_in_flush(usb_endpoint_in_t *endpoint, bool padded) {
+ osalDbgCheck(endpoint != NULL);
+
+ output_buffers_queue_t *obqp = &endpoint->obqueue;
+
+ if (padded && obqp->ptr != NULL) {
+ ptrdiff_t bytes_left = (size_t)obqp->top - (size_t)obqp->ptr;
+ while (bytes_left > 0) {
+ // Putting bytes into a buffer that has space left should never
+ // fail and be instant, therefore we don't check the return value
+ // for errors here.
+ obqPutTimeout(obqp, 0, TIME_IMMEDIATE);
+ bytes_left--;
+ }
+ }
+
+ obqFlush(obqp);
+}
+
+bool usb_endpoint_in_is_inactive(usb_endpoint_in_t *endpoint) {
+ osalDbgCheck(endpoint != NULL);
+
+ osalSysLock();
+ bool inactive = obqIsEmptyI(&endpoint->obqueue) && !usbGetTransmitStatusI(endpoint->config.usbp, endpoint->config.ep);
+ osalSysUnlock();
+
+ return inactive;
}
-/** @} */
+bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout) {
+ osalDbgCheck((endpoint != NULL) && (data != NULL) && (size > 0U));
+
+ osalSysLock();
+ if (usbGetDriverStateI(endpoint->config.usbp) != USB_ACTIVE) {
+ osalSysUnlock();
+ return false;
+ }
+
+ if (endpoint->timed_out && timeout != TIME_INFINITE) {
+ timeout = TIME_IMMEDIATE;
+ }
+ osalSysUnlock();
+
+ const size_t received = ibqReadTimeout(&endpoint->ibqueue, data, size, timeout);
+ endpoint->timed_out = received == 0;
+
+ return received == size;
+}
diff --git a/tmk_core/protocol/chibios/usb_driver.h b/tmk_core/protocol/chibios/usb_driver.h
index f94387debd..26787e1eba 100644
--- a/tmk_core/protocol/chibios/usb_driver.h
+++ b/tmk_core/protocol/chibios/usb_driver.h
@@ -1,177 +1,209 @@
-/*
- ChibiOS - Copyright (C) 2006..2016 Giovanni Di Sirio
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
-*/
-
-/**
- * @file usb_driver.h
- * @brief Usb driver suitable for both packet and serial formats
- *
- * @addtogroup SERIAL_USB
- * @{
- */
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// Copyright 2020 Ryan (@fauxpark)
+// Copyright 2016 Fredizzimo
+// Copyright 2016 Giovanni Di Sirio
+// SPDX-License-Identifier: GPL-3.0-or-later OR Apache-2.0
#pragma once
-#include <hal_usb_cdc.h>
-
-/*===========================================================================*/
-/* Driver constants. */
-/*===========================================================================*/
-
-/*===========================================================================*/
-/* Derived constants and error checks. */
-/*===========================================================================*/
+#include <hal_buffers.h>
+#include "usb_descriptor.h"
+#include "chibios_config.h"
+#include "usb_report_handling.h"
+#include "string.h"
+#include "timer.h"
#if HAL_USE_USB == FALSE
# error "The USB Driver requires HAL_USE_USB"
#endif
-/*===========================================================================*/
-/* Driver data structures and types. */
-/*===========================================================================*/
+/* USB Low Level driver specific endpoint fields */
+#if !defined(usb_lld_endpoint_fields)
+# define usb_lld_endpoint_fields \
+ 2, /* IN multiplier */ \
+ NULL, /* SETUP buffer (not a SETUP endpoint) */
+#endif
-/**
- * @brief Driver state machine possible states.
- */
-typedef enum {
- QMKUSB_UNINIT = 0, /**< Not initialized. */
- QMKUSB_STOP = 1, /**< Stopped. */
- QMKUSB_READY = 2 /**< Ready. */
-} qmkusbstate_t;
-
-/**
- * @brief Structure representing a serial over USB driver.
+/*
+ * Implementation notes:
+ *
+ * USBEndpointConfig - Configured using explicit order instead of struct member name.
+ * This is due to ChibiOS hal LLD differences, which is dependent on hardware,
+ * "USBv1" devices have `ep_buffers` and "OTGv1" have `in_multiplier`.
+ * Given `USBv1/hal_usb_lld.h` marks the field as "not currently used" this code file
+ * makes the assumption this is safe to avoid littering with preprocessor directives.
*/
-typedef struct QMKUSBDriver QMKUSBDriver;
+#define QMK_USB_ENDPOINT_IN(mode, ep_size, ep_num, _buffer_capacity, _usb_requests_cb, _report_storage) \
+ { \
+ .usb_requests_cb = _usb_requests_cb, .report_storage = _report_storage, \
+ .ep_config = \
+ { \
+ mode, /* EP Mode */ \
+ NULL, /* SETUP packet notification callback */ \
+ usb_endpoint_in_tx_complete_cb, /* IN notification callback */ \
+ NULL, /* OUT notification callback */ \
+ ep_size, /* IN maximum packet size */ \
+ 0, /* OUT maximum packet size */ \
+ NULL, /* IN Endpoint state */ \
+ NULL, /* OUT endpoint state */ \
+ usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
+ }, \
+ .config = { \
+ .usbp = &USB_DRIVER, \
+ .ep = ep_num, \
+ .buffer_capacity = _buffer_capacity, \
+ .buffer_size = ep_size, \
+ .buffer = (_Alignas(4) uint8_t[BQ_BUFFER_SIZE(_buffer_capacity, ep_size)]){0}, \
+ } \
+ }
+
+#if !defined(USB_ENDPOINTS_ARE_REORDERABLE)
+
+# define QMK_USB_ENDPOINT_OUT(mode, ep_size, ep_num, _buffer_capacity) \
+ { \
+ .ep_config = \
+ { \
+ mode, /* EP Mode */ \
+ NULL, /* SETUP packet notification callback */ \
+ NULL, /* IN notification callback */ \
+ usb_endpoint_out_rx_complete_cb, /* OUT notification callback */ \
+ 0, /* IN maximum packet size */ \
+ ep_size, /* OUT maximum packet size */ \
+ NULL, /* IN Endpoint state */ \
+ NULL, /* OUT endpoint state */ \
+ usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
+ }, \
+ .config = { \
+ .usbp = &USB_DRIVER, \
+ .ep = ep_num, \
+ .buffer_capacity = _buffer_capacity, \
+ .buffer_size = ep_size, \
+ .buffer = (_Alignas(4) uint8_t[BQ_BUFFER_SIZE(_buffer_capacity, ep_size)]){0} \
+ } \
+ }
+
+#else
+
+# define QMK_USB_ENDPOINT_IN_SHARED(mode, ep_size, ep_num, _buffer_capacity, _usb_requests_cb, _report_storage) \
+ { \
+ .usb_requests_cb = _usb_requests_cb, .is_shared = true, .report_storage = _report_storage, \
+ .ep_config = \
+ { \
+ mode, /* EP Mode */ \
+ NULL, /* SETUP packet notification callback */ \
+ usb_endpoint_in_tx_complete_cb, /* IN notification callback */ \
+ usb_endpoint_out_rx_complete_cb, /* OUT notification callback */ \
+ ep_size, /* IN maximum packet size */ \
+ ep_size, /* OUT maximum packet size */ \
+ NULL, /* IN Endpoint state */ \
+ NULL, /* OUT endpoint state */ \
+ usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
+ }, \
+ .config = { \
+ .usbp = &USB_DRIVER, \
+ .ep = ep_num, \
+ .buffer_capacity = _buffer_capacity, \
+ .buffer_size = ep_size, \
+ .buffer = (_Alignas(4) uint8_t[BQ_BUFFER_SIZE(_buffer_capacity, ep_size)]){0}, \
+ } \
+ }
+
+/* The current assumption is that there are no standalone OUT endpoints, so the
+ * OUT endpoint is always initialized by the IN endpoint. */
+# define QMK_USB_ENDPOINT_OUT(mode, ep_size, ep_num, _buffer_capacity) \
+ { \
+ .ep_config = \
+ { \
+ 0 /* Already defined in the IN endpoint */ \
+ }, \
+ .config = { \
+ .usbp = &USB_DRIVER, \
+ .ep = ep_num, \
+ .buffer_capacity = _buffer_capacity, \
+ .buffer_size = ep_size, \
+ .buffer = (_Alignas(4) uint8_t[BQ_BUFFER_SIZE(_buffer_capacity, ep_size)]){0} \
+ } \
+ }
+
+#endif
-/**
- * @brief Serial over USB Driver configuration structure.
- * @details An instance of this structure must be passed to @p sduStart()
- * in order to configure and start the driver operations.
- */
typedef struct {
/**
* @brief USB driver to use.
*/
USBDriver *usbp;
+
/**
- * @brief Bulk IN endpoint used for outgoing data transfer.
- */
- usbep_t bulk_in;
- /**
- * @brief Bulk OUT endpoint used for incoming data transfer.
- */
- usbep_t bulk_out;
- /**
- * @brief Interrupt IN endpoint used for notifications.
- * @note If set to zero then the INT endpoint is assumed to be not
- * present, USB descriptors must be changed accordingly.
+ * @brief Endpoint used for data transfer
*/
- usbep_t int_in;
+ usbep_t ep;
/**
- * @brief The number of buffers in the queues
+ * @brief The number of buffers in the queue
*/
- size_t in_buffers;
- size_t out_buffers;
+ size_t buffer_capacity;
/**
- * @brief The size of each buffer in the queue, typically the same as the endpoint size
+ * @brief The size of each buffer in the queue, same as the endpoint size
*/
- size_t in_size;
- size_t out_size;
+ size_t buffer_size;
/**
- * @brief Always send full buffers in_size (the rest is filled with zeroes)
+ * @brief Buffer backing storage
*/
- bool fixed_size;
+ uint8_t *buffer;
+} usb_endpoint_config_t;
- /* Input buffer
- * @note needs to be initialized with a memory buffer of the right size
- */
- uint8_t *ib;
- /* Output buffer
- * @note needs to be initialized with a memory buffer of the right size
- */
- uint8_t *ob;
-} QMKUSBConfig;
+typedef struct {
+ output_buffers_queue_t obqueue;
+ USBEndpointConfig ep_config;
+ USBInEndpointState ep_in_state;
+#if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ USBOutEndpointState ep_out_state;
+ bool is_shared;
+#endif
+ usb_endpoint_config_t config;
+ usbreqhandler_t usb_requests_cb;
+ bool timed_out;
+ usb_report_storage_t *report_storage;
+} usb_endpoint_in_t;
-/**
- * @brief @p SerialDriver specific data.
- */
-#define _qmk_usb_driver_data \
- _base_asynchronous_channel_data /* Driver state.*/ \
- qmkusbstate_t state; \
- /* Input buffers queue.*/ \
- input_buffers_queue_t ibqueue; \
- /* Output queue.*/ \
- output_buffers_queue_t obqueue; \
- /* End of the mandatory fields.*/ \
- /* Current configuration data.*/ \
- const QMKUSBConfig *config;
-
-/**
- * @brief @p SerialUSBDriver specific methods.
- */
-#define _qmk_usb_driver_methods _base_asynchronous_channel_methods
+typedef struct {
+ input_buffers_queue_t ibqueue;
+ USBEndpointConfig ep_config;
+ USBOutEndpointState ep_out_state;
+ usb_endpoint_config_t config;
+ bool timed_out;
+} usb_endpoint_out_t;
-/**
- * @extends BaseAsynchronousChannelVMT
- *
- * @brief @p SerialDriver virtual methods table.
- */
-struct QMKUSBDriverVMT {
- _qmk_usb_driver_methods
-};
+#ifdef __cplusplus
+extern "C" {
+#endif
-/**
- * @extends BaseAsynchronousChannel
- *
- * @brief Full duplex serial driver class.
- * @details This class extends @p BaseAsynchronousChannel by adding physical
- * I/O queues.
- */
-struct QMKUSBDriver {
- /** @brief Virtual Methods Table.*/
- const struct QMKUSBDriverVMT *vmt;
- _qmk_usb_driver_data
-};
+void usb_endpoint_in_init(usb_endpoint_in_t *endpoint);
+void usb_endpoint_in_start(usb_endpoint_in_t *endpoint);
+void usb_endpoint_in_stop(usb_endpoint_in_t *endpoint);
-/*===========================================================================*/
-/* Driver macros. */
-/*===========================================================================*/
+bool usb_endpoint_in_send(usb_endpoint_in_t *endpoint, const uint8_t *data, size_t size, sysinterval_t timeout, bool buffered);
+void usb_endpoint_in_flush(usb_endpoint_in_t *endpoint, bool padded);
+bool usb_endpoint_in_is_inactive(usb_endpoint_in_t *endpoint);
-/*===========================================================================*/
-/* External declarations. */
-/*===========================================================================*/
+void usb_endpoint_in_suspend_cb(usb_endpoint_in_t *endpoint);
+void usb_endpoint_in_wakeup_cb(usb_endpoint_in_t *endpoint);
+void usb_endpoint_in_configure_cb(usb_endpoint_in_t *endpoint);
+void usb_endpoint_in_tx_complete_cb(USBDriver *usbp, usbep_t ep);
+
+void usb_endpoint_out_init(usb_endpoint_out_t *endpoint);
+void usb_endpoint_out_start(usb_endpoint_out_t *endpoint);
+void usb_endpoint_out_stop(usb_endpoint_out_t *endpoint);
+
+bool usb_endpoint_out_receive(usb_endpoint_out_t *endpoint, uint8_t *data, size_t size, sysinterval_t timeout);
+
+void usb_endpoint_out_suspend_cb(usb_endpoint_out_t *endpoint);
+void usb_endpoint_out_wakeup_cb(usb_endpoint_out_t *endpoint);
+void usb_endpoint_out_configure_cb(usb_endpoint_out_t *endpoint);
+void usb_endpoint_out_rx_complete_cb(USBDriver *usbp, usbep_t ep);
-#ifdef __cplusplus
-extern "C" {
-#endif
-void qmkusbInit(void);
-void qmkusbObjectInit(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config);
-void qmkusbStart(QMKUSBDriver *qmkusbp, const QMKUSBConfig *config);
-void qmkusbStop(QMKUSBDriver *qmkusbp);
-void qmkusbSuspendHookI(QMKUSBDriver *qmkusbp);
-void qmkusbWakeupHookI(QMKUSBDriver *qmkusbp);
-void qmkusbConfigureHookI(QMKUSBDriver *qmkusbp);
-bool qmkusbRequestsHook(USBDriver *usbp);
-void qmkusbSOFHookI(QMKUSBDriver *qmkusbp);
-void qmkusbDataTransmitted(USBDriver *usbp, usbep_t ep);
-void qmkusbDataReceived(USBDriver *usbp, usbep_t ep);
-void qmkusbInterruptTransmitted(USBDriver *usbp, usbep_t ep);
#ifdef __cplusplus
}
#endif
diff --git a/tmk_core/protocol/chibios/usb_endpoints.c b/tmk_core/protocol/chibios/usb_endpoints.c
new file mode 100644
index 0000000000..37ec3c722f
--- /dev/null
+++ b/tmk_core/protocol/chibios/usb_endpoints.c
@@ -0,0 +1,152 @@
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include <ch.h>
+#include <hal.h>
+
+#include "usb_main.h"
+#include "usb_driver.h"
+#include "usb_endpoints.h"
+#include "report.h"
+
+usb_endpoint_in_t usb_endpoints_in[USB_ENDPOINT_IN_COUNT] = {
+// clang-format off
+#if defined(SHARED_EP_ENABLE)
+ [USB_ENDPOINT_IN_SHARED] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, SHARED_EPSIZE, SHARED_IN_EPNUM, SHARED_IN_CAPACITY, NULL,
+ QMK_USB_REPORT_STORAGE(
+ &usb_shared_get_report,
+ &usb_shared_set_report,
+ &usb_shared_reset_report,
+ &usb_shared_get_idle_rate,
+ &usb_shared_set_idle_rate,
+ &usb_shared_idle_timer_elapsed,
+ (REPORT_ID_COUNT + 1),
+#if defined(KEYBOARD_SHARED_EP)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_KEYBOARD, sizeof(report_keyboard_t)),
+#endif
+#if defined(MOUSE_SHARED_EP)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_MOUSE, sizeof(report_mouse_t)),
+#endif
+#if defined(EXTRAKEY_ENABLE)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_SYSTEM, sizeof(report_extra_t)),
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_CONSUMER, sizeof(report_extra_t)),
+#endif
+#if defined(PROGRAMMABLE_BUTTON_ENABLE)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_PROGRAMMABLE_BUTTON, sizeof(report_programmable_button_t)),
+#endif
+#if defined(NKRO_ENABLE)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_NKRO, sizeof(report_nkro_t)),
+#endif
+#if defined(JOYSTICK_SHARED_EP)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_JOYSTICK, sizeof(report_joystick_t)),
+#endif
+#if defined(DIGITIZER_SHARED_EP)
+ QMK_USB_REPORT_STROAGE_ENTRY(REPORT_ID_DIGITIZER, sizeof(report_digitizer_t)),
+#endif
+ )
+ ),
+#endif
+// clang-format on
+
+#if !defined(KEYBOARD_SHARED_EP)
+ [USB_ENDPOINT_IN_KEYBOARD] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, KEYBOARD_EPSIZE, KEYBOARD_IN_EPNUM, KEYBOARD_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(sizeof(report_keyboard_t))),
+#endif
+
+#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
+ [USB_ENDPOINT_IN_MOUSE] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, MOUSE_EPSIZE, MOUSE_IN_EPNUM, MOUSE_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(sizeof(report_mouse_t))),
+#endif
+
+#if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
+ [USB_ENDPOINT_IN_JOYSTICK] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, JOYSTICK_EPSIZE, JOYSTICK_IN_EPNUM, JOYSTICK_IN_CAPACITY, QMK_USB_REPORT_STORAGE_DEFAULT(sizeof(report_joystick_t))),
+#endif
+
+#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
+ [USB_ENDPOINT_IN_JOYSTICK] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, DIGITIZER_EPSIZE, DIGITIZER_IN_EPNUM, DIGITIZER_IN_CAPACITY, QMK_USB_REPORT_STORAGE_DEFAULT(sizeof(report_digitizer_t))),
+#endif
+
+#if defined(CONSOLE_ENABLE)
+# if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ [USB_ENDPOINT_IN_CONSOLE] = QMK_USB_ENDPOINT_IN_SHARED(USB_EP_MODE_TYPE_INTR, CONSOLE_EPSIZE, CONSOLE_IN_EPNUM, CONSOLE_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(CONSOLE_EPSIZE)),
+# else
+ [USB_ENDPOINT_IN_CONSOLE] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, CONSOLE_EPSIZE, CONSOLE_IN_EPNUM, CONSOLE_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(CONSOLE_EPSIZE)),
+# endif
+#endif
+
+#if defined(RAW_ENABLE)
+# if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ [USB_ENDPOINT_IN_RAW] = QMK_USB_ENDPOINT_IN_SHARED(USB_EP_MODE_TYPE_INTR, RAW_EPSIZE, RAW_IN_EPNUM, RAW_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(RAW_EPSIZE)),
+# else
+ [USB_ENDPOINT_IN_RAW] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, RAW_EPSIZE, RAW_IN_EPNUM, RAW_IN_CAPACITY, NULL, QMK_USB_REPORT_STORAGE_DEFAULT(RAW_EPSIZE)),
+# endif
+#endif
+
+#if defined(MIDI_ENABLE)
+# if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ [USB_ENDPOINT_IN_MIDI] = QMK_USB_ENDPOINT_IN_SHARED(USB_EP_MODE_TYPE_BULK, MIDI_STREAM_EPSIZE, MIDI_STREAM_IN_EPNUM, MIDI_STREAM_IN_CAPACITY, NULL, NULL),
+# else
+ [USB_ENDPOINT_IN_MIDI] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_BULK, MIDI_STREAM_EPSIZE, MIDI_STREAM_IN_EPNUM, MIDI_STREAM_IN_CAPACITY, NULL, NULL),
+# endif
+#endif
+
+#if defined(VIRTSER_ENABLE)
+# if defined(USB_ENDPOINTS_ARE_REORDERABLE)
+ [USB_ENDPOINT_IN_CDC_DATA] = QMK_USB_ENDPOINT_IN_SHARED(USB_EP_MODE_TYPE_BULK, CDC_EPSIZE, CDC_IN_EPNUM, CDC_IN_CAPACITY, virtser_usb_request_cb, NULL),
+# else
+ [USB_ENDPOINT_IN_CDC_DATA] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_BULK, CDC_EPSIZE, CDC_IN_EPNUM, CDC_IN_CAPACITY, virtser_usb_request_cb, NULL),
+# endif
+ [USB_ENDPOINT_IN_CDC_SIGNALING] = QMK_USB_ENDPOINT_IN(USB_EP_MODE_TYPE_INTR, CDC_NOTIFICATION_EPSIZE, CDC_NOTIFICATION_EPNUM, CDC_SIGNALING_DUMMY_CAPACITY, NULL, NULL),
+#endif
+};
+
+usb_endpoint_in_lut_t usb_endpoint_interface_lut[TOTAL_INTERFACES] = {
+#if !defined(KEYBOARD_SHARED_EP)
+ [KEYBOARD_INTERFACE] = USB_ENDPOINT_IN_KEYBOARD,
+#endif
+
+#if defined(RAW_ENABLE)
+ [RAW_INTERFACE] = USB_ENDPOINT_IN_RAW,
+#endif
+
+#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
+ [MOUSE_INTERFACE] = USB_ENDPOINT_IN_MOUSE,
+#endif
+
+#if defined(SHARED_EP_ENABLE)
+ [SHARED_INTERFACE] = USB_ENDPOINT_IN_SHARED,
+#endif
+
+#if defined(CONSOLE_ENABLE)
+ [CONSOLE_INTERFACE] = USB_ENDPOINT_IN_CONSOLE,
+#endif
+
+#if defined(MIDI_ENABLE)
+ [AS_INTERFACE] = USB_ENDPOINT_IN_MIDI,
+#endif
+
+#if defined(VIRTSER_ENABLE)
+ [CCI_INTERFACE] = USB_ENDPOINT_IN_CDC_SIGNALING,
+ [CDI_INTERFACE] = USB_ENDPOINT_IN_CDC_DATA,
+#endif
+
+#if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
+ [JOYSTICK_INTERFACE] = USB_ENDPOINT_IN_JOYSTICK,
+#endif
+
+#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
+ [DIGITIZER_INTERFACE] = USB_ENDPOINT_IN_DIGITIZER,
+#endif
+};
+
+usb_endpoint_out_t usb_endpoints_out[USB_ENDPOINT_OUT_COUNT] = {
+#if defined(RAW_ENABLE)
+ [USB_ENDPOINT_OUT_RAW] = QMK_USB_ENDPOINT_OUT(USB_EP_MODE_TYPE_INTR, RAW_EPSIZE, RAW_OUT_EPNUM, RAW_OUT_CAPACITY),
+#endif
+
+#if defined(MIDI_ENABLE)
+ [USB_ENDPOINT_OUT_MIDI] = QMK_USB_ENDPOINT_OUT(USB_EP_MODE_TYPE_BULK, MIDI_STREAM_EPSIZE, MIDI_STREAM_OUT_EPNUM, MIDI_STREAM_OUT_CAPACITY),
+#endif
+
+#if defined(VIRTSER_ENABLE)
+ [USB_ENDPOINT_OUT_CDC_DATA] = QMK_USB_ENDPOINT_OUT(USB_EP_MODE_TYPE_BULK, CDC_EPSIZE, CDC_OUT_EPNUM, CDC_OUT_CAPACITY),
+#endif
+};
diff --git a/tmk_core/protocol/chibios/usb_endpoints.h b/tmk_core/protocol/chibios/usb_endpoints.h
new file mode 100644
index 0000000000..a4e5ed88fc
--- /dev/null
+++ b/tmk_core/protocol/chibios/usb_endpoints.h
@@ -0,0 +1,137 @@
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include "usb_descriptor.h"
+
+#if !defined(USB_DEFAULT_BUFFER_CAPACITY)
+# define USB_DEFAULT_BUFFER_CAPACITY 4
+#endif
+
+#if !defined(KEYBOARD_IN_CAPACITY)
+# define KEYBOARD_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+#if !defined(SHARED_IN_CAPACITY)
+# define SHARED_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+#if !defined(MOUSE_IN_CAPACITY)
+# define MOUSE_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(JOYSTICK_IN_CAPACITY)
+# define JOYSTICK_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(DIGITIZER_IN_CAPACITY)
+# define DIGITIZER_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(CONSOLE_IN_CAPACITY)
+# define CONSOLE_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(CONSOLE_OUT_CAPACITY)
+# define CONSOLE_OUT_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(RAW_IN_CAPACITY)
+# define RAW_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(RAW_OUT_CAPACITY)
+# define RAW_OUT_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(MIDI_STREAM_IN_CAPACITY)
+# define MIDI_STREAM_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(MIDI_STREAM_OUT_CAPACITY)
+# define MIDI_STREAM_OUT_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(CDC_IN_CAPACITY)
+# define CDC_IN_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#if !defined(CDC_OUT_CAPACITY)
+# define CDC_OUT_CAPACITY USB_DEFAULT_BUFFER_CAPACITY
+#endif
+
+#define CDC_SIGNALING_DUMMY_CAPACITY 1
+
+typedef enum {
+#if defined(SHARED_EP_ENABLE)
+ USB_ENDPOINT_IN_SHARED,
+#endif
+
+#if !defined(KEYBOARD_SHARED_EP)
+ USB_ENDPOINT_IN_KEYBOARD,
+#endif
+
+#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
+ USB_ENDPOINT_IN_MOUSE,
+#endif
+
+#if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
+ USB_ENDPOINT_IN_JOYSTICK,
+#endif
+
+#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
+ USB_ENDPOINT_IN_DIGITIZER,
+#endif
+
+#if defined(CONSOLE_ENABLE)
+ USB_ENDPOINT_IN_CONSOLE,
+#endif
+
+#if defined(RAW_ENABLE)
+ USB_ENDPOINT_IN_RAW,
+#endif
+
+#if defined(MIDI_ENABLE)
+ USB_ENDPOINT_IN_MIDI,
+#endif
+
+#if defined(VIRTSER_ENABLE)
+ USB_ENDPOINT_IN_CDC_DATA,
+ USB_ENDPOINT_IN_CDC_SIGNALING,
+#endif
+ USB_ENDPOINT_IN_COUNT,
+/* All non shared endpoints have to be consequtive numbers starting from 0, so
+ * that they can be used as array indices. The shared endpoints all point to
+ * the same endpoint so they have to be defined last to not reset the enum
+ * counter. */
+#if defined(SHARED_EP_ENABLE)
+# if defined(KEYBOARD_SHARED_EP)
+ USB_ENDPOINT_IN_KEYBOARD = USB_ENDPOINT_IN_SHARED,
+# endif
+# if defined(MOUSE_SHARED_EP)
+ USB_ENDPOINT_IN_MOUSE = USB_ENDPOINT_IN_SHARED,
+# endif
+# if defined(JOYSTICK_SHARED_EP)
+ USB_ENDPOINT_IN_JOYSTICK = USB_ENDPOINT_IN_SHARED,
+# endif
+# if defined(DIGITIZER_SHARED_EP)
+ USB_ENDPOINT_IN_DIGITIZER = USB_ENDPOINT_IN_SHARED,
+# endif
+#endif
+} usb_endpoint_in_lut_t;
+
+#define IS_VALID_USB_ENDPOINT_IN_LUT(i) ((i) >= 0 && (i) < USB_ENDPOINT_IN_COUNT)
+
+usb_endpoint_in_lut_t usb_endpoint_interface_lut[TOTAL_INTERFACES];
+
+typedef enum {
+#if defined(RAW_ENABLE)
+ USB_ENDPOINT_OUT_RAW,
+#endif
+#if defined(MIDI_ENABLE)
+ USB_ENDPOINT_OUT_MIDI,
+#endif
+#if defined(VIRTSER_ENABLE)
+ USB_ENDPOINT_OUT_CDC_DATA,
+#endif
+ USB_ENDPOINT_OUT_COUNT,
+} usb_endpoint_out_lut_t;
diff --git a/tmk_core/protocol/chibios/usb_main.c b/tmk_core/protocol/chibios/usb_main.c
index 7b1e641213..ced5fd4fc2 100644
--- a/tmk_core/protocol/chibios/usb_main.c
+++ b/tmk_core/protocol/chibios/usb_main.c
@@ -1,45 +1,32 @@
-/*
- * (c) 2015 flabberast <[email protected]>
- *
- * Based on the following work:
- * - Guillaume Duc's raw hid example (MIT License)
- * https://github.com/guiduc/usb-hid-chibios-example
- * - PJRC Teensy examples (MIT License)
- * https://www.pjrc.com/teensy/usb_keyboard.html
- * - hasu's TMK keyboard code (GPL v2 and some code Modified BSD)
- * https://github.com/tmk/tmk_keyboard/
- * - ChibiOS demo code (Apache 2.0 License)
- * http://www.chibios.org
- *
- * Since some GPL'd code is used, this work is licensed under
- * GPL v2 or later.
- */
-
-/*
- * Implementation notes:
- *
- * USBEndpointConfig - Configured using explicit order instead of struct member name.
- * This is due to ChibiOS hal LLD differences, which is dependent on hardware,
- * "USBv1" devices have `ep_buffers` and "OTGv1" have `in_multiplier`.
- * Given `USBv1/hal_usb_lld.h` marks the field as "not currently used" this code file
- * makes the assumption this is safe to avoid littering with preprocessor directives.
- */
+// Copyright 2023 Stefan Kerkmann
+// Copyright 2020-2021 Ryan (@fauxpark)
+// Copyright 2020 Nick Brassel (@tzarc)
+// Copyright 2020 a-chol
+// Copyright 2020 xyzz
+// Copyright 2020 Joel Challis (@zvecr)
+// Copyright 2020 George (@goshdarnharris)
+// Copyright 2018 James Laird-Wah
+// Copyright 2018 Drashna Jaelre (@drashna)
+// Copyright 2016 Fredizzimo
+// Copyright 2016 Giovanni Di Sirio
+// SPDX-License-Identifier: GPL-3.0-or-later OR Apache-2.0
#include <ch.h>
#include <hal.h>
#include <string.h>
#include "usb_main.h"
+#include "usb_report_handling.h"
#include "host.h"
-#include "chibios_config.h"
-#include "debug.h"
#include "suspend.h"
+#include "timer.h"
#ifdef SLEEP_LED_ENABLE
# include "sleep_led.h"
# include "led.h"
#endif
#include "wait.h"
+#include "usb_endpoints.h"
#include "usb_device_state.h"
#include "usb_descriptor.h"
#include "usb_driver.h"
@@ -51,11 +38,6 @@
extern keymap_config_t keymap_config;
#endif
-#if defined(CONSOLE_ENABLE)
-# define RBUF_SIZE 256
-# include "ring_buffer.h"
-#endif
-
/* ---------------------------------------------------------
* Global interface variables and declarations
* ---------------------------------------------------------
@@ -69,33 +51,16 @@ extern keymap_config_t keymap_config;
# define usb_lld_disconnect_bus(usbp)
#endif
-uint8_t keyboard_idle __attribute__((aligned(2))) = 0;
-uint8_t keyboard_protocol __attribute__((aligned(2))) = 1;
-uint8_t keyboard_led_state = 0;
-volatile uint16_t keyboard_idle_count = 0;
-static virtual_timer_t keyboard_idle_timer;
-
-static void keyboard_idle_timer_cb(struct ch_virtual_timer *, void *arg);
+extern usb_endpoint_in_t usb_endpoints_in[USB_ENDPOINT_IN_COUNT];
+extern usb_endpoint_out_t usb_endpoints_out[USB_ENDPOINT_OUT_COUNT];
-report_keyboard_t keyboard_report_sent = {0};
-report_mouse_t mouse_report_sent = {0};
+uint8_t _Alignas(2) keyboard_idle = 0;
+uint8_t _Alignas(2) keyboard_protocol = 1;
+uint8_t keyboard_led_state = 0;
-union {
- uint8_t report_id;
- report_keyboard_t keyboard;
-#ifdef EXTRAKEY_ENABLE
- report_extra_t extra;
-#endif
-#ifdef MOUSE_ENABLE
- report_mouse_t mouse;
-#endif
-#ifdef DIGITIZER_ENABLE
- report_digitizer_t digitizer;
-#endif
-#ifdef JOYSTICK_ENABLE
- report_joystick_t joystick;
-#endif
-} universal_report_blank = {0};
+static bool __attribute__((__unused__)) send_report_buffered(usb_endpoint_in_lut_t endpoint, void *report, size_t size);
+static void __attribute__((__unused__)) flush_report_buffered(usb_endpoint_in_lut_t endpoint, bool padded);
+static bool __attribute__((__unused__)) receive_report(usb_endpoint_out_lut_t endpoint, void *report, size_t size);
/* ---------------------------------------------------------
* Descriptors and USB driver objects
@@ -109,6 +74,11 @@ union {
NULL, /* SETUP buffer (not a SETUP endpoint) */
#endif
+/*
+ * Handles the GET_DESCRIPTOR callback
+ *
+ * Returns the proper descriptor
+ */
static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype, uint8_t dindex, uint16_t wIndex) {
usb_control_request_t *setup = (usb_control_request_t *)usbp->setup;
@@ -123,299 +93,6 @@ static const USBDescriptor *usb_get_descriptor_cb(USBDriver *usbp, uint8_t dtype
return &descriptor;
}
-/*
- * USB notification callback that does nothing. Needed to work around bugs in
- * some USB LLDs that fail to resume the waiting thread when the notification
- * callback pointer is NULL.
- */
-static void dummy_usb_cb(USBDriver *usbp, usbep_t ep) {
- (void)usbp;
- (void)ep;
-}
-
-#ifndef KEYBOARD_SHARED_EP
-/* keyboard endpoint state structure */
-static USBInEndpointState kbd_ep_state;
-/* keyboard endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig kbd_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- KEYBOARD_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &kbd_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
-/* mouse endpoint state structure */
-static USBInEndpointState mouse_ep_state;
-
-/* mouse endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig mouse_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- MOUSE_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &mouse_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#ifdef SHARED_EP_ENABLE
-/* shared endpoint state structure */
-static USBInEndpointState shared_ep_state;
-
-/* shared endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig shared_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- SHARED_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &shared_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
-/* joystick endpoint state structure */
-static USBInEndpointState joystick_ep_state;
-
-/* joystick endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig joystick_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- JOYSTICK_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &joystick_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
-/* digitizer endpoint state structure */
-static USBInEndpointState digitizer_ep_state;
-
-/* digitizer endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig digitizer_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- DIGITIZER_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &digitizer_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#ifdef CONSOLE_ENABLE
-/* Console endpoint state structure */
-static USBInEndpointState console_ep_state;
-
-/* Console endpoint initialization structure (IN) - see USBEndpointConfig comment at top of file */
-static const USBEndpointConfig console_ep_config = {
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */
- NULL, /* SETUP packet notification callback */
- dummy_usb_cb, /* IN notification callback */
- NULL, /* OUT notification callback */
- CONSOLE_EPSIZE, /* IN maximum packet size */
- 0, /* OUT maximum packet size */
- &console_ep_state, /* IN Endpoint state */
- NULL, /* OUT endpoint state */
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */
-};
-#endif
-
-#ifdef USB_ENDPOINTS_ARE_REORDERABLE
-typedef struct {
- size_t queue_capacity_in;
- size_t queue_capacity_out;
- USBInEndpointState in_ep_state;
- USBOutEndpointState out_ep_state;
- USBInEndpointState int_ep_state;
- USBEndpointConfig inout_ep_config;
- USBEndpointConfig int_ep_config;
- const QMKUSBConfig config;
- QMKUSBDriver driver;
-} usb_driver_config_t;
-#else
-typedef struct {
- size_t queue_capacity_in;
- size_t queue_capacity_out;
- USBInEndpointState in_ep_state;
- USBOutEndpointState out_ep_state;
- USBInEndpointState int_ep_state;
- USBEndpointConfig in_ep_config;
- USBEndpointConfig out_ep_config;
- USBEndpointConfig int_ep_config;
- const QMKUSBConfig config;
- QMKUSBDriver driver;
-} usb_driver_config_t;
-#endif
-
-#ifdef USB_ENDPOINTS_ARE_REORDERABLE
-/* Reusable initialization structure - see USBEndpointConfig comment at top of file */
-# define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
- { \
- .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
- .inout_ep_config = \
- { \
- stream##_IN_MODE, /* Interrupt EP */ \
- NULL, /* SETUP packet notification callback */ \
- qmkusbDataTransmitted, /* IN notification callback */ \
- qmkusbDataReceived, /* OUT notification callback */ \
- stream##_EPSIZE, /* IN maximum packet size */ \
- stream##_EPSIZE, /* OUT maximum packet size */ \
- NULL, /* IN Endpoint state */ \
- NULL, /* OUT endpoint state */ \
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
- }, \
- .int_ep_config = \
- { \
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
- NULL, /* SETUP packet notification callback */ \
- qmkusbInterruptTransmitted, /* IN notification callback */ \
- NULL, /* OUT notification callback */ \
- CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
- 0, /* OUT maximum packet size */ \
- NULL, /* IN Endpoint state */ \
- NULL, /* OUT endpoint state */ \
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
- }, \
- .config = { \
- .usbp = &USB_DRIVER, \
- .bulk_in = stream##_IN_EPNUM, \
- .bulk_out = stream##_OUT_EPNUM, \
- .int_in = notification, \
- .in_buffers = stream##_IN_CAPACITY, \
- .out_buffers = stream##_OUT_CAPACITY, \
- .in_size = stream##_EPSIZE, \
- .out_size = stream##_EPSIZE, \
- .fixed_size = fixedsize, \
- .ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
- .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
- } \
- }
-#else
-/* Reusable initialization structure - see USBEndpointConfig comment at top of file */
-# define QMK_USB_DRIVER_CONFIG(stream, notification, fixedsize) \
- { \
- .queue_capacity_in = stream##_IN_CAPACITY, .queue_capacity_out = stream##_OUT_CAPACITY, \
- .in_ep_config = \
- { \
- stream##_IN_MODE, /* Interrupt EP */ \
- NULL, /* SETUP packet notification callback */ \
- qmkusbDataTransmitted, /* IN notification callback */ \
- NULL, /* OUT notification callback */ \
- stream##_EPSIZE, /* IN maximum packet size */ \
- 0, /* OUT maximum packet size */ \
- NULL, /* IN Endpoint state */ \
- NULL, /* OUT endpoint state */ \
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
- }, \
- .out_ep_config = \
- { \
- stream##_OUT_MODE, /* Interrupt EP */ \
- NULL, /* SETUP packet notification callback */ \
- NULL, /* IN notification callback */ \
- qmkusbDataReceived, /* OUT notification callback */ \
- 0, /* IN maximum packet size */ \
- stream##_EPSIZE, /* OUT maximum packet size */ \
- NULL, /* IN Endpoint state */ \
- NULL, /* OUT endpoint state */ \
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
- }, \
- .int_ep_config = \
- { \
- USB_EP_MODE_TYPE_INTR, /* Interrupt EP */ \
- NULL, /* SETUP packet notification callback */ \
- qmkusbInterruptTransmitted, /* IN notification callback */ \
- NULL, /* OUT notification callback */ \
- CDC_NOTIFICATION_EPSIZE, /* IN maximum packet size */ \
- 0, /* OUT maximum packet size */ \
- NULL, /* IN Endpoint state */ \
- NULL, /* OUT endpoint state */ \
- usb_lld_endpoint_fields /* USB driver specific endpoint fields */ \
- }, \
- .config = { \
- .usbp = &USB_DRIVER, \
- .bulk_in = stream##_IN_EPNUM, \
- .bulk_out = stream##_OUT_EPNUM, \
- .int_in = notification, \
- .in_buffers = stream##_IN_CAPACITY, \
- .out_buffers = stream##_OUT_CAPACITY, \
- .in_size = stream##_EPSIZE, \
- .out_size = stream##_EPSIZE, \
- .fixed_size = fixedsize, \
- .ib = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_IN_CAPACITY, stream##_EPSIZE)]){}, \
- .ob = (__attribute__((aligned(4))) uint8_t[BQ_BUFFER_SIZE(stream##_OUT_CAPACITY, stream##_EPSIZE)]){}, \
- } \
- }
-#endif
-
-typedef struct {
- union {
- struct {
-#ifdef RAW_ENABLE
- usb_driver_config_t raw_driver;
-#endif
-#ifdef MIDI_ENABLE
- usb_driver_config_t midi_driver;
-#endif
-#ifdef VIRTSER_ENABLE
- usb_driver_config_t serial_driver;
-#endif
- };
- usb_driver_config_t array[0];
- };
-} usb_driver_configs_t;
-
-static usb_driver_configs_t drivers = {
-#ifdef RAW_ENABLE
-# ifndef RAW_IN_CAPACITY
-# define RAW_IN_CAPACITY 4
-# endif
-# ifndef RAW_OUT_CAPACITY
-# define RAW_OUT_CAPACITY 4
-# endif
-# define RAW_IN_MODE USB_EP_MODE_TYPE_INTR
-# define RAW_OUT_MODE USB_EP_MODE_TYPE_INTR
- .raw_driver = QMK_USB_DRIVER_CONFIG(RAW, 0, false),
-#endif
-
-#ifdef MIDI_ENABLE
-# define MIDI_STREAM_IN_CAPACITY 4
-# define MIDI_STREAM_OUT_CAPACITY 4
-# define MIDI_STREAM_IN_MODE USB_EP_MODE_TYPE_BULK
-# define MIDI_STREAM_OUT_MODE USB_EP_MODE_TYPE_BULK
- .midi_driver = QMK_USB_DRIVER_CONFIG(MIDI_STREAM, 0, false),
-#endif
-
-#ifdef VIRTSER_ENABLE
-# define CDC_IN_CAPACITY 4
-# define CDC_OUT_CAPACITY 4
-# define CDC_IN_MODE USB_EP_MODE_TYPE_BULK
-# define CDC_OUT_MODE USB_EP_MODE_TYPE_BULK
- .serial_driver = QMK_USB_DRIVER_CONFIG(CDC, CDC_NOTIFICATION_EPNUM, false),
-#endif
-};
-
-#define NUM_USB_DRIVERS (sizeof(drivers) / sizeof(usb_driver_config_t))
-
/* ---------------------------------------------------------
* USB driver functions
* ---------------------------------------------------------
@@ -507,36 +184,11 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
case USB_EVENT_CONFIGURED:
osalSysLockFromISR();
- /* Enable the endpoints specified into the configuration. */
-#ifndef KEYBOARD_SHARED_EP
- usbInitEndpointI(usbp, KEYBOARD_IN_EPNUM, &kbd_ep_config);
-#endif
-#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
- usbInitEndpointI(usbp, MOUSE_IN_EPNUM, &mouse_ep_config);
-#endif
-#ifdef SHARED_EP_ENABLE
- usbInitEndpointI(usbp, SHARED_IN_EPNUM, &shared_ep_config);
-#endif
-#if defined(JOYSTICK_ENABLE) && !defined(JOYSTICK_SHARED_EP)
- usbInitEndpointI(usbp, JOYSTICK_IN_EPNUM, &joystick_ep_config);
-#endif
-#if defined(DIGITIZER_ENABLE) && !defined(DIGITIZER_SHARED_EP)
- usbInitEndpointI(usbp, DIGITIZER_IN_EPNUM, &digitizer_ep_config);
-#endif
-#ifdef CONSOLE_ENABLE
- usbInitEndpointI(usbp, CONSOLE_IN_EPNUM, &console_ep_config);
-#endif
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
-#ifdef USB_ENDPOINTS_ARE_REORDERABLE
- usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].inout_ep_config);
-#else
- usbInitEndpointI(usbp, drivers.array[i].config.bulk_in, &drivers.array[i].in_ep_config);
- usbInitEndpointI(usbp, drivers.array[i].config.bulk_out, &drivers.array[i].out_ep_config);
-#endif
- if (drivers.array[i].config.int_in) {
- usbInitEndpointI(usbp, drivers.array[i].config.int_in, &drivers.array[i].int_ep_config);
- }
- qmkusbConfigureHookI(&drivers.array[i].driver);
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_configure_cb(&usb_endpoints_in[i]);
+ }
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_configure_cb(&usb_endpoints_out[i]);
}
osalSysUnlockFromISR();
if (last_suspend_state) {
@@ -550,22 +202,25 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
/* Falls into.*/
case USB_EVENT_RESET:
usb_event_queue_enqueue(event);
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
- chSysLockFromISR();
- /* Disconnection event on suspend.*/
- qmkusbSuspendHookI(&drivers.array[i].driver);
- chSysUnlockFromISR();
+ chSysLockFromISR();
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_suspend_cb(&usb_endpoints_in[i]);
}
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_suspend_cb(&usb_endpoints_out[i]);
+ }
+ chSysUnlockFromISR();
return;
case USB_EVENT_WAKEUP:
- // TODO: from ISR! print("[W]");
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
- chSysLockFromISR();
- /* Disconnection event on suspend.*/
- qmkusbWakeupHookI(&drivers.array[i].driver);
- chSysUnlockFromISR();
+ chSysLockFromISR();
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_wakeup_cb(&usb_endpoints_in[i]);
+ }
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_wakeup_cb(&usb_endpoints_out[i]);
}
+ chSysUnlockFromISR();
usb_event_queue_enqueue(USB_EVENT_WAKEUP);
return;
@@ -587,7 +242,7 @@ static void usb_event_cb(USBDriver *usbp, usbevent_t event) {
* Other Device Required Optional Optional Optional Optional Optional
*/
-static uint8_t set_report_buf[2] __attribute__((aligned(4)));
+static uint8_t _Alignas(4) set_report_buf[2];
static void set_led_transfer_cb(USBDriver *usbp) {
usb_control_request_t *setup = (usb_control_request_t *)usbp->setup;
@@ -611,41 +266,7 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
case USB_RTYPE_DIR_DEV2HOST:
switch (setup->bRequest) {
case HID_REQ_GetReport:
- switch (setup->wIndex) {
-#ifndef KEYBOARD_SHARED_EP
- case KEYBOARD_INTERFACE:
- usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, KEYBOARD_REPORT_SIZE, NULL);
- return TRUE;
- break;
-#endif
-#if defined(MOUSE_ENABLE) && !defined(MOUSE_SHARED_EP)
- case MOUSE_INTERFACE:
- usbSetupTransfer(usbp, (uint8_t *)&mouse_report_sent, sizeof(mouse_report_sent), NULL);
- return TRUE;
- break;
-#endif
-#ifdef SHARED_EP_ENABLE
- case SHARED_INTERFACE:
-# ifdef KEYBOARD_SHARED_EP
- if (setup->wValue.lbyte == REPORT_ID_KEYBOARD) {
- usbSetupTransfer(usbp, (uint8_t *)&keyboard_report_sent, KEYBOARD_REPORT_SIZE, NULL);
- return true;
- }
-# endif
-# ifdef MOUSE_SHARED_EP
- if (setup->wValue.lbyte == REPORT_ID_MOUSE) {
- usbSetupTransfer(usbp, (uint8_t *)&mouse_report_sent, sizeof(mouse_report_sent), NULL);
- return true;
- }
-# endif
-#endif /* SHARED_EP_ENABLE */
- default:
- universal_report_blank.report_id = setup->wValue.lbyte;
- usbSetupTransfer(usbp, (uint8_t *)&universal_report_blank, setup->wLength, NULL);
- return true;
- }
- break;
-
+ return usb_get_report_cb(usbp);
case HID_REQ_GetProtocol:
if (setup->wIndex == KEYBOARD_INTERFACE) {
usbSetupTransfer(usbp, &keyboard_protocol, sizeof(uint8_t), NULL);
@@ -654,10 +275,8 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
break;
case HID_REQ_GetIdle:
- usbSetupTransfer(usbp, &keyboard_idle, sizeof(uint8_t), NULL);
- return true;
+ return usb_get_idle_cb(usbp);
}
- break;
case USB_RTYPE_DIR_HOST2DEV:
switch (setup->bRequest) {
@@ -671,38 +290,15 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
return true;
}
break;
-
case HID_REQ_SetProtocol:
if (setup->wIndex == KEYBOARD_INTERFACE) {
keyboard_protocol = setup->wValue.word;
-#ifdef NKRO_ENABLE
- if (!keyboard_protocol && keyboard_idle) {
-#else /* NKRO_ENABLE */
- if (keyboard_idle) {
-#endif /* NKRO_ENABLE */
- /* arm the idle timer if boot protocol & idle */
- osalSysLockFromISR();
- chVTSetI(&keyboard_idle_timer, 4 * TIME_MS2I(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp);
- osalSysUnlockFromISR();
- }
}
usbSetupTransfer(usbp, NULL, 0, NULL);
return true;
-
case HID_REQ_SetIdle:
keyboard_idle = setup->wValue.hbyte;
- /* arm the timer */
-#ifdef NKRO_ENABLE
- if (!keymap_config.nkro && keyboard_idle) {
-#else /* NKRO_ENABLE */
- if (keyboard_idle) {
-#endif /* NKRO_ENABLE */
- osalSysLockFromISR();
- chVTSetI(&keyboard_idle_timer, 4 * TIME_MS2I(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp);
- osalSysUnlockFromISR();
- }
- usbSetupTransfer(usbp, NULL, 0, NULL);
- return true;
+ return usb_set_idle_cb(usbp);
}
break;
}
@@ -719,52 +315,40 @@ static bool usb_requests_hook_cb(USBDriver *usbp) {
return true;
}
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
- if (drivers.array[i].config.int_in) {
- // NOTE: Assumes that we only have one serial driver
- return qmkusbRequestsHook(usbp);
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ if (usb_endpoints_in[i].usb_requests_cb != NULL) {
+ if (usb_endpoints_in[i].usb_requests_cb(usbp)) {
+ return true;
+ }
}
}
return false;
}
-static void usb_sof_cb(USBDriver *usbp) {
- osalSysLockFromISR();
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
- qmkusbSOFHookI(&drivers.array[i].driver);
- }
- osalSysUnlockFromISR();
+static __attribute__((unused)) void dummy_cb(USBDriver *usbp) {
+ (void)usbp;
}
-/* USB driver configuration */
static const USBConfig usbcfg = {
usb_event_cb, /* USB events callback */
usb_get_descriptor_cb, /* Device GET_DESCRIPTOR request callback */
usb_requests_hook_cb, /* Requests hook callback */
- usb_sof_cb /* Start Of Frame callback */
+#if STM32_USB_USE_OTG1 == TRUE || STM32_USB_USE_OTG2 == TRUE
+ dummy_cb, /* Workaround for OTG Peripherals not servicing new interrupts
+ after resuming from suspend. */
+#endif
};
-/*
- * Initialize the USB driver
- */
void init_usb_driver(USBDriver *usbp) {
- for (int i = 0; i < NUM_USB_DRIVERS; i++) {
-#ifdef USB_ENDPOINTS_ARE_REORDERABLE
- QMKUSBDriver *driver = &drivers.array[i].driver;
- drivers.array[i].inout_ep_config.in_state = &drivers.array[i].in_ep_state;
- drivers.array[i].inout_ep_config.out_state = &drivers.array[i].out_ep_state;
- drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state;
- qmkusbObjectInit(driver, &drivers.array[i].config);
- qmkusbStart(driver, &drivers.array[i].config);
-#else
- QMKUSBDriver *driver = &drivers.array[i].driver;
- drivers.array[i].in_ep_config.in_state = &drivers.array[i].in_ep_state;
- drivers.array[i].out_ep_config.out_state = &drivers.array[i].out_ep_state;
- drivers.array[i].int_ep_config.in_state = &drivers.array[i].int_ep_state;
- qmkusbObjectInit(driver, &drivers.array[i].config);
- qmkusbStart(driver, &drivers.array[i].config);
-#endif
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_init(&usb_endpoints_in[i]);
+ usb_endpoint_in_start(&usb_endpoints_in[i]);
+ }
+
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_init(&usb_endpoints_out[i]);
+ usb_endpoint_out_start(&usb_endpoints_out[i]);
}
/*
@@ -777,23 +361,31 @@ void init_usb_driver(USBDriver *usbp) {
wait_ms(50);
usbStart(usbp, &usbcfg);
usbConnectBus(usbp);
-
- chVTObjectInit(&keyboard_idle_timer);
}
__attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
usbDisconnectBus(usbp);
usbStop(usbp);
-#if USB_SUSPEND_WAKEUP_DELAY > 0
- // Some hubs, kvm switches, and monitors do
- // weird things, with USB device state bouncing
- // around wildly on wakeup, yielding race
- // conditions that can corrupt the keyboard state.
- //
- // Pause for a while to let things settle...
- wait_ms(USB_SUSPEND_WAKEUP_DELAY);
-#endif
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_stop(&usb_endpoints_in[i]);
+ }
+
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_stop(&usb_endpoints_out[i]);
+ }
+
+ wait_ms(50);
+
+ for (int i = 0; i < USB_ENDPOINT_IN_COUNT; i++) {
+ usb_endpoint_in_init(&usb_endpoints_in[i]);
+ usb_endpoint_in_start(&usb_endpoints_in[i]);
+ }
+
+ for (int i = 0; i < USB_ENDPOINT_OUT_COUNT; i++) {
+ usb_endpoint_out_init(&usb_endpoints_out[i]);
+ usb_endpoint_out_start(&usb_endpoints_out[i]);
+ }
usbStart(usbp, &usbcfg);
usbConnectBus(usbp);
@@ -804,81 +396,78 @@ __attribute__((weak)) void restart_usb_driver(USBDriver *usbp) {
* ---------------------------------------------------------
*/
-/* Idle requests timer code
- * callback (called from ISR, unlocked state) */
-static void keyboard_idle_timer_cb(struct ch_virtual_timer *timer, void *arg) {
- (void)timer;
- USBDriver *usbp = (USBDriver *)arg;
-
- osalSysLockFromISR();
-
- /* check that the states of things are as they're supposed to */
- if (usbGetDriverStateI(usbp) != USB_ACTIVE) {
- /* do not rearm the timer, should be enabled on IDLE request */
- osalSysUnlockFromISR();
- return;
- }
-
-#ifdef NKRO_ENABLE
- if (!keymap_config.nkro && keyboard_idle && keyboard_protocol) {
-#else /* NKRO_ENABLE */
- if (keyboard_idle && keyboard_protocol) {
-#endif /* NKRO_ENABLE */
- /* TODO: are we sure we want the KBD_ENDPOINT? */
- if (!usbGetTransmitStatusI(usbp, KEYBOARD_IN_EPNUM)) {
- usbStartTransmitI(usbp, KEYBOARD_IN_EPNUM, (uint8_t *)&keyboard_report_sent, KEYBOARD_EPSIZE);
- }
- /* rearm the timer */
- chVTSetI(&keyboard_idle_timer, 4 * TIME_MS2I(keyboard_idle), keyboard_idle_timer_cb, (void *)usbp);
- }
-
- /* do not rearm the timer if the condition above fails
- * it should be enabled again on either IDLE or SET_PROTOCOL requests */
- osalSysUnlockFromISR();
-}
-
/* LED status */
uint8_t keyboard_leds(void) {
return keyboard_led_state;
}
-void send_report(uint8_t endpoint, void *report, size_t size) {
- osalSysLock();
- if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
- osalSysUnlock();
- return;
- }
+/**
+ * @brief Send a report to the host, the report is enqueued into an output
+ * queue and send once the USB endpoint becomes empty.
+ *
+ * @param endpoint USB IN endpoint to send the report from
+ * @param report pointer to the report
+ * @param size size of the report
+ * @return true Success
+ * @return false Failure
+ */
+bool send_report(usb_endpoint_in_lut_t endpoint, void *report, size_t size) {
+ return usb_endpoint_in_send(&usb_endpoints_in[endpoint], (uint8_t *)report, size, TIME_MS2I(100), false);
+}
- if (usbGetTransmitStatusI(&USB_DRIVER, endpoint)) {
- /* Need to either suspend, or loop and call unlock/lock during
- * every iteration - otherwise the system will remain locked,
- * no interrupts served, so USB not going through as well.
- * Note: for suspend, need USB_USE_WAIT == TRUE in halconf.h */
- if (osalThreadSuspendTimeoutS(&(&USB_DRIVER)->epc[endpoint]->in_state->thread, TIME_MS2I(10)) == MSG_TIMEOUT) {
- osalSysUnlock();
- return;
- }
- }
- usbStartTransmitI(&USB_DRIVER, endpoint, report, size);
- osalSysUnlock();
+/**
+ * @brief Send a report to the host, but delay the sending until the size of
+ * endpoint report is reached or the incompletely filled buffer is flushed with
+ * a call to `flush_report_buffered`. This is useful if the report is being
+ * updated frequently. The complete report is then enqueued into an output
+ * queue and send once the USB endpoint becomes empty.
+ *
+ * @param endpoint USB IN endpoint to send the report from
+ * @param report pointer to the report
+ * @param size size of the report
+ * @return true Success
+ * @return false Failure
+ */
+static bool send_report_buffered(usb_endpoint_in_lut_t endpoint, void *report, size_t size) {
+ return usb_endpoint_in_send(&usb_endpoints_in[endpoint], (uint8_t *)report, size, TIME_MS2I(100), true);
+}
+
+/** @brief Flush all buffered reports which were enqueued with a call to
+ * `send_report_buffered` that haven't been send. If necessary the buffered
+ * report can be padded with zeros up to the endpoints maximum size.
+ *
+ * @param endpoint USB IN endpoint to flush the reports from
+ * @param padded Pad the buffered report with zeros up to the endpoints maximum size
+ */
+static void flush_report_buffered(usb_endpoint_in_lut_t endpoint, bool padded) {
+ usb_endpoint_in_flush(&usb_endpoints_in[endpoint], padded);
+}
+
+/**
+ * @brief Receive a report from the host.
+ *
+ * @param endpoint USB OUT endpoint to receive the report from
+ * @param report pointer to the report
+ * @param size size of the report
+ * @return true Success
+ * @return false Failure
+ */
+static bool receive_report(usb_endpoint_out_lut_t endpoint, void *report, size_t size) {
+ return usb_endpoint_out_receive(&usb_endpoints_out[endpoint], (uint8_t *)report, size, TIME_IMMEDIATE);
}
-/* prepare and start sending a report IN
- * not callable from ISR or locked state */
void send_keyboard(report_keyboard_t *report) {
/* If we're in Boot Protocol, don't send any report ID or other funky fields */
if (!keyboard_protocol) {
- send_report(KEYBOARD_IN_EPNUM, &report->mods, 8);
+ send_report(USB_ENDPOINT_IN_KEYBOARD, &report->mods, 8);
} else {
- send_report(KEYBOARD_IN_EPNUM, report, KEYBOARD_REPORT_SIZE);
+ send_report(USB_ENDPOINT_IN_KEYBOARD, report, KEYBOARD_REPORT_SIZE);
}
-
- keyboard_report_sent = *report;
}
void send_nkro(report_nkro_t *report) {
#ifdef NKRO_ENABLE
- send_report(SHARED_IN_EPNUM, report, sizeof(report_nkro_t));
+ send_report(USB_ENDPOINT_IN_SHARED, report, sizeof(report_nkro_t));
#endif
}
@@ -889,8 +478,7 @@ void send_nkro(report_nkro_t *report) {
void send_mouse(report_mouse_t *report) {
#ifdef MOUSE_ENABLE
- send_report(MOUSE_IN_EPNUM, report, sizeof(report_mouse_t));
- mouse_report_sent = *report;
+ send_report(USB_ENDPOINT_IN_MOUSE, report, sizeof(report_mouse_t));
#endif
}
@@ -901,25 +489,25 @@ void send_mouse(report_mouse_t *report) {
void send_extra(report_extra_t *report) {
#ifdef EXTRAKEY_ENABLE
- send_report(SHARED_IN_EPNUM, report, sizeof(report_extra_t));
+ send_report(USB_ENDPOINT_IN_SHARED, report, sizeof(report_extra_t));
#endif
}
void send_programmable_button(report_programmable_button_t *report) {
#ifdef PROGRAMMABLE_BUTTON_ENABLE
- send_report(SHARED_IN_EPNUM, report, sizeof(report_programmable_button_t));
+ send_report(USB_ENDPOINT_IN_SHARED, report, sizeof(report_programmable_button_t));
#endif
}
void send_joystick(report_joystick_t *report) {
#ifdef JOYSTICK_ENABLE
- send_report(JOYSTICK_IN_EPNUM, report, sizeof(report_joystick_t));
+ send_report(USB_ENDPOINT_IN_JOYSTICK, report, sizeof(report_joystick_t));
#endif
}
void send_digitizer(report_digitizer_t *report) {
#ifdef DIGITIZER_ENABLE
- send_report(DIGITIZER_IN_EPNUM, report, sizeof(report_digitizer_t));
+ send_report(USB_ENDPOINT_IN_DIGITIZER, report, sizeof(report_digitizer_t));
#endif
}
@@ -931,46 +519,21 @@ void send_digitizer(report_digitizer_t *report) {
#ifdef CONSOLE_ENABLE
int8_t sendchar(uint8_t c) {
- rbuf_enqueue(c);
- return 0;
+ return (int8_t)send_report_buffered(USB_ENDPOINT_IN_CONSOLE, &c, sizeof(uint8_t));
}
void console_task(void) {
- if (!rbuf_has_data()) {
- return;
- }
-
- osalSysLock();
- if (usbGetDriverStateI(&USB_DRIVER) != USB_ACTIVE) {
- osalSysUnlock();
- return;
- }
-
- if (usbGetTransmitStatusI(&USB_DRIVER, CONSOLE_IN_EPNUM)) {
- osalSysUnlock();
- return;
- }
-
- // Send in chunks - padded with zeros to 32
- char send_buf[CONSOLE_EPSIZE] = {0};
- uint8_t send_buf_count = 0;
- while (rbuf_has_data() && send_buf_count < CONSOLE_EPSIZE) {
- send_buf[send_buf_count++] = rbuf_dequeue();
- }
-
- usbStartTransmitI(&USB_DRIVER, CONSOLE_IN_EPNUM, (const uint8_t *)send_buf, CONSOLE_EPSIZE);
- osalSysUnlock();
+ flush_report_buffered(USB_ENDPOINT_IN_CONSOLE, true);
}
#endif /* CONSOLE_ENABLE */
#ifdef RAW_ENABLE
void raw_hid_send(uint8_t *data, uint8_t length) {
- // TODO: implement variable size packet
if (length != RAW_EPSIZE) {
return;
}
- chnWrite(&drivers.raw_driver.driver, data, length);
+ send_report(USB_ENDPOINT_IN_RAW, data, length);
}
__attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) {
@@ -981,13 +544,9 @@ __attribute__((weak)) void raw_hid_receive(uint8_t *data, uint8_t length) {
void raw_hid_task(void) {
uint8_t buffer[RAW_EPSIZE];
- size_t size = 0;
- do {
- size = chnReadTimeout(&drivers.raw_driver.driver, buffer, sizeof(buffer), TIME_IMMEDIATE);
- if (size > 0) {
- raw_hid_receive(buffer, size);
- }
- } while (size > 0);
+ while (receive_report(USB_ENDPOINT_OUT_RAW, buffer, sizeof(buffer))) {
+ raw_hid_receive(buffer, sizeof(buffer));
+ }
}
#endif
@@ -995,32 +554,59 @@ void raw_hid_task(void) {
#ifdef MIDI_ENABLE
void send_midi_packet(MIDI_EventPacket_t *event) {
- chnWrite(&drivers.midi_driver.driver, (uint8_t *)event, sizeof(MIDI_EventPacket_t));
+ send_report(USB_ENDPOINT_IN_MIDI, (uint8_t *)event, sizeof(MIDI_EventPacket_t));
}
bool recv_midi_packet(MIDI_EventPacket_t *const event) {
- size_t size = chnReadTimeout(&drivers.midi_driver.driver, (uint8_t *)event, sizeof(MIDI_EventPacket_t), TIME_IMMEDIATE);
- return size == sizeof(MIDI_EventPacket_t);
+ return receive_report(USB_ENDPOINT_OUT_MIDI, (uint8_t *)event, sizeof(MIDI_EventPacket_t));
}
+
void midi_ep_task(void) {
uint8_t buffer[MIDI_STREAM_EPSIZE];
- size_t size = 0;
- do {
- size = chnReadTimeout(&drivers.midi_driver.driver, buffer, sizeof(buffer), TIME_IMMEDIATE);
- if (size > 0) {
- MIDI_EventPacket_t event;
- recv_midi_packet(&event);
- }
- } while (size > 0);
+ while (receive_report(USB_ENDPOINT_OUT_MIDI, buffer, sizeof(buffer))) {
+ MIDI_EventPacket_t event;
+ // TODO: this seems totally wrong? The midi task will never see any
+ // packets if we consume them here
+ recv_midi_packet(&event);
+ }
}
#endif
#ifdef VIRTSER_ENABLE
+# include "hal_usb_cdc.h"
+/**
+ * @brief CDC serial driver configuration structure. Set to 9600 baud, 1 stop bit, no parity, 8 data bits.
+ */
+static cdc_linecoding_t linecoding = {{0x00, 0x96, 0x00, 0x00}, LC_STOP_1, LC_PARITY_NONE, 8};
+
+bool virtser_usb_request_cb(USBDriver *usbp) {
+ if ((usbp->setup[0] & USB_RTYPE_TYPE_MASK) == USB_RTYPE_TYPE_CLASS) { /* bmRequestType */
+ if (usbp->setup[4] == CCI_INTERFACE) { /* wIndex (LSB) */
+ switch (usbp->setup[1]) { /* bRequest */
+ case CDC_GET_LINE_CODING:
+ usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL);
+ return true;
+ case CDC_SET_LINE_CODING:
+ usbSetupTransfer(usbp, (uint8_t *)&linecoding, sizeof(linecoding), NULL);
+ return true;
+ case CDC_SET_CONTROL_LINE_STATE:
+ /* Nothing to do, there are no control lines.*/
+ usbSetupTransfer(usbp, NULL, 0, NULL);
+ return true;
+ default:
+ return false;
+ }
+ }
+ }
+
+ return false;
+}
+
void virtser_init(void) {}
void virtser_send(const uint8_t byte) {
- chnWrite(&drivers.serial_driver.driver, &byte, 1);
+ send_report_buffered(USB_ENDPOINT_IN_CDC_DATA, (void *)&byte, sizeof(byte));
}
__attribute__((weak)) void virtser_recv(uint8_t c) {
@@ -1028,14 +614,14 @@ __attribute__((weak)) void virtser_recv(uint8_t c) {
}
void virtser_task(void) {
- uint8_t numBytesReceived = 0;
- uint8_t buffer[16];
- do {
- numBytesReceived = chnReadTimeout(&drivers.serial_driver.driver, buffer, sizeof(buffer), TIME_IMMEDIATE);
- for (int i = 0; i < numBytesReceived; i++) {
+ uint8_t buffer[CDC_EPSIZE];
+ while (receive_report(USB_ENDPOINT_OUT_CDC_DATA, buffer, sizeof(buffer))) {
+ for (int i = 0; i < sizeof(buffer); i++) {
virtser_recv(buffer[i]);
}
- } while (numBytesReceived > 0);
+ }
+
+ flush_report_buffered(USB_ENDPOINT_IN_CDC_DATA, false);
}
#endif
diff --git a/tmk_core/protocol/chibios/usb_main.h b/tmk_core/protocol/chibios/usb_main.h
index 3fd1e84fe8..5ba6fb1961 100644
--- a/tmk_core/protocol/chibios/usb_main.h
+++ b/tmk_core/protocol/chibios/usb_main.h
@@ -1,25 +1,21 @@
-/*
- * (c) 2015 flabberast <[email protected]>
- *
- * Based on the following work:
- * - Guillaume Duc's raw hid example (MIT License)
- * https://github.com/guiduc/usb-hid-chibios-example
- * - PJRC Teensy examples (MIT License)
- * https://www.pjrc.com/teensy/usb_keyboard.html
- * - hasu's TMK keyboard code (GPL v2 and some code Modified BSD)
- * https://github.com/tmk/tmk_keyboard/
- * - ChibiOS demo code (Apache 2.0 License)
- * http://www.chibios.org
- *
- * Since some GPL'd code is used, this work is licensed under
- * GPL v2 or later.
- */
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// Copyright 2020 Ryan (@fauxpark)
+// Copyright 2020 Joel Challis (@zvecr)
+// Copyright 2018 James Laird-Wah
+// Copyright 2016 Fredizzimo
+// Copyright 2016 Giovanni Di Sirio
+// SPDX-License-Identifier: GPL-3.0-or-later OR Apache-2.0
#pragma once
#include <ch.h>
#include <hal.h>
+#include "usb_device_state.h"
+#include "usb_descriptor.h"
+#include "usb_driver.h"
+#include "usb_endpoints.h"
+
/* -------------------------
* General USB driver header
* -------------------------
@@ -36,6 +32,8 @@ void init_usb_driver(USBDriver *usbp);
/* Restart the USB driver and bus */
void restart_usb_driver(USBDriver *usbp);
+bool send_report(usb_endpoint_in_lut_t endpoint, void *report, size_t size);
+
/* ---------------
* USB Event queue
* ---------------
@@ -58,3 +56,14 @@ void usb_event_queue_task(void);
int8_t sendchar(uint8_t c);
#endif /* CONSOLE_ENABLE */
+
+/* --------------
+ * Virtser header
+ * --------------
+ */
+
+#if defined(VIRTSER_ENABLE)
+
+bool virtser_usb_request_cb(USBDriver *usbp);
+
+#endif
diff --git a/tmk_core/protocol/chibios/usb_report_handling.c b/tmk_core/protocol/chibios/usb_report_handling.c
new file mode 100644
index 0000000000..64074b2164
--- /dev/null
+++ b/tmk_core/protocol/chibios/usb_report_handling.c
@@ -0,0 +1,296 @@
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#include <string.h>
+#include <stdint.h>
+#include <stdbool.h>
+
+#include "usb_report_handling.h"
+#include "usb_endpoints.h"
+#include "usb_main.h"
+#include "usb_types.h"
+#include "usb_driver.h"
+#include "report.h"
+
+extern usb_endpoint_in_t usb_endpoints_in[USB_ENDPOINT_IN_COUNT];
+extern usb_endpoint_in_lut_t usb_endpoint_interface_lut[TOTAL_INTERFACES];
+
+void usb_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length) {
+ if (*reports == NULL) {
+ return;
+ }
+
+ (*reports)->last_report = chVTGetSystemTimeX();
+ (*reports)->length = length;
+ memcpy(&(*reports)->data, data, length);
+}
+
+void usb_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report) {
+ (void)report_id;
+ if (*reports == NULL) {
+ return;
+ }
+
+ report->length = (*reports)->length;
+ memcpy(&report->data, &(*reports)->data, report->length);
+}
+
+void usb_reset_report(usb_fs_report_t **reports) {
+ if (*reports == NULL) {
+ return;
+ }
+
+ memset(&(*reports)->data, 0, (*reports)->length);
+ (*reports)->idle_rate = 0;
+ (*reports)->last_report = 0;
+}
+
+void usb_shared_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length) {
+ uint8_t report_id = data[0];
+
+ if (report_id > REPORT_ID_COUNT || reports[report_id] == NULL) {
+ return;
+ }
+
+ reports[report_id]->last_report = chVTGetSystemTimeX();
+ reports[report_id]->length = length;
+ memcpy(&reports[report_id]->data, data, length);
+}
+
+void usb_shared_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report) {
+ if (report_id > REPORT_ID_COUNT || reports[report_id] == NULL) {
+ return;
+ }
+
+ report->length = reports[report_id]->length;
+ memcpy(&report->data, &reports[report_id]->data, report->length);
+}
+
+void usb_shared_reset_report(usb_fs_report_t **reports) {
+ for (int i = 0; i <= REPORT_ID_COUNT; i++) {
+ if (reports[i] == NULL) {
+ continue;
+ }
+ memset(&reports[i]->data, 0, reports[i]->length);
+ reports[i]->idle_rate = 0;
+ reports[i]->last_report = 0;
+ }
+}
+
+bool usb_get_report_cb(USBDriver *driver) {
+ usb_control_request_t *setup = (usb_control_request_t *)driver->setup;
+ uint8_t interface = setup->wIndex;
+ uint8_t report_id = setup->wValue.lbyte;
+
+ static usb_fs_report_t report;
+
+ if (!IS_VALID_INTERFACE(interface) || !IS_VALID_REPORT_ID(report_id)) {
+ return false;
+ }
+
+ usb_endpoint_in_lut_t ep = usb_endpoint_interface_lut[interface];
+
+ if (!IS_VALID_USB_ENDPOINT_IN_LUT(ep)) {
+ return false;
+ }
+
+ usb_report_storage_t *report_storage = usb_endpoints_in[ep].report_storage;
+
+ if (report_storage == NULL) {
+ return false;
+ }
+
+ report_storage->get_report(report_storage->reports, report_id, &report);
+
+ usbSetupTransfer(driver, (uint8_t *)report.data, report.length, NULL);
+
+ return true;
+}
+
+static bool run_idle_task = false;
+
+void usb_set_idle_rate(usb_fs_report_t **reports, uint8_t report_id, uint8_t idle_rate) {
+ (void)report_id;
+
+ if (*reports == NULL) {
+ return;
+ }
+
+ (*reports)->idle_rate = idle_rate * 4;
+
+ run_idle_task |= idle_rate != 0;
+}
+
+uint8_t usb_get_idle_rate(usb_fs_report_t **reports, uint8_t report_id) {
+ (void)report_id;
+
+ if (*reports == NULL) {
+ return 0;
+ }
+
+ return (*reports)->idle_rate / 4;
+}
+
+bool usb_idle_timer_elapsed(usb_fs_report_t **reports, uint8_t report_id) {
+ (void)report_id;
+
+ if (*reports == NULL) {
+ return false;
+ }
+
+ osalSysLock();
+ time_msecs_t idle_rate = (*reports)->idle_rate;
+ systime_t last_report = (*reports)->last_report;
+ osalSysUnlock();
+
+ if (idle_rate == 0) {
+ return false;
+ }
+
+ return chTimeI2MS(chVTTimeElapsedSinceX(last_report)) >= idle_rate;
+}
+
+void usb_shared_set_idle_rate(usb_fs_report_t **reports, uint8_t report_id, uint8_t idle_rate) {
+ // USB spec demands that a report_id of 0 would set the idle rate for all
+ // reports of that endpoint, but this can easily lead to resource
+ // exhaustion, therefore we deliberalty break the spec at this point.
+ if (report_id == 0 || report_id > REPORT_ID_COUNT || reports[report_id] == NULL) {
+ return;
+ }
+
+ reports[report_id]->idle_rate = idle_rate * 4;
+
+ run_idle_task |= idle_rate != 0;
+}
+
+uint8_t usb_shared_get_idle_rate(usb_fs_report_t **reports, uint8_t report_id) {
+ if (report_id > REPORT_ID_COUNT || reports[report_id] == NULL) {
+ return 0;
+ }
+
+ return reports[report_id]->idle_rate / 4;
+}
+
+bool usb_shared_idle_timer_elapsed(usb_fs_report_t **reports, uint8_t report_id) {
+ if (report_id > REPORT_ID_COUNT || reports[report_id] == NULL) {
+ return false;
+ }
+
+ osalSysLock();
+ time_msecs_t idle_rate = reports[report_id]->idle_rate;
+ systime_t last_report = reports[report_id]->last_report;
+ osalSysUnlock();
+
+ if (idle_rate == 0) {
+ return false;
+ }
+
+ return chTimeI2MS(chVTTimeElapsedSinceX(last_report)) >= idle_rate;
+}
+
+void usb_idle_task(void) {
+ if (!run_idle_task) {
+ return;
+ }
+
+ static usb_fs_report_t report;
+ bool non_zero_idle_rate_found = false;
+
+ for (int ep = 0; ep < USB_ENDPOINT_IN_COUNT; ep++) {
+ usb_report_storage_t *report_storage = usb_endpoints_in[ep].report_storage;
+
+ if (report_storage == NULL) {
+ continue;
+ }
+
+#if defined(SHARED_EP_ENABLE)
+ if (ep == USB_ENDPOINT_IN_SHARED) {
+ for (int report_id = 1; report_id <= REPORT_ID_COUNT; report_id++) {
+ osalSysLock();
+ non_zero_idle_rate_found |= report_storage->get_idle(report_storage->reports, report_id) != 0;
+ osalSysUnlock();
+
+ if (usb_endpoint_in_is_inactive(&usb_endpoints_in[ep]) && report_storage->idle_timer_elasped(report_storage->reports, report_id)) {
+ osalSysLock();
+ report_storage->get_report(report_storage->reports, report_id, &report);
+ osalSysUnlock();
+ send_report(ep, &report.data, report.length);
+ }
+ }
+ continue;
+ }
+#endif
+
+ osalSysLock();
+ non_zero_idle_rate_found |= report_storage->get_idle(report_storage->reports, 0) != 0;
+ osalSysUnlock();
+
+ if (usb_endpoint_in_is_inactive(&usb_endpoints_in[ep]) && report_storage->idle_timer_elasped(report_storage->reports, 0)) {
+ osalSysLock();
+ report_storage->get_report(report_storage->reports, 0, &report);
+ osalSysUnlock();
+ send_report(ep, &report.data, report.length);
+ }
+ }
+
+ run_idle_task = non_zero_idle_rate_found;
+}
+
+bool usb_get_idle_cb(USBDriver *driver) {
+ usb_control_request_t *setup = (usb_control_request_t *)driver->setup;
+ uint8_t interface = setup->wIndex;
+ uint8_t report_id = setup->wValue.lbyte;
+
+ static uint8_t _Alignas(4) idle_rate;
+
+ if (!IS_VALID_INTERFACE(interface) || !IS_VALID_REPORT_ID(report_id)) {
+ return false;
+ }
+
+ usb_endpoint_in_lut_t ep = usb_endpoint_interface_lut[interface];
+
+ if (!IS_VALID_USB_ENDPOINT_IN_LUT(ep)) {
+ return false;
+ }
+
+ usb_report_storage_t *report_storage = usb_endpoints_in[ep].report_storage;
+
+ if (report_storage == NULL) {
+ return false;
+ }
+
+ idle_rate = report_storage->get_idle(report_storage->reports, report_id);
+
+ usbSetupTransfer(driver, &idle_rate, 1, NULL);
+
+ return true;
+}
+
+bool usb_set_idle_cb(USBDriver *driver) {
+ usb_control_request_t *setup = (usb_control_request_t *)driver->setup;
+ uint8_t interface = setup->wIndex;
+ uint8_t report_id = setup->wValue.lbyte;
+ uint8_t idle_rate = setup->wValue.hbyte;
+
+ if (!IS_VALID_INTERFACE(interface) || !IS_VALID_REPORT_ID(report_id)) {
+ return false;
+ }
+
+ usb_endpoint_in_lut_t ep = usb_endpoint_interface_lut[interface];
+
+ if (!IS_VALID_USB_ENDPOINT_IN_LUT(ep)) {
+ return false;
+ }
+
+ usb_report_storage_t *report_storage = usb_endpoints_in[ep].report_storage;
+
+ if (report_storage == NULL) {
+ return false;
+ }
+
+ report_storage->set_idle(report_storage->reports, report_id, idle_rate);
+
+ usbSetupTransfer(driver, NULL, 0, NULL);
+
+ return true;
+}
diff --git a/tmk_core/protocol/chibios/usb_report_handling.h b/tmk_core/protocol/chibios/usb_report_handling.h
new file mode 100644
index 0000000000..18b4ce5e26
--- /dev/null
+++ b/tmk_core/protocol/chibios/usb_report_handling.h
@@ -0,0 +1,77 @@
+// Copyright 2023 Stefan Kerkmann (@KarlK90)
+// SPDX-License-Identifier: GPL-3.0-or-later
+
+#pragma once
+
+#include <ch.h>
+#include <hal.h>
+#include <stdint.h>
+
+#include "timer.h"
+
+typedef struct {
+ time_msecs_t idle_rate;
+ systime_t last_report;
+ uint8_t data[64];
+ size_t length;
+} usb_fs_report_t;
+
+typedef struct {
+ usb_fs_report_t **reports;
+ const void (*get_report)(usb_fs_report_t **, uint8_t, usb_fs_report_t *);
+ const void (*set_report)(usb_fs_report_t **, const uint8_t *, size_t);
+ const void (*reset_report)(usb_fs_report_t **);
+ const void (*set_idle)(usb_fs_report_t **, uint8_t, uint8_t);
+ const uint8_t (*get_idle)(usb_fs_report_t **, uint8_t);
+ const bool (*idle_timer_elasped)(usb_fs_report_t **, uint8_t);
+} usb_report_storage_t;
+
+#define QMK_USB_REPORT_STROAGE_ENTRY(_report_id, _report_size) [_report_id] = &((usb_fs_report_t){.data = {[0] = _report_id}, .length = _report_size})
+
+#define QMK_USB_REPORT_STORAGE(_get_report, _set_report, _reset_report, _get_idle, _set_idle, _idle_timer_elasped, _report_count, _reports...) \
+ &((usb_report_storage_t){ \
+ .reports = (_Alignas(4) usb_fs_report_t *[_report_count]){_reports}, \
+ .get_report = _get_report, \
+ .set_report = _set_report, \
+ .reset_report = _reset_report, \
+ .get_idle = _get_idle, \
+ .set_idle = _set_idle, \
+ .idle_timer_elasped = _idle_timer_elasped, \
+ })
+
+#define QMK_USB_REPORT_STORAGE_DEFAULT(_report_length) \
+ QMK_USB_REPORT_STORAGE(&usb_get_report, /* _get_report */ \
+ &usb_set_report, /* _set_report */ \
+ &usb_reset_report, /* _reset_report */ \
+ &usb_get_idle_rate, /* _get_idle */ \
+ &usb_set_idle_rate, /* _set_idle */ \
+ &usb_idle_timer_elapsed, /* _idle_timer_elasped */ \
+ 1, /* _report_count */ \
+ QMK_USB_REPORT_STROAGE_ENTRY(0, _report_length))
+
+// USB HID SET_REPORT and GET_REPORT handling functions
+void usb_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length);
+void usb_shared_set_report(usb_fs_report_t **reports, const uint8_t *data, size_t length);
+
+void usb_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report);
+void usb_shared_get_report(usb_fs_report_t **reports, uint8_t report_id, usb_fs_report_t *report);
+
+void usb_reset_report(usb_fs_report_t **reports);
+void usb_shared_reset_report(usb_fs_report_t **reports);
+
+bool usb_get_report_cb(USBDriver *driver);
+
+// USB HID SET_IDLE and GET_IDLE handling functions
+void usb_idle_task(void);
+
+void usb_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate);
+void usb_shared_set_idle_rate(usb_fs_report_t **timers, uint8_t report_id, uint8_t idle_rate);
+
+uint8_t usb_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id);
+uint8_t usb_shared_get_idle_rate(usb_fs_report_t **timers, uint8_t report_id);
+
+bool usb_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id);
+bool usb_shared_idle_timer_elapsed(usb_fs_report_t **timers, uint8_t report_id);
+
+bool usb_get_idle_cb(USBDriver *driver);
+bool usb_set_idle_cb(USBDriver *driver);
diff --git a/tmk_core/protocol/report.h b/tmk_core/protocol/report.h
index 47bc4f2f2b..0e4f6e9def 100644
--- a/tmk_core/protocol/report.h
+++ b/tmk_core/protocol/report.h
@@ -29,7 +29,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
// clang-format off
/* HID report IDs */
-enum hid_report_ids {
+enum hid_report_ids {
+ REPORT_ID_ALL = 0,
REPORT_ID_KEYBOARD = 1,
REPORT_ID_MOUSE,
REPORT_ID_SYSTEM,
@@ -37,9 +38,12 @@ enum hid_report_ids {
REPORT_ID_PROGRAMMABLE_BUTTON,
REPORT_ID_NKRO,
REPORT_ID_JOYSTICK,
- REPORT_ID_DIGITIZER
+ REPORT_ID_DIGITIZER,
+ REPORT_ID_COUNT = REPORT_ID_DIGITIZER
};
+#define IS_VALID_REPORT_ID(id) ((id) >= REPORT_ID_ALL && (id) <= REPORT_ID_COUNT)
+
/* Mouse buttons */
#define MOUSE_BTN_MASK(n) (1 << (n))
enum mouse_buttons {
diff --git a/tmk_core/protocol/usb_descriptor.h b/tmk_core/protocol/usb_descriptor.h
index 2469990f4d..ecfb022702 100644
--- a/tmk_core/protocol/usb_descriptor.h
+++ b/tmk_core/protocol/usb_descriptor.h
@@ -196,6 +196,8 @@ enum usb_interfaces {
TOTAL_INTERFACES
};
+#define IS_VALID_INTERFACE(i) ((i) >= 0 && (i) < TOTAL_INTERFACES)
+
#define NEXT_EPNUM __COUNTER__
/*