Compare commits

..
Author SHA1 Message Date
XenGi
7d715f0c56 Update readme.md 2022-08-03 23:51:27 +00:00
XenGi
65e818751e Update keyboards/t9/readme.md 2022-08-03 23:49:49 +00:00
XenGi
442afb29cb Update keyboards/t9/readme.md 2022-08-03 23:46:21 +00:00
Ricardo (XenGi) Band
80b09fb193
fix 0 key rgb matrix position 2022-08-03 23:05:51 +02:00
Ricardo (XenGi) Band
d098c4a7c6
fixed last bug 2022-08-03 22:33:44 +02:00
Ricardo (XenGi) Band
65227adf50
it compiles! 2022-08-03 22:03:40 +02:00
Ricardo (XenGi) Band
568af9584a
Merge branch 't9' of gitlab.com:tnine/qmk-firmware into t9 2022-08-03 21:45:46 +02:00
Ricardo (XenGi) Band
14bb93880b
foo 2022-08-03 21:43:44 +02:00
Ricardo (XenGi) Band
6e49eb3fca
dump local stuff 2022-08-03 21:43:44 +02:00
Ricardo (XenGi) Band
64e4b88d70
🚀 2022-08-03 21:43:44 +02:00
Ricardo (XenGi) Band
1ad9da29c7
Merge remote-tracking branch 'upstream/master' into t9 2022-08-03 20:42:27 +02:00
Stephen J Bush
df8a538489
Userspace: muppetjones (#1) (#13461)
* Userspace: muppetjones (#1)

Add and update lily58 to work with userspace
Add and update kyria keymap to work with userspace
Add and update planck keymap with userspace
Add etchamouse code and docs to userpace
Add userspace
Update mouse encoder for smoother movement.
Encoder + mouse
Added casemodes by andrewjrae

* Rollback lily58 state reader and add missing GPL

* Apply suggestions from code review

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>

* fix lily58 keymap

* Updates to user and lily for muppetjones.

Updated parameters for etchamouse for smoother mouse movement. Updated lily keymap and userspace to actually work together.

* Update keyboards/lily58/keymaps/muppetjones/config.h

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

* Updated keymaps and userspace

* Little more cleanup.

* Update keyboards/lily58/keymaps/muppetjones/rules.mk

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

* Rollback accidental libchibios update

* Apply suggestions from code review

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

* Update kyria keymap

* Move kyria keymap to splitkb/kyria

* Update planck keymap

* Remove all changes to keyboards/lily58/lib/layer_state_reader.c

* Update lily58 keymap

* Recommended change

* Update keymap readme

* Update kyria keymap and userspace

* Apply suggestions from code review

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

* Renamed users/muppetjones/README.md to lc

* Update keyboards/lily58/keymaps/muppetjones/config.h

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

Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-08-03 18:23:17 +01:00
Ryan
5f6cf24294
Move keyboard USB IDs and strings to data driven: Q (#17883) 2022-08-03 15:58:29 +01:00
yulei
c4e767b4c9
added neson design's 700e keyboard (#17768)
* added neson design's 700e keyboard

* Apply suggestions from code review

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

Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-08-03 14:20:10 +01:00
jotix
4ec2626b43
jotix's community ortho_4x12 layout change (#17891) 2022-08-03 11:32:23 +01:00
dvermd
0206bd9df3
add bluepill mcu to splittest (#16959)
* add bluepill mcu to splittest

* fix typo

* refactoring

* mcu config goes to mcuconf.h of keyboard
* keymap specific config goes to keymap config.h
* keyboard specific depending of keymap goes to post_config.h

* Apply suggested change

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

* Apply suggested change

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

* Apply suggested change

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

* Apply suggested change

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

* Apply suggested change

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

* splittest/bluepill: improve documentation

Co-authored-by: Ryan <fauxpark@gmail.com>
2022-08-03 09:31:37 +01:00
Ryan
b6757d2380
Move keyboard USB IDs and strings to data driven: P (#17875) 2022-08-03 17:23:15 +10:00
Ryan
3da6575e24
Move keyboard USB IDs and strings to data driven: M (#17859) 2022-08-03 17:15:43 +10:00
Ryan
1b92c204c1
Move keyboard USB IDs and strings to data driven: K (#17846)
Co-authored-by: James Young <18669334+noroadsleft@users.noreply.github.com>
2022-08-03 17:03:47 +10:00
kkokdae
ce9bb6d39b
[keymap] Add kkokdae keymap for keyboardio/atreus (#17843)
* [keymap] Add kkokdae keymap for keyboardio/atreus

* Update keyboards/keyboardio/atreus/keymaps/kkokdae/keymap.c

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

* Update keyboards/keyboardio/atreus/keymaps/kkokdae/keymap.c

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

* Revert "Update keyboards/keyboardio/atreus/keymaps/kkokdae/keymap.c"

This reverts commit 8e9ccc78c796ea482b5b48d546498c06e3a2af09.

Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-08-03 07:47:48 +01:00
Travis
5f6ec37b7d
[Keymap] Add TravisHi keymap for SplitKB Kyria (#17858)
* Init commit

* Prep for MVP

* Add F Fixes (thanks F!)

* Fix some incorrect layer summons

* Create readme (remove comments from code)

* Update OLED indicators (test)

* Add more OLED updates

* Add more layouts

* Update readme and small tweaks

* Update layers and prep for LED layers

* Fix a trapped layer issue

* Test animations

* Add a happy frog animation to right screen

* Add bulk work

* Move fren readme image

* Can't save images

* Update FPS layout

* Update Symbols layer

* Update readme

* Update readme (future comments move to readme)

* Remove superfluous comments & add Licence

* Add licence update
2022-08-03 07:10:46 +01:00
AnthonyNguyen168
4c8469f565
Update json file to support Configurator correctly. (#17692) 2022-08-03 01:06:55 +01:00
Ryan
be5b1a24bf
Move keyboard USB IDs and strings to data driven: O (#17874) 2022-08-02 19:39:00 +01:00
James Young
24488e043e
SKergo Refactor (#17877)
* skergo.h: use ___ for KC_NO

* skergo.h: use 3-character notation

* skergo.h: add matrix diagram

* add LAYOUT_all macro

* update grid alignment of LAYOUT macro and keymaps

* refactor keymaps

Refactor keymaps to use the `LAYOUT_all` macro. Converts tabs to spaces.

This change necessitates the following changes to keymaps:

- The keycodes for Page Up, Page Down, and End each move up one row - all as the last keys on their new rows.
- The keycode for the secondary B key moves up one row, inserted between the primary (left side) B and the N.

* remove LAYOUT macro

* rename LAYOUT_all macro to LAYOUT_split_bs

* add LAYOUT_2u_bs macro

* readme.md: add flashing example

* info.json: correct maintainer value

Update to reference maintainer's GitHub username.
2022-08-02 19:30:26 +01:00
Niko Wenselowski
068bfc49de
[Keymap] Move the ut472 keymap from gardego5 to keyhive folder (#17598) 2022-08-01 23:54:14 -07:00
Ryan
056a44c7d3
Move keyboard USB IDs and strings to data driven: N (#17865) 2022-08-02 01:10:48 +01:00
Ryan
7222969964
Move keyboard USB IDs and strings to data driven: L (#17849) 2022-08-02 01:02:19 +01:00
James Young
26b17a71e0
MS Sculpt Touch-Up (#17871)
* info.json: fix JSON syntax error

* info.json: convert tabs to spaces

* info.json: add QMK Configurator layout data

* readme.md: switch Bootloader and Docs sections
2022-08-01 17:09:40 +01:00
James Young
3b40ded512
ryanbaekr rb18 Configurator Data Fixes (#17872)
* info.json: apply friendly formatting

* info.json: correct key sequence

* info.json: remove dead space from layout

* info.json: correct maintainer value
2022-08-01 14:00:31 +01:00
axtloss
e1b6034f00
[Keymap] Add axtloss keymap for sofle (#17835)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-31 15:33:34 -07:00
James Young
f6a91649ff
KPrepublic BM80v2 Touch-Up (#17851)
* info.json: apply friendly formatting

* info.json: correct layout data

Fix the size and position of the Backslash key.

* readme.md: touch-up formatting

* readme.md: switch Bootloader and Docs sections

* correct keyboard maintainer
2022-07-30 21:00:15 +01:00
Ryan
2d778d2ff2
Move keyboard USB IDs and strings to data driven: handwired (#17822) 2022-07-30 17:31:44 +10:00
Ryan
1c6b0391b4
Move keyboard USB IDs and strings to data driven: E (#17815) 2022-07-30 17:23:55 +10:00
Bahrul Hidayat
da07e7dd0e
[Keyboard] add dyz60-hs (#17763)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
2022-07-29 21:07:10 -07:00
kopibeng
c0e3a16121
[Keyboard] Update MNK88 RGB Underglow LED Number (#17833)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-29 21:06:40 -07:00
Ryan
306e50b84c
Move keyboard USB IDs and strings to data driven: D (#17814) 2022-07-29 20:02:47 -07:00
Chris Swenson
d1096ad440
[Keymap] Add enigma keymap for contra keyboard (#17829) 2022-07-29 20:01:35 -07:00
James Young
d2aa8e6bb8
KBDfans Bounce Pad: Correct QMK Configurator Implementation (#17845) 2022-07-29 19:46:32 -07:00
GG
0aec4203e7
[Keyboard] add Zoom87 (#17831) 2022-07-29 19:16:50 -07:00
Drashna Jaelre
d93dfbff3c
Fix check when compiling HID Joystick with digital driver (#17844) 2022-07-30 01:32:06 +01:00
James Young
7f2ddf1711
kbdfans/bounce/75: correct typos of keyboard name (#17841) 2022-07-29 22:02:45 +01:00
Ryan
394cf7c41e
Move keyboard USB IDs and strings to data driven: J (#17837) 2022-07-29 13:49:01 +01:00
Ryan
bcb8600a31
Move keyboard USB IDs and strings to data driven: I (#17836) 2022-07-29 13:40:16 +01:00
James Young
1ded7ad460
KBDfans Bounce75 Touch-Up (#17834)
* kbdfans/bounce/75/hotswap: keymap readability fix

Update grid alignment to disambiguate which keycodes correspond in different layers.

----

Layer 0 had 13 and 9 keycodes on the bottom two rows respectively, while Layers 1-3 had 14 and 8.

* kbdfans/bounce/75/soldered: keymap readability fix

Update grid alignment to disambiguate which keycodes correspond in different layers.

----

Layer 0 had 14 and 9 keycodes on the bottom two rows respectively, while Layers 1-3 had 15 and 8.

* kbdfans/bounce/75/soldered: fix layer index in keymaps

Layer indexes were 0,1,2,1 instead of 0,1,2,3.
2022-07-29 13:18:28 +01:00
James Young
5c90f7ae14
Wuque Promise87 WKL Refactor (#17828) 2022-07-28 23:43:54 -07:00
GG
b5452581da
[Keyboard] fix mistakes in promise87 config (#17830) 2022-07-28 21:41:42 -07:00
Ryan
920f983767
Move keyboard USB IDs and strings to data driven: H (#17821) 2022-07-28 14:12:40 +01:00
Less/Rikki
e7affd0541
feat: encoder map, OLED & encoder kb-level config (#17809) 2022-07-28 01:56:37 +01:00
Arthur
1e745c48b6
[Keymap] Add artflag kyria layout (#17778)
* Initial firmware

* feedback

* updates

* update map
2022-07-27 16:51:13 -07:00
Ryan
23f365b601
Move keyboard USB IDs and strings to data driven: F (#17816) 2022-07-27 22:44:05 +01:00
Kevin Zhao
6731712cc1
Fix SKErgo Keymap (#17812) 2022-07-27 22:10:57 +01:00
Ryan
4a0eb733ac
Move keyboard USB IDs and strings to data driven: G (#17818) 2022-07-27 20:19:09 +01:00
turbololvo
c788857b6b
fix function layer to reflect cap labels (#17813)
These changes correctly reflect the keycap labels on the Vortex Race 3.
2022-07-27 17:27:39 +01:00
James Young
0f40e5d0dc
Wuque Promise87 ANSI Refactor (#17807) 2022-07-27 08:01:37 -07:00
Drashna Jaelre
8973835183
[Docs] Add information about WeAct Blackpill F411 (#16755)
* [Docs] Add information about WeAct Blackpill F411

* Add clarification for matrix pins

* Update documentation

* Tweak wording
2022-07-27 14:49:12 +01:00
Albert Y
3285659690
CLI compatibility for MacOS (#17811) 2022-07-27 10:29:10 +01:00
Danny
dc48b3fd04
[Keyboard] Fix typo with RGB LED positioning in Iris (#17805) 2022-07-26 13:48:07 -07:00
Less/Rikki
fc9654a1d0
feat: encoder map, OLED & encoder kb-level config (#17767) 2022-07-26 21:25:23 +01:00
Drashna Jaelre
5f36285fc5
[Keyboard] Add work louder micro (#17586)
* [Keyboard] Add work louder micro

* Update keyboards/work_louder/micro/readme.md

* Update readme

* Update kb config files

* Update to use encoder map

Co-authored-by: Tom Barnes <barnestom@me.com>
2022-07-26 20:50:45 +01:00
Scott Bennett
9dbc0473ef
Dz65v2 Settings for SBennett13 (#17747)
* Start of dz65v2 map for sbennett13

* No wpm, disable some rgb, ~copyright~

* No more raindrops

* Remove more rgb modes and set default

* Almost orgot this crappy thing

* cannot define startup :(

* Layered esc is kc_grv

* Start of dz65v2 map for sbennett13

* No wpm, disable some rgb, ~copyright~

* No more raindrops

* Remove more rgb modes and set default

* Almost orgot this crappy thing

* cannot define startup :(

* Layered esc is kc_grv

* Add license to config and keymap
2022-07-26 20:43:26 +01:00
Spaceman
d4bb5a9820
Add alternative Logos (#17787) 2022-07-26 20:15:08 +01:00
Nick Brassel
d1434b6d75
Make qmk doctor print out the last log entry for upstream/{master,develop}, including dates (#17713) 2022-07-26 17:37:28 +01:00
Wilba
501276a8fd
Added WT65-D (#17724) 2022-07-26 17:36:30 +01:00
Álvaro A. Volpato
b0b14cc440
[Keyboard] Acheron Athena support (#16818)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-26 00:59:38 -07:00
Olly Hayes
77e48f5b7e
[Keymap] Add ollyhayes keymap (#16632) 2022-07-25 23:26:22 -07:00
Leo Deng
ddae04bca1
[Keyboard] add DJam keyboard (#17430)
Co-authored-by: Joel Challis <git@zvecr.com>
2022-07-25 23:25:28 -07:00
shamit05
91d911eb1f
[Keyboard] Add Halokeys Elemental 75 (#17323)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-25 22:36:11 -07:00
Cipulot
ba1643af7d
[Keyboard] Add Kawayo Keyboard (#17454)
Co-authored-by: Joel Challis <git@zvecr.com>
2022-07-25 22:30:59 -07:00
hornslyn
a33dc8ebb5
[Keyboard] Add Star75 support (#17421)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-25 22:24:04 -07:00
James Young
753ca0e13c
takashicompany miniZone: fix QMK Configurator implementation (#17801) 2022-07-25 22:20:36 -07:00
Daniel O'Brien
3eb9f28c89
[Keyboard] Add missing mute button to sofle keymap (#17796) 2022-07-25 22:02:02 -07:00
Diogo Sergio
e6a7db2fd2
Update README.md for teensy lc onekey (#17797) 2022-07-25 21:59:37 -07:00
Ryan
5ed98df374
gboards/georgi: cleanup & fix (#17753) 2022-07-26 14:01:05 +10:00
Ryan
674422eb13
Move keyboard USB IDs and strings to data driven: A (#17781) 2022-07-26 01:52:18 +01:00
Ryan
a939293aca
Move keyboard USB IDs and strings to data driven: C (#17789) 2022-07-26 00:04:09 +01:00
James Young
b6ac0ecf82
Runes Skjöldr Touch-Up (#17792)
* skjoldr.h: use ___ for KC_NO

* skjoldr.h: use K<row><column> notation

Matrix was previously defined using identifiers in the format of K<column><row>.

* skjoldr.h: add matrix diagram

* info.json: apply friendly formatting

- key legends as labels
- correct key sizes and positioning

* refactor keymaps

Refactors the `default` and `via` keymaps.

- use QMK-native keycode aliases
- grid-align keycodes for readability

* rename LAYOUT macro to LAYOUT_60_ansi_arrow

* enable Community Layout support

* info.json: correct maintainer value

Field is meant to reference the maintainer's GitHub username.
2022-07-25 23:55:26 +01:00
Drashna Jaelre
68cc6be564
[Keyboard] Fix Charue Sunsetter_r2 compilation issues (#17793) 2022-07-25 23:07:32 +01:00
ILWrites
1df6322f10
Fixed spacebar position (#17784) 2022-07-25 17:21:09 +01:00
Ryan
50c2b151b2
Move keyboard USB IDs and strings to data driven: B (#17782) 2022-07-25 16:20:19 +01:00
James Young
d2161f113b
MechWild Mokulua: Correct QMK Configurator Data (#17783)
* Mokulua Mirrored: rebuild info.json file

* Mokulua Standard: rebuild info.json file
2022-07-25 15:58:58 +01:00
Drashna Jaelre
c0763363db
[Docs] Fix tables in Audio driver document (#17780) 2022-07-25 00:00:51 +01:00
James Young
00c02e3bd8
FJLabs Sinanju Refactor (#17773)
* sinanju.h: add matrix diagram

* add LAYOUT_60_ansi_wkl_split_bs_rshift macro

Same matrix as `LAYOUT_all`, but with position K2D (right half of split Backspace) moved to the end of the top row.

* refactor keymaps

- use `LAYOUT_60_ansi_wkl_split_bs_rshift` macro instead of `LAYOUT_all`
- polish four-space indent
- update grid alignment
- replace `RESET` keycode with `QK_BOOT`

* remove now-unused LAYOUT_all macro

* add LAYOUT_60_ansi_wkl macro with keymap

Add a layout with 2u Backspace and 2.75u right Shift.

* info.json: correct maintainer value
2022-07-24 17:11:28 +01:00
James Young
5f172b63f5
Chocofly v1: add info.json (#17772) 2022-07-24 17:06:30 +01:00
James Young
191f6e8069
Idobao ID63 Community Layout support (#17769)
* info.json: add key labels

* rename LAYOUT_63_ansi to LAYOUT_60_ansi_arrow

* enable community layout support
2022-07-24 05:39:53 -07:00
James Young
049811be0d
Add info.json files for Acheron Apollo series keyboards (#17770)
* add info.json file for Apollo87H

* add info.json file for Apollo87H-T-SC

* add info.json file for Apollo88H-T-SC
2022-07-24 05:25:46 -07:00
James Young
592028c724
boardsource/beiwagon: correct QMK Configurator layout data (#17771) 2022-07-24 21:06:55 +10:00
4pplet
58d484ea28
Waffling80 layout fix (#17757) 2022-07-24 06:09:40 +01:00
James Young
962dcbf3a3
Creatkeebs Thera Refactor (#17766) 2022-07-23 20:27:38 -07:00
Álvaro A. Volpato
98c1f7a9ef
[Keyboard] Apollo87H PCB support (#16817)
* Initial Apollo87H support

* Define RGB animations and default animation

* Add proper per-key RGB support

* Adjust LED positions

* Separate delta-gamma

* Fine-tune LED positions

* fix up GAMMA revision

* fix up tabs indentation to spaces indentation

* Fixed positioning and CS-SW defs for some LEDs

* Fix INS RGB position

* Fine-tune LED positions, fix default RGB

* Update readme's

* Rename LAYOUT_87H to lowercase 87h

* Formatting gamma's rules.mk

* Formatting delta's rules.mk

* Use smaller readme image

* Use smaller README image

* First support for 87H-T-SC and 88H-T-SC

* Update README

* Fix layout naming

* Remove

* Remove EEPROM definitions, fix missing RGB LED mod/alpha definer

* Add suggestions from noroadsleft
2022-07-23 17:09:52 -07:00
TJ
c3df1775bc
[Keyboard] Le Chiffre rev 2 and HE additions (#17377)
* chiffre refactor for new revisions

* updated led matrix config

* updated per suggestions

* add tapdance enable

* revert tapdance (none defined in the default keymaps)

* clean up rules

* add readme for HE

* remove notes in readme

* fix perm

* fix perms

* Fix spacing on readme

* fix perm

* fix perms again?
2022-07-23 17:03:41 -07:00
4pplet
f1ccd60458
[Keyboard] 4pplet Perk60 (#16853)
* adding perk60 iso

adding perk60 iso

* Update info.json

* Update keyboards/4pplet/perk60_iso/rev_a/rev_a.c

* Update keyboards/4pplet/perk60_iso/rev_a/rev_a.c

* Delete chconf.h

* Update keyboards/4pplet/perk60_iso/rev_a/rules.mk

* Update keyboards/4pplet/perk60_iso/rev_a/rev_a.c

* Update keyboards/4pplet/perk60_iso/rev_a/rev_a.c

* Update rules.mk

* Update config.h

* removing a few RGB effects

* removing more effects

* Update keyboards/4pplet/perk60_iso/rev_a/config.h

* Update keyboards/4pplet/perk60_iso/keymaps/default/keymap.c

* Update keyboards/4pplet/perk60_iso/keymaps/default/keymap.c

* Update keyboards/4pplet/perk60_iso/keymaps/via/keymap.c

* Update keyboards/4pplet/perk60_iso/keymaps/via/keymap.c

* Update keyboards/4pplet/perk60_iso/keymaps/via/keymap.c

* Update keyboards/4pplet/perk60_iso/rev_a/rev_a.h

* Update keyboards/4pplet/perk60_iso/keymaps/via/keymap.c

* Update keyboards/4pplet/perk60_iso/info.json

* Update keyboards/4pplet/perk60_iso/rev_a/rules.mk
2022-07-23 13:23:14 -07:00
Niko Wenselowski
1f42a8ccdd
Fix test logic to check for both keymaps (#17761)
Python will evaluate first the left and then the right side of the and operator.

The left side would previously return True based on the truthiness logic that treats any non-emptry string as true.

It would not check if the desired keymap exists.

If the left side is true it will evaluate the right side which will check for the existance of a specific keymap.

With this change the check for existance of two keymaps is implemented.
2022-07-23 17:42:19 +01:00
Yuannan
2202efaf0c
Added autoclicker, better mouse, Vim like editing layer and more. (#15702)
* Added autoclicker, better mouse, vim like FN layer and more.

* Updated docs to comply with guidelines

* Fixed Imgur links

* increased step sizes

* updated readme to reflect step size

* Added second delay array for autoclicker to compensate for RGB animation CPU loads

* better RGB effects and updated docs

* better README.md formatting

* added DEBONCE libinput workaround for Linux

* fixed formatting

* fixed typos and clarified

* fixed layer picture order

* Update keyboards/dztech/dz65rgb/keymaps/yuannan/keymap.c

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

* Update keyboards/dztech/dz65rgb/keymaps/yuannan/README.md

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

* Updated Docs and rules

* Updated with the new deferred exec API to ensure more consistant CPS

* renamed README.md to be lower case to comply with fauxpark's request

* Remapped alt to be left instead of right for compatibility reasons

* Update keyboards/dztech/dz65rgb/keymaps/yuannan/config.h

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

Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-22 21:20:02 +01:00
mechlovin
8de0427fec
[Kay60] Change LED pin state and correct keycode. (#17746) 2022-07-22 15:57:03 +01:00
Aidan Gauland
de10784799
Fix compilation error in Ploopy Nano maddie keymap (#17733) 2022-07-22 14:22:56 +01:00
Sắn
b9c7d4c48d
[Keyboard] Add Krush65 Hotswap (#16692)
* Add Krush65 Hotswap

* Led fix

* small fix

* a

* B

* move ec action to VIA keymaps

* Update keyboards/sawnsprojects/krush/krush65/hotswap/readme.md

* Update keyboards/sawnsprojects/krush/krush65/hotswap/rules.mk

* Update readme.md

* Update readme.md

* Update readme.md

* Update keyboards/sawnsprojects/krush/krush65/hotswap/readme.md

* Update keyboards/sawnsprojects/krush/krush65/hotswap/rules.mk

* Update keyboards/sawnsprojects/krush/krush65/hotswap/info.json

* Update keyboards/sawnsprojects/krush/krush65/hotswap/readme.md

* Update keyboards/sawnsprojects/krush/krush65/hotswap/readme.md

* Update keyboards/sawnsprojects/krush/krush65/hotswap/info.json

* Update keyboards/sawnsprojects/krush/krush65/hotswap/hotswap.h
2022-07-21 20:42:29 -07:00
Joel Challis
5a0e47db5e
Add reviewer/labels to dependabot PRs (#17743) 2022-07-21 21:24:07 +01:00
dependabot[bot]
4ca99af8f5
Bump JamesIves/github-pages-deploy-action from 4.3.4 to 4.4.0 (#17742) 2022-07-21 20:54:27 +01:00
Ricardo (XenGi) Band
993500aab4
dump local stuff 2022-07-21 18:39:06 +02:00
jonavin
7f0581cd35
Jonavin mercutio - reduce mem footprint (#17498)
* Reduce mem footprint - remove sprintf

* remove stdio reference and use get_u8_str

Co-authored-by: Jonavin <=>
2022-07-21 13:44:51 +01:00
mechlovin
a6d70de96a
[Keyboardo] Update PID for mechlovin zed60 (#17728) 2022-07-20 16:19:51 -07:00
takashicompany
62e3f8b885
Add miniZone Keymap (#17552) 2022-07-20 17:59:40 +01:00
Felix Jen
55f16167e4
Added Windz Sinanju to QMK (#17566) 2022-07-20 16:01:35 +01:00
Michal
00c8e24c6a
[Keymap] Michal Keymap for Sofle rev1 (#17610) 2022-07-19 17:55:48 -07:00
Duccio
a7893f207d
Add rgb underglow support and change vendor_id (#17719) 2022-07-20 00:24:10 +01:00
JW2586
32512bbf10
[Keyboard] Waterfowl keyboard support (#16760)
* Added waterfowl files

* Completing PR Checklist

* Added encoders to info.json

* Added license to default keymap

* Update keyboards/waterfowl/keymaps/cyanduck/keymap.c

* Update keyboards/waterfowl/keymaps/default/keymap.c

* Update keyboards/waterfowl/waterfowl.c

* Update keyboards/waterfowl/keymaps/default/keymap.c

* Update keyboards/waterfowl/waterfowl.c

* Update keyboards/waterfowl/waterfowl.c

* Update keyboards/waterfowl/keymaps/cyanduck/keymap.c

* Update keyboards/waterfowl/rules.mk

* Update readme.md

* Update keyboards/waterfowl/waterfowl.c

* Update keyboards/waterfowl/info.json

* Update keyboards/waterfowl/info.json
2022-07-19 08:43:19 -07:00
takashicompany
819231afe1
Add keymap for Radialex (#17662)
* fix keymap

* fix keymaps
2022-07-19 11:28:45 +01:00
David Hoelscher
1bf95d60e4
[Keyboard] customMK EVO70 (#14907)
* added files for EVO70

* updated info.json and readme

* ran qmk lint and fixed typo in info.json

* removed defines from config.h in favor of info.json

* removed an unnecssary include

* removed unnecessary code

* updated rules.mk to remove mention of Bluetooth

* corrected edit to rules.mk

* added code for OLED menu display

* removed extraneous comments and spaces

* added bongo cat animation

* Update keyboards/custommk/evo70/rules.mk

* Update keyboards/custommk/evo70/config.h

* Modified Bongocat graphics to match original proportions

* updated info.json device version

* updated OLED splash screen display timing

* improved bongo cat tap detection and added backlight breathing to OLED menu

* various improvements to OLED, saving settings, and VIA keymap fix

* removed extraneous define

* custom encoder assignment retained upon powerup, backlight sleep upon suspend

* corrected bongo cat tap detection

* Changed splash screen and bongo cat encoder rotation to use the custom assignments

* removed _default from LAYOUT naming and changed keyboard image to be hosted from imgur

* Force smaller version of image to be used in readme
2022-07-19 03:13:16 -07:00
James Young
7aea67980b
Update noroadsleft userspace and keymaps (2022-07-18) (#17714)
* kbdfans/kbd75/rev1:noroadsleft - remove LAYOUT_75_ansi_wkl definition

* coseyfannitutti/discipline:noroadsleft - change KC_GESC to KC_ESC

* update Quantum keycode instances in noroadsleft keymaps

- `RESET` -> `QK_BOOT`
- `EEP_RST` -> `EE_CLR`
- `DEBUG` -> `DB_TOGG`

* create and add G_PWD macro
2022-07-18 19:09:05 -07:00
Sergey Vlasov
627e35b7ac
Remove Nixpkgs-provided poetry from the environment (#17673)
The `poetry` package from the used Nixpkgs snapshot triggers the regex
compatibility issue in Nix >= 2.10.0 binaries for `x86_64-darwin`:

    https://www.github.com/NixOS/nix/issues/4758

Remove the `poetry` package from the Nix shell environment for now
(it is not really required to compile QMK, only to develop the Nix shell
environment itself).

In addition, all `poetry` version earlier than 1.1.14 became effectively
non-functional after a breaking change of the PyPI JSON API:

    https://www.github.com/python-poetry/poetry/pull/5973

Updating the `poetry` package is not trivial (just adding it it to
`pyproject.toml` does not work due to dependency version conflicts with
other modules), therefore removing it seems to be the easiest solution
to restore compatibility with new Nix versions while not creating any
major inconvenience for QMK users.
2022-07-18 22:52:55 +03:00
Jason Wihardja
c10d0fc785
Add Support for Massdrop's Stack Overflow The Key V2 (#17696)
* Default Factory Settings

* Change Keyboard Name in Readme

* Fix LED Orders

* Change Brightness Step

* Enable Lighting Layers

* Add RGB Control Mode

* Unblink Layer to Clear Stack

* Add MacOS RGB Control

* Comment Fixes
2022-07-18 13:20:19 +01:00
Runheme
4be736c192
[Keyboard]modify ginkgo65hot (#17705)
modify ginkgo65hot
2022-07-18 13:18:08 +01:00
Kyle McCreery
a444ccd27c
Re-refactor Mokulua (#17125)
* allowing the kt60 file to be modified so I can do things while waiting for it to be fixed upstream

* initial commit for mokulua keyboard

* Split the board into mirrored and standard layouts.

* Prepping for PR. Silly keymap added.

* prepped for PR

* Apply suggestions from code review

* Fixing firmware from the refactor that removed the mirrored layout.

* Small tweaks using changes from refactor

* Changed the name of the layouts back to match the original to resolve conflict in info.json

* these files needed to be removed as well, they were added as a part of the refactor

* info.json moveds to be different for each build

* Another file had to be removed and the mirrored.c file changed to call mirrored.h instead of standard.h

* fixing chibios ver

* force deleting to revert

* fixing chibios shit

* Update keyboards/mechwild/mokulua/mirrored/mirrored.c

* Update keyboards/mechwild/mokulua/standard/standard.c

* Removing tabs and replacing with 4 spaces. Small style and formatting changes.
2022-07-17 16:55:32 -07:00
David Kühling
931c7539d2
[Keyboard] Handwired Maltron DQz11N1G contoured keyboard (#17237)
* Basic support for Maltron DQz11N1G controller replacement.

* Update keyboards/handwired/dqz11n1g/rules.mk

* Rehost images to cubeupload.com.

(They were previously hosted via github wiki)

* Apply suggestions from noroadsleft code review

* Update keyboards/handwired/dqz11n1g/dqz11n1g.h
2022-07-17 09:49:36 -07:00
Richard
747b33cb81
[Keyboard] Adding chocV keyboard (#15921)
* Adding chocV keyboard

* Fix checklist issues / community layout support

* Remove template cruft from readme

* Fix image url in readme

* Fix image url in readme to raw github content

* Change readme example to use default Keymap

* Remove vestigal config

* More informative keymap readme

* Config.h swapsies

* Remove deprecated features

* Conform / Modernize Rules

* Conform / Modernize Rules

* Clean up spacing

* Update keyboards/chocv/readme.md

Move build docs links to end 👍
2022-07-17 09:35:09 -07:00
mechlovin
6025df79b3
[Keyboard] Add Zed60 PCB (#17304)
* add zed60

* update readme.md

* Delete chconf.h

* update readme.md

* Update keyboards/mechlovin/zed60/rules.mk

* Update keyboards/mechlovin/zed60/keymaps/via/keymap.c

* Update keyboards/mechlovin/zed60/keymaps/default/keymap.c

* Update keyboards/mechlovin/zed60/keymaps/default/keymap.c

* Update keyboards/mechlovin/zed60/keymaps/via/keymap.c

* Update keyboards/mechlovin/zed60/keymaps/via/keymap.c

* Update keyboards/mechlovin/zed60/keymaps/via/keymap.c

* Update keyboards/mechlovin/zed60/config.h

* Update keyboards/mechlovin/zed60/config.h

* Update keyboards/mechlovin/zed60/info.json

* Update keyboards/mechlovin/zed60/readme.md

* Update keyboards/mechlovin/zed60/info.json

* Update keyboards/mechlovin/zed60/zed60.h
2022-07-17 09:24:28 -07:00
Joel Challis
37cd5ad810
Remove full bootmagic config (#17701) 2022-07-17 13:02:56 +01:00
Jens-Petter Sandvik
4e5cc3c2ba
Planck swap hand matrix for rev6, fixing issue #17388 (#17389)
* Add correct hand_swap_config matrix for planck_rev6 and planck_rev6_drop

* Make sure indentations are consistent

* Make the rev6 hand_swap_config matrix the default, also correct for ez.

* Move hand_swap_config matrix from planck.c to revision subdirectories
2022-07-17 00:17:22 -07:00
Teimor Epstein
28f9def219
[Keymap] teimor keymap for Keychron Q1 (#16396)
* teimor keymap

* quickfix and cleanup

* update readme

* quickfix and cleanup before pr

* clang

* clean layout

* add reset

* pr fix

* fix pr

* Rename README.md to readme.md
2022-07-16 17:31:21 -07:00
Brian
05f6838f37
[Keymap] Added Layout Keymaps for BriianPowell (#17310)
* Keymaps for Gentleman65 and Discipline

* Apply suggestions from code review

* Update keyboards/coseyfannitutti/discipline/keymaps/briianpowell/keymap.c

* More custom configuration for Gentleman65

* Completed Gentleman65 Layout (for now)
2022-07-16 12:47:28 -07:00
HorrorTroll
92c3e6305b
[Keyboard] Gopolar GG86 (#15425)
* Added keyboard GG86

* Rebased, resolved issue and updated code

* Delete 1000Hz on config

* Resolved fix

* Another resolved fix

* Last resolved fix

* Fixed LED position
2022-07-16 12:38:22 -07:00
ymlmkb
4d443d921b
[Keyboard] KeebMonkey KBMG68 (#15909)
* added KeebMonkey KBMG68.

* Update keyboards/keebmonkey/kbmg68/config.h

* changes requested by fauxpark .

* Apply suggestions from code review

changes suggested by fauxpark

* Update readme.md

changes requested by fauxpark

* Apply suggestions from code review

changes requested by noroadsleft.

* Apply suggestions from code review per fauxpark
2022-07-16 12:03:39 -07:00
bri
847cca541c
Add .orig to .gitignore (#17626) 2022-07-17 04:38:56 +10:00
Allen Choi
9cdccb12d1
[Keymap] Crkbd/thunderbird2086 (#16973)
* crkbd:thunderbird2086

* readme

* after code review

* coding format

* minor change

* changed file name

* correct image

* updated readme

* using query to get rgb status

* minor update
2022-07-16 00:29:09 -07:00
James Young
66983f090c
Suavity Ehan Refactor (#17694)
* info.json: apply friendly formatting, phase 1

* info.json: fix macro reference and layout

* info.json: apply friendly formatting, phase 2

Add key labels.

* refactor keymaps and layout macro

- apply four-space indent
- apply grid alignment to keycodes, matrix position identifiers, and matrix

* add LAYOUT_all

* ehan.h: add matrix diagram

* rename LAYOUT_ansi_default to LAYOUT_ansi_split_bs_rshift_lspace

* ehan.h: correct K3E position in LAYOUT_ansi_split_bs_rshift_lspace

Move location K3E to actually be on Column 14 (E); was previously on Column 13 (D) in source..

* add LAYOUT_iso_split_bs_rshift_lspace

Includes reference keymap.
2022-07-15 23:48:35 -07:00
Wilfrid Li
1f93485aef
feat(keebwerk): added VIA support keymap for keebwerk nano slider (#16761)
* feat(keebwerk): added VIA support keymap for keebwerk nano slider

Added VIA support for keebwerk nano slider, VIA json is keebwerk_nano_via.json
Fixed midi2vol keymap where comma symbol is missing from enum "custom_layers"

* feat(keebwerk): removed VIA json as requested

* Update keyboards/keebwerk/nano_slider/keymaps/via/keymap.c

* Update keyboards/keebwerk/nano_slider/keymaps/via/keymap.c

* Fix(PR): removed file as requested
2022-07-15 22:21:15 -07:00
James Young
303992da70
FJLabs Solanis Refactor (#17686)
* solanis.h: add matrix diagram

* refactor keymaps: apply grid alignment

* refactor LAYOUT_all macro

Moves the matrix position identifier for the right half of Split Backspace to the number row.
2022-07-15 22:16:14 -07:00
projectcain
f5333e9136
[Keyboard] add ProjectCain Relic (#15577)
* Adding relic keyboard

* Update keyboards/projectcain/relic/relic.c

* Update keyboards/projectcain/relic/relic.c

* Update keyboards/projectcain/relic/rules.mk

* Update keyboards/projectcain/relic/rules.mk

* Update keyboards/projectcain/relic/rules.mk

* Update config.h

* Update config.h

* Update keyboards/projectcain/relic/rules.mk

* Update keyboards/projectcain/relic/readme.md

* Update keyboards/projectcain/relic/info.json

* Update keyboards/projectcain/relic/config.h

* Update keyboards/projectcain/relic/config.h
2022-07-15 18:01:52 -07:00
Henry Lum
ba4ba66b2f
[Keyboard] eHan Keyboard (#15861)
* Compiled Suavity QMK Directory

* updated info.json's name from 'LAYOUT_default' to 'LAYOUT_default_split'

* updated rules.mk to reflect new layout name of each keymap

* Updated hanjie.h to reflect physical matrix of PCB

* switched info.json key matrix from split backspace to 2U backspace to better reflect electrical matrix

* updated keymap.c key matrix to reflect PCB electrical matrix

* updated keymap.c key matrix t oreflect PCB electrical matrix

* removed split left shift from physical matrix for default_split layout

* removed split left shift physical & electrical default_split layout

* removed split left shift from physical matrix for default_split layout

* removed split left shift from physical matrix for default_split layout

* updated qmk and via keymap.c and hanjie.h files to reflect pcb electrical matrix

* changed diode direction from row2col to col2row

* fixed false keycode triggers

* updated via keymaps

* added 's'

* added ehan branch for development

* updated readme.md

* updated ehan.h

* updated readme.md

* updated ehan.h layout

* added keymap.c and updated ehan.h

* progress

* compiled qmk

* updated matrix column and row pin out

* updated QMK default ansi keymap

* added VIA ansi_default keymaps

* corrected col 15's pin out to be pin B9, not C13

* Update keyboards/suavity/ehan/config.h

* Update keyboards/suavity/ehan/info.json

* Update keyboards/suavity/ehan/rules.mk

* Update keyboards/suavity/hanjie/rules.mk

* Update keyboards/suavity/hanjie/rules.mk

* Update keyboards/suavity/hanjie/keymaps/via/rules.mk

* Update keyboards/suavity/ehan/rules.mk

* changed readme.md's picturefrom html to markdown

* updated traces & diode placement

* Apply suggestions from code review

Remove trailing backslashes from keymaps (per fauxpark)

* Apply suggestions from code review

Remove `BOOTMAGIC_ENABLE = lite` from `keyboards/suavity/ehan/keymaps/via/rules.mk`

(per fauxpark)

* Apply suggestions from code review

Update formatting of `keyboards/suavity/ehan/rules.mk`

(per fauxpark)

* Update keyboards/suavity/ehan/readme.md

Fix image URL

* Update keyboards/suavity/ehan/config.h

Remove trailing comma in MATRIX_COL_PINS definition
2022-07-15 14:06:19 -07:00
Evelien Dekkers
09b0d3e0ed
Move ins, home and pgup keys to the left (#17690) 2022-07-15 09:56:06 +01:00
Elliot Patros
0ececbcdb7
[Keymap] emp keymap for keebio/iris (#16858)
* added new layout for keebio/iris

* Update keyboards/keebio/iris/keymaps/emp/config.h

* Update keyboards/keebio/iris/keymaps/emp/keymap.c

Replace #defines with enum

* Update keyboards/keebio/iris/keymaps/emp/keymap.c

Made requested changes about formatting and the license.

* Update config.h

Cleaned up formatting

* Update keyboards/keebio/iris/keymaps/emp/keymap.c

Small changes to improve readability:
* changed whitespace in license
* added more whitespace around if/else blocks
* fixed bracket style in places
2022-07-14 23:11:44 -07:00
Joel Challis
3c6765b21c
Ignore kbfirmware exports (#17687) 2022-07-15 03:57:34 +01:00
Sam
16c91e0cf2
[Keyboard] Added TutelPad keyboard (#16975)
* TutelPad firmware v1.0

* Added VIA compatibility

* Update keyboards/0xcb/tutelpad/config.h

* Update keyboards/0xcb/tutelpad/keymaps/via/keymap.c

* Update keyboards/0xcb/tutelpad/keymaps/via/keymap.c

* Update keyboards/0xcb/tutelpad/keymaps/via/keymap.c

* Add new OLED image, implement suggested fixes

* Update keyboards/0xcb/tutelpad/rules.mk

* Update keyboards/0xcb/tutelpad/rules.mk
2022-07-14 19:52:39 -07:00
Will Winder
807620fa3c
[Keyboard] Add Chocofly v1 (#17289)
* [Keyboard] Add Chocofly v1

* PR Feedback

* Small change to keymap.

* Replace KC__VOLUP and KC__VOLDOWN with single underscore version.

* Apply suggestions from code review

* Required for my PC

* Required for my PC
2022-07-14 19:45:08 -07:00
James Young
be56817743
KB16-01: correct QMK Configurator key sequence (#17670) 2022-07-14 14:51:25 -07:00
James Young
2d7de91888
Nayeon Community Layout support (#17665)
* Nayeon Community Layout support

- macro `LAYOUT_ansi` renamed to  `LAYOUT_tkl_f13_ansi_tsangan`
- macro `LAYOUT_iso` renamed to  `LAYOUT_tkl_f13_iso_tsangan`
- Community Layout support enabled in `rules.mk`

* add LAYOUT_tkl_f13_ansi_tsangan_split_bs_rshift

* add LAYOUT_tkl_f13_iso_tsangan_split_bs_rshift

* info.json: update maintainer field

Field is meant to reference the GitHub username of the maintainer.
2022-07-14 14:31:37 -07:00
Drashna Jaelre
67f9777b8f
[Keyboard] Fix Tractyl Manuform 4x6 json (#17681) 2022-07-14 06:08:54 -07:00
Albert Y
2efad277ee
[Keyboard] Readme file correction (#17674) 2022-07-14 12:22:31 +01:00
James Young
928be32c83
KPrepublic BM80v2 ISO Refactor (#17660)
* bm80v2_iso.h: convert tabs to spaces

* bm80v2_iso.h: use ___ for KC_NO

* bm80v2_iso.h: use QMK 3-character notation

* refactor macro for tkl_iso Community Layout compatibility

- move the matrix position identifier for Enter to the home row

* info.json: correct layout data

* rules.mk: tidy-up formatting

* readme.md: tidy-up formatting

* update maintainer; re-assign copyright

* assign ISO-appropriate keycodes in keymaps
2022-07-13 23:34:51 -07:00
Kyle McCreery
acc11f4941
[Keyboard] MechWild BB Steno (#17163)
* allowing the kt60 file to be modified so I can do things while waiting for it to be fixed upstream

* Initial commit

* testing modes

* working on puckbuddy firmware. This is all working for now but need to clean it up and personalize it.

* needs to be updated from vial build

* prepping for PR

* added rgb mode cycling to fn1 since it isn't on the encoder for these maps

* shipping firmware built. Need to clean up readme and info.json layout

* removing puckbuddy files from this branch

* readme done, prepping for PR

* info.json updated prepping for PR

* Restore cirque driver that was modified from puckbuddy testing on this branch

* applying changes from review

* Update keyboards/mechwild/bbs/bbs.c

* Fixed info.json

* Apply suggestions from code review
2022-07-13 23:26:13 -07:00
wangfuco
99e9e1b8e7
[Keyboard] Modelm101 teensy2 (#16805)
* Add modelm101_teensy2 files from modelm101

* Change info.json

* Update README.md

* Update pin def

* Fix file name

* Update readme.md

* Delete config.h

* Apply suggestions from code review

* Update keyboards/converter/modelm101_teensy2/config.h

* Delete keyboards/converter/modelm101_teensy2/keymaps/iw0rm3r directory

* Delete .noci
2022-07-13 15:24:42 -07:00
James Young
4ef0c8230c
Ducky One 2 SF touch-up (#17672)
* info.json: correct JSON syntax error

* info.json: correct key sizes

* update readme files

Moves nearly all of the information about this keyboard to the 1967st version's readme, because this readme is exposed in QMK Configurator.

Also updates the readme to align more closely with QMK's keyboard readme template.

* info.json: update metadata

Updates the keyboard name and maintainer fields.
2022-07-13 21:57:55 +01:00
James Young
f7510ca202
Gentoo & Gentoo Hotswap: correct Configurator key sequence errors (#17668)
* Gentoo info.json: apply friendly formatting

* Gentoo info.json: correct key sequence error

* Gentoo Hotswap info.json: apply friendly formatting

* Gentoo Hotswap info.json: correct key sequence error
2022-07-13 12:40:03 -07:00
James Young
6eac98286a
Swift65 Hotswap: correct key sizes (#17666)
Corrects the key sizes on the bottom row (1.5-1-1.5-7 instead of 1.25-1.25-1.25-7.25).
2022-07-13 12:39:39 -07:00
Drashna Jaelre
d98f309429
[Keyboard] Fix compilation issue for runes/skoldjr (#17659) 2022-07-13 01:11:24 -07:00
Yizhen Liu
acf114315e
[Keyboard] Kprepublic bm80v2 iso issue resolved (#17657)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-13 01:04:42 -07:00
jack
2a3cd98fc6
boardsource/technik_o data driven (#17635) 2022-07-13 06:35:06 +01:00
jack
320219d5d8
boardsource/5x12 data driven (#17630) 2022-07-13 06:32:22 +01:00
jack
63154631ab
boardsource/4x12 data driven (#17629) 2022-07-13 06:31:43 +01:00
James Young
4f4e72e44c
ID75 v2: update info.json (#17653) 2022-07-12 22:25:04 -07:00
jack
2271b28386
[Keyboard] boardsource/the_mark data driven (#17637) 2022-07-12 22:19:36 -07:00
jack
f80bb4a517
[Keyboard] boardsource/technik_s data driven (#17636) 2022-07-12 22:19:17 -07:00
jack
b99ccd4f06
[Keyboard] boardsource/beiwagon data driven (#17631) 2022-07-12 22:18:53 -07:00
Vicktor Hutama
5a126e1a74
[Keyboard] Add Runes Skjoldr (#17305)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-12 21:58:31 -07:00
jack
a991d65e87
[Keyboard] boardsource/3x4 data driven (#17628)
* initial

* change to development board

* replaced KC_TRNS & use rules.mk template
2022-07-12 21:58:04 -07:00
Zach Rice
019bfc4159
[Keymap] Add RAOEUS keymap for the XD75 (#17456)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-12 21:52:52 -07:00
James Young
e68de95214
KBDfans KBD67 rev2 Layout Patch (#17649) 2022-07-12 21:37:23 -07:00
Cipulot
5bc81d3a63
[Keyboard] Add Kallos keyboard (#17461)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-12 21:31:17 -07:00
Yizhen Liu
7a090bb3df
[Keyboard] Kprepublic bm80v2 iso revised (#17571)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-12 21:10:31 -07:00
AnthonyNguyen168
257fc042df
[Keyboard] Update layout for MechBrewery series (#17570) 2022-07-12 21:09:37 -07:00
Drashna Jaelre
26954bbc28
[Docs] Add Encoder requirements to PR Checklist doc (#17634)
Co-authored-by: Nick Brassel <nick@tzarc.org>
2022-07-12 20:50:26 -07:00
Joel Challis
2a3dd95229
Add basic secure docs (#17577) 2022-07-13 00:06:19 +01:00
Joel Challis
2714c70bd7
Fix layout macro for nightly_boards/paraluman (#17633) 2022-07-11 22:45:56 +01:00
Danny
9a41a303cc
[Keyboard] Add Quefrency Rev. 5 (#17503) 2022-07-11 14:14:55 -07:00
Felix Jen
7c3b6c4bc4
[Keyboard] Add Swordfish keyboard (#17567) 2022-07-11 13:57:20 -07:00
Alex Băluț
2bb0550707
[Keyboard] add kinesis/kintlc (#17301) 2022-07-11 12:46:51 -07:00
balloondogcaps
61a5059fc5
[Keyboard] TR90PM (#17060)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-11 11:53:51 -07:00
balloondogcaps
6663dd7288
[Keyboard] Add TR90 (#16838)
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-11 11:53:25 -07:00
Evelien Dekkers
61ce15f202
[Keyboard] Fin pad (#17523)
Co-authored-by: Joel Challis <git@zvecr.com>
2022-07-11 05:57:39 -07:00
Naphtaline
c8f969a3ce
[Keyboard] kbdfans kbd67 rev 2 : add new LAYOUT_65_iso_split_bs (#16922)
* [Layout/Keymap] kbdfans kbd67 rev2 : add new LAYOUT_65_iso_split_bs and naphaline keymap as a working example

* Update keyboards/kbdfans/kbd67/rev2/keymaps/naphtaline/keymap.c

I do trust the reviewer, here goes the change :)

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

* Remove QMK custom keycodes 1/2

Co-authored-by: Nick Brassel <nick@tzarc.org>

* Remove QMK custom keycodes 2/2

Co-authored-by: Nick Brassel <nick@tzarc.org>

Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: Nick Brassel <nick@tzarc.org>
2022-07-11 05:55:01 -07:00
James Young
2dab029bcf
Peej Rosaline Refactor (#17564) 2022-07-11 05:51:29 -07:00
Joel Challis
5389f088b1
splitkb/kyria - Resolve CONVERT_TO_PROTON_C warnings (#17617) 2022-07-11 04:30:45 -07:00
GG
16b837b35b
[Keyboard] Add Promise87 (#17525) 2022-07-11 04:23:13 -07:00
Joel Challis
a5eeee4ded
Fix infinite recursion in checkerboards/quark_plus (#17616) 2022-07-10 23:44:56 +01:00
Joel Challis
2106acc24a
merge/um80 - Fix WPM issues in configurator builds (#17608) 2022-07-09 18:26:48 +01:00
Nick Brassel
561c5e1d7a
Add line to multibuild output log showing the actual build target. (#17606) 2022-07-09 22:32:43 +10:00
Dasky
06310e81e9
Allow only col or row pins for *_right extraction. (#17590) 2022-07-08 22:49:55 +01:00
Bartosz Nowak
e724801d33
[Keyboard] Clean up dactyl manuform unused files (#15890) 2022-07-07 05:42:28 -07:00
Zykrah
0d30565bb7
Fix/waka60 audio (#17561) 2022-07-06 22:44:21 -07:00
James Young
75bc9e6496
TKL Community Layout Additions (#17563) 2022-07-04 13:48:44 -07:00
Joel Challis
8fa7b62011
Attempt to discourage manual MSYS install for new users (#17556) 2022-07-04 00:41:00 +01:00
James Young
9a157a3a99
KP Republic BM60HSRGB_EC QMK Configurator and readme touch-up (#17541) 2022-07-03 14:25:29 -07:00
stanrc85
b7fee11e34
[Userspace] Add support for additional Mechlovin Adelais PCB version to my userspace (#17547) 2022-07-03 14:25:09 -07:00
李董睿煊
168a631720
Add support for MacroCat Keyboard (#17480) 2022-07-03 19:07:31 +01:00
James Young
d87d537b50
Remove dead space from Pierce QMK Configurator layout data (#17551) 2022-07-03 14:12:01 +10:00
jack
665feccca1
Fixup bounce/75 (#17548) 2022-07-03 14:10:51 +10:00
Drashna Jaelre
1c43410e26
[Keymap] Updates to drashna Keymaps and Userspace (#17543) 2022-07-02 19:55:46 -07:00
duoshock
a3119385a4
Add keyboard 'UM-80' (#17035) 2022-07-03 00:54:15 +01:00
moyi4681
4ba5102a50
add bounce keyboard (#17030) 2022-07-03 00:43:07 +01:00
TW59420
f2d4424bb7
Add alicekk support (#17027) 2022-07-03 00:38:02 +01:00
br
fbf3cbcd5c
Added PLOOPY_DRAGSCROLL_H_INVERT (#17453) 2022-07-03 00:13:45 +01:00
James Young
71f9a07b0f
65% Community Layout Updates (#17476)
* update 65_ansi community layout keymap

- add license header
- add function layer

* update 65_ansi_blocker community layout keymap

- add license header
- add function layer

* update 65_ansi_blocker_split_bs community layout keymap

- add license header
- add function layer

* update 65_ansi_blocker_tsangan community layout keymap

- add license header
- add function layer
- remove trailing spaces in keymap readme

* add 65_ansi_blocker_tsangan_split_bs community layout keymap

* update 65_ansi_split_bs community layout keymap

- add license header
- add function layer

* update 65_iso community layout keymap

- add license header
- add function layer
- fix layout box drawing on Community Layout readme

* update 65_iso_blocker community layout keymap

- add license header
- add function layer
- fix layout box drawing on Community Layout readme

* update 65_iso_blocker_split_bs community layout keymap

- add license header
- add function layer
- fix layout box drawing on Community Layout readme

* add 65_iso_blocker_tsangan community layout keymap

* add 65_iso_blocker_tsangan_split_bs community layout keymap

* update 65_iso_split_bs community layout keymap

- add license header
- add function layer
- fix layout box drawing on Community Layout readme
2022-07-03 00:12:02 +01:00
yiancar
6a0814bb04
Update NK1 RGB animation defines (#17486) 2022-07-03 00:11:48 +01:00
Ralph Bacolod
3ed4a7086e
Update readme.md (#17489)
Fixed link to http://mkweb.bcgsc.ca/carpalx/?popular_alternatives
2022-07-03 00:10:30 +01:00
Andrew Kannan
43e33ba232
Add Gentoo Hotswap PCB to QMK (#17528) 2022-07-02 23:18:43 +01:00
Andrew Kannan
2011aec06f
Add Gentoo Solderable PCB to QMK (#17527) 2022-07-02 23:17:53 +01:00
stanrc85
bb1edf6676
[Userspace] Add Nasu to userspace code (#17524)
* Define Nasu indicator pins in userspace

* Add userspace indicator code to Nasu
2022-07-02 20:10:07 +01:00
Ciutadellla
4804b73540
Update info.json (#17530)
Change to correct keyboard name from reviung31 to reviung41
2022-07-02 20:09:21 +01:00
Evelien Dekkers
40d295abf6
[Keyboard] Add nt-650 (#17471)
Co-authored-by: Joel Challis <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-02 11:09:26 -07:00
James Young
18a1cbce75
Mikeneko 65 QMK Configurator touch-up and Community Layout Support (#17542)
* info.json: apply friendly formatting

* info.json: remove dead space from Configurator rendering

* rename LAYOUT_all to LAYOUT_65_ansi_blocker

* rules.mk: enable Community Layout support
2022-07-02 18:50:54 +01:00
James Young
9b8ae05796
Correct QMK Configurator layout data for Kin80 (#17526) 2022-07-03 00:32:09 +10:00
Nick Brassel
b9a6126518
Revert "[Keyboard]KPrepublic bm80v2 Keyboard ISO support " (#17537) 2022-07-03 00:23:21 +10:00
Nick Brassel
1b9491f8f3
Fixup builds for TzCI (#17538) 2022-07-03 00:23:08 +10:00
bruun-baer
5108d53169
Add a workman-miryoku hybrid keymap for the ferris sweep keyboard (#17511) 2022-07-03 00:11:53 +10:00
gourdo1
97dfdcb2bd
[keymap] Update gourdo1 keymap for Q2 changes (#17398) 2022-07-03 00:11:26 +10:00
HorrorTroll
d694488e2e
Added new keyboard KB16-01 (#17418) 2022-07-03 00:08:38 +10:00
Ryan
25033d5d9e
MSYS2 install: use MinGW python-qmk package (#17302)
* MSYS2 install: use MinGW python-qmk package

* Add missing flashers

* Note VC Redist for manual install

* VC Redist no longer needed
2022-07-02 15:08:05 +01:00
IFo Hancroft
1cffe5b6ce
My ErgoDox Keymap (finally perfected, I think) (#17208)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-03 00:06:23 +10:00
TJ
7c64a2bcaa
Add BigBoy macro pad (#16962)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-03 00:05:44 +10:00
Khairullah
81b7d6f67f
[Keyboard] Add Support to Ducky One2 SF (#17260) 2022-07-03 00:04:46 +10:00
Ricardo (XenGi) Band
9166a24d65
🚀 2022-07-02 16:03:07 +02:00
npspears
60ab61386e
add rotary encoder support for Quark^2 (#17470) 2022-07-03 00:01:08 +10:00
Yizhen Liu
5ac71ef27a
[Keyboard]KPrepublic bm80v2 Keyboard ANSI support (#17192)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 23:14:27 +10:00
Guilherme Bermêo
2aa4f7cf61
add crkbd/keymaps/bermeo (#17320)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 23:13:28 +10:00
zv0n
783d1cd458
[keyboard] annepro2 Add support for sticky keys (#17359) 2022-07-02 23:09:21 +10:00
Nick Brassel
7e926f5c93
Cleanup post-#17314. (#17536) 2022-07-02 23:08:39 +10:00
Vega Deftwing
e25879e836
[keymap] Add tiny text, full width characters to Ergodone->Vega (#17427) 2022-07-02 23:08:18 +10:00
DeskDaily
d66b5db1d6
Added 3 new keyboards (#17314)
Co-authored-by: Neil Brian Ramirez <nightlyboards@gmail.com>
2022-07-02 22:53:01 +10:00
Radliński Ignacy
5a727dbc6d
feat(keymap): add keebio/iris/rev6/radlinskii keymap (#17216)
Co-authored-by: ignacy-radlinski <ignacy.radlinski@schibsted.com>
2022-07-02 22:50:31 +10:00
CoffeeIsLife
0365f640af
Allow for RGB actions to take place on Keydown instead of Keyup (#16886)
* Allow for switch on keydown

* add docs
2022-07-02 22:49:49 +10:00
ripdog
4e35697e1a
Add note about qmk doctor in newbs_flashing.md (#15688)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:48:44 +10:00
Vino Rodrigues
ec6875af56
[Keyboard] New IDOBAO ID63 (a.k.a. Denwir D60) (#17144)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:46:42 +10:00
InonL
feea704da7
Added VIA support for Drop CTRL (#17336)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:42:45 +10:00
Murali S
0c84dd6bdc
Add keymaps for muralis and kuru (#17337)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Sree Vidya Sobha Dharmarajan <ssd@Srees-MacBook-Pro.local>
2022-07-02 22:42:13 +10:00
spooknik
3059d7883c
Swift65 Hotswap Support (#16987)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Steven Phillips <steven.phillips.17@me.com>
2022-07-02 22:41:32 +10:00
jpe230
07f6fba6de
Add Jpe230 Preonic Keymap (#17331) 2022-07-02 22:40:24 +10:00
Minke Zhang
4a3e0ef9ab
Add personal YMDK Split64 keymap (#16980)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:39:31 +10:00
Jairo Ramírez Ávila
56ecc86482
Added oriaj3 keymap with Matrix RGB support for Kimiko keyboard. (#17103)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:37:29 +10:00
Wolf Van Herreweghe
627f9321a8
Add base Ryujin firmware (#17187)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Wolf Van Herreweghe <wolfvh@getupgamesofficial.com>
2022-07-02 22:36:32 +10:00
Nick Brassel
3b14383f48 Fix line endings. 2022-07-02 22:20:30 +10:00
-k
5699763d4c
Update massdrop/alt:charlesrocket (#17297)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:19:35 +10:00
jels
ac333016eb
Add ATmega32u2 Support to HHKB (#17298) 2022-07-02 22:18:56 +10:00
David Kristoffersen
a80943579c
[Keymap] Add prog_qgmlwb keymap (#16890) 2022-07-02 22:18:21 +10:00
Jean Bernard
ef633cf461
Added MS Sculpt ISO-layout conversion with STM32F401 (#17049) 2022-07-02 22:16:38 +10:00
foureight84
9c2505676c
foureight84 keymap for sofle (#17246)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:08:13 +10:00
Will Winder
f03aec28fb
[Keyboard] Add Avalanche v4 (#17288)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:07:35 +10:00
Yizhen Liu
c3ef70b9a6
[Keyboard]KPrepublic bm80v2 Keyboard ISO support (#17193)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 22:06:38 +10:00
Aidan Gauland
8c4a5f9ba2
Add lkbm keymap (#17218) 2022-07-02 22:03:11 +10:00
jack
ee26d3e77f
Add Zsh note for tab complete (#17226) 2022-07-02 21:59:59 +10:00
PixelSpaceStudio
a80461e264
Add pixelspace user space and capsule65i keyboard (#17235) 2022-07-02 21:58:00 +10:00
Watson
48721b20fc
Updated revisions and added a keyboard (#16731)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: WestM <93159069+WestMProducts@users.noreply.github.com>
2022-07-02 21:55:10 +10:00
anubhav dhiman
c725f6f768
Add new keyboard AT3 (#17431)
Co-authored-by: zvecr <git@zvecr.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-02 21:46:29 +10:00
spx01
2f11509465
spx01 keymap for the kbd67mkiirgb (#17012) 2022-07-02 21:44:58 +10:00
Nick Krichevsky
69f0fc5868
Add workaround to allow Sesame to work without atomic interactions (#17034) 2022-07-02 21:43:36 +10:00
Xelus22
f8a56cd638
[Keyboard] RS108 Addition (#16989) 2022-07-02 21:42:48 +10:00
Josh Hinnebusch
096db8c8ca
Add LED backlight/indicator info to reference_info_json.md (#17010)
Co-authored-by: Joel Challis <git@zvecr.com>
2022-07-02 21:27:34 +10:00
Gardego5
6fce400ef5
Ut47.2 gardego5 layout (#16955) 2022-07-02 21:27:08 +10:00
Manna Harbour
3842b15cf1
[Keymap] Update Miryoku (#16482) 2022-07-02 21:26:23 +10:00
Daniil Iastremskii
f2f88bcfcc
Add elephant42 keyboard (#14336) 2022-07-02 21:22:51 +10:00
Batuhan Baserdem
fd44341cbf
Userspace and keymap update for user bbaserdem. (#14484) 2022-07-02 21:09:04 +10:00
Kan-Ru Chen
f439fe6055
HHKB YDKB Yang BT Controller (#15759)
Co-authored-by: Drashna Jaelre <drashna@live.com>
2022-07-02 21:01:03 +10:00
Taeyoon Kim
0eab24be26
Adding 34keys layout for kprepublic bm40 keyboard. (#15974) 2022-07-02 20:57:12 +10:00
moyi4681
578a3e3505
add baguette66 keyboard (#16429)
* add baguette66 keyboard

* Update keyboards/kbdfans/baguette66/soldered/config.h

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

* Update keyboards/kbdfans/baguette66/rgb/config.h

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

Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-02 20:54:22 +10:00
Nick Brassel
c8fbfca1b6
[QP] Explicit buffer alignment. (#17532) 2022-07-02 13:22:46 +10:00
Joel Challis
9d70162d53
Allow locate_keymap to handle DEFAULT_FOLDER (#17529) 2022-07-01 22:20:32 +01:00
Joel Challis
2757251218
Specify blackpill board files where relevant (#17521) 2022-07-01 15:38:57 +01:00
Joel Challis
d978432812
Swap over F4x1 8MHz HSE boards over from blackpill board files (#17520) 2022-07-01 15:36:08 +01:00
yiancar
1e643ba1d1
[Keyboard] Nebula12b (#17308)
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
Co-authored-by: yiancar <yiancar@gmail.com>
2022-06-30 23:11:13 -07:00
Jan Lindblom
38ca5e95e1
Adding Rev41lp keyboard (#15895)
* [keyboard] Add rev41lp

* [keymap] rev41lp: More layer, less clutter

* [keymap] rev41lp:whitespace cleanup

* [keymap] rev41lp: Remove outer shift & edit homerow timings

left-ctrl < left-shift
kc-enter < kc-sftent
lower + tab = grave
raise + tab = tilde

* Initial namnlos keymap for rev41lp.

* Updated according to PR checklist.

* Update keyboards/b_sides/rev41lp/config.h

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/rules.mk

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Update keyboards/b_sides/rev41lp/keymaps/default/keymap.c

Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>

* Updated to fulfill PR checklist.

* Update keyboards/b_sides/rev41lp/info.json

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

* Update keyboards/b_sides/rev41lp/config.h

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

* Update keyboards/b_sides/rev41lp/keymaps/cyril/config.h

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

* Update keyboards/b_sides/rev41lp/keymaps/cyril/keymap.c

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

* Update keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c

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

* Update keyboards/b_sides/rev41lp/keymaps/namnlos/rules.mk

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

* Update keyboards/b_sides/rev41lp/rules.mk

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

* Update keyboards/b_sides/rev41lp/rules.mk

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

* Update keyboards/b_sides/rev41lp/rules.mk

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

* Update keyboards/b_sides/rev41lp/readme.md

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

* Update keyboards/b_sides/rev41lp/readme.md

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

* Update keyboards/b_sides/rev41lp/keymaps/namnlos/keymap.c

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

* Update keyboards/b_sides/rev41lp/rules.mk

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

* Adding picture.

* Rename README.md to readme.md

* Cleaning up in rules.mk.

* Moving en- and em-dash from dedicated keys.

* Readme fixup.

There was a typo in the title, also changed the description a little.

* Update keyboards/b_sides/rev41lp/readme.md

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

* Update keyboards/b_sides/rev41lp/keymaps/namnlos/rules.mk

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

Co-authored-by: cyril279 <cyril.x9@gmail.com>
Co-authored-by: Albert Y <76888457+filterpaper@users.noreply.github.com>
Co-authored-by: Drashna Jaelre <drashna@live.com>
Co-authored-by: Ryan <fauxpark@gmail.com>
2022-07-01 13:02:07 +10:00
James Young
f2f2a7ace9
Add missing QMK Configurator layout data for chlx str.merro60 (#17518)
* add LAYOUT_60_ansi_split_bs_rshift layout data

* add LAYOUT_60_iso layout data
2022-06-30 23:39:49 +01:00
James Young
c1d4950938
Add QMK Configurator layout data for ADM42 rev4 (#17515) 2022-06-30 20:10:15 +01:00
4861 changed files with 88431 additions and 34148 deletions

View file

@ -2,5 +2,8 @@ version: 2
updates: updates:
- package-ecosystem: "github-actions" - package-ecosystem: "github-actions"
directory: "/" directory: "/"
labels: CI
reviewers:
- "qmk/collaborators"
schedule: schedule:
interval: "daily" interval: "daily"

View file

@ -34,7 +34,7 @@ jobs:
qmk --verbose generate-docs qmk --verbose generate-docs
- name: Deploy - name: Deploy
uses: JamesIves/github-pages-deploy-action@v4.3.4 uses: JamesIves/github-pages-deploy-action@v4.4.0
with: with:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
BASE_BRANCH: master BASE_BRANCH: master

19
.gitignore vendored
View file

@ -5,6 +5,10 @@
.DS_Store .DS_Store
._* ._*
# Merge files
*.orig
*.rej
# Build artifacts # Build artifacts
.clang_complete .clang_complete
.build/ .build/
@ -27,16 +31,11 @@ quantum/version.h
*.uf2 *.uf2
# Old-style QMK Makefiles # Old-style QMK Makefiles
/keyboards/*/Makefile /keyboards/**/Makefile
/keyboards/*/*/Makefile
/keyboards/*/*/*/Makefile # kbfirmware....
/keyboards/*/*/*/*/Makefile /keyboards/**/kb.h
/keyboards/*/*/*/*/*/Makefile /keyboards/**/kb.c
/keyboards/*/keymaps/Makefile
/keyboards/*/*/keymaps/Makefile
/keyboards/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/keymaps/Makefile
/keyboards/*/*/*/*/*/keymaps/Makefile
# Eclipse/PyCharm/Other IDE Settings # Eclipse/PyCharm/Other IDE Settings
*.iml *.iml

3
.gitmodules vendored
View file

@ -18,6 +18,3 @@
[submodule "lib/printf"] [submodule "lib/printf"]
path = lib/printf path = lib/printf
url = https://github.com/qmk/printf url = https://github.com/qmk/printf
[submodule "lib/pico-sdk"]
path = lib/pico-sdk
url = https://github.com/qmk/pico-sdk.git

View file

@ -401,7 +401,6 @@ ifndef SKIP_GIT
if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi if [ ! -e lib/lufa ]; then git submodule sync lib/lufa && git submodule update --depth 50 --init lib/lufa; fi
if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi if [ ! -e lib/vusb ]; then git submodule sync lib/vusb && git submodule update --depth 50 --init lib/vusb; fi
if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi if [ ! -e lib/printf ]; then git submodule sync lib/printf && git submodule update --depth 50 --init lib/printf; fi
if [ ! -e lib/pico-sdk ]; then git submodule sync lib/pico-sdk && git submodule update --depth 50 --init lib/pico-sdk; fi
git submodule status --recursive 2>/dev/null | \ git submodule status --recursive 2>/dev/null | \
while IFS= read -r x; do \ while IFS= read -r x; do \
case "$$x" in \ case "$$x" in \

View file

@ -200,10 +200,6 @@ ifeq ($(strip $(BOOTLOADER)), tinyuf2)
OPT_DEFS += -DBOOTLOADER_TINYUF2 OPT_DEFS += -DBOOTLOADER_TINYUF2
BOOTLOADER_TYPE = tinyuf2 BOOTLOADER_TYPE = tinyuf2
endif endif
ifeq ($(strip $(BOOTLOADER)), rp2040)
OPT_DEFS += -DBOOTLOADER_RP2040
BOOTLOADER_TYPE = rp2040
endif
ifeq ($(strip $(BOOTLOADER)), halfkay) ifeq ($(strip $(BOOTLOADER)), halfkay)
OPT_DEFS += -DBOOTLOADER_HALFKAY OPT_DEFS += -DBOOTLOADER_HALFKAY
BOOTLOADER_TYPE = halfkay BOOTLOADER_TYPE = halfkay

View file

@ -13,14 +13,6 @@ endif
include paths.mk include paths.mk
include $(BUILDDEFS_PATH)/message.mk include $(BUILDDEFS_PATH)/message.mk
# Helper to add defines with a 'QMK_' prefix
define add_qmk_prefix_defs
ifdef $1
# Need to cater for 'STM32L4xx+'
OPT_DEFS += -DQMK_$(2)="$($1)" -DQMK_$(2)_$(shell echo $($1) | sed -e 's@+@Plus@g' -e 's@[^a-zA-Z0-9]@_@g' | tr '[:lower:]' '[:upper:]')
endif
endef
# Set the qmk cli to use # Set the qmk cli to use
QMK_BIN ?= qmk QMK_BIN ?= qmk
@ -398,12 +390,10 @@ ifneq ("$(KEYMAP_H)","")
CONFIG_H += $(KEYMAP_H) CONFIG_H += $(KEYMAP_H)
endif endif
OPT_DEFS += -DKEYMAP_C=\"$(KEYMAP_C)\"
# project specific files # project specific files
SRC += \ SRC += \
$(KEYBOARD_SRC) \ $(KEYBOARD_SRC) \
$(QUANTUM_DIR)/keymap_introspection.c \ $(KEYMAP_C) \
$(QUANTUM_SRC) \ $(QUANTUM_SRC) \
$(QUANTUM_DIR)/main.c \ $(QUANTUM_DIR)/main.c \
@ -446,14 +436,6 @@ else
include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk include $(TMK_PATH)/protocol/$(PLATFORM_KEY).mk
endif endif
# Setup definitions based on the selected MCU
$(eval $(call add_qmk_prefix_defs,MCU_ORIG,MCU))
$(eval $(call add_qmk_prefix_defs,MCU_ARCH,MCU_ARCH))
$(eval $(call add_qmk_prefix_defs,MCU_PORT_NAME,MCU_PORT_NAME))
$(eval $(call add_qmk_prefix_defs,MCU_FAMILY,MCU_FAMILY))
$(eval $(call add_qmk_prefix_defs,MCU_SERIES,MCU_SERIES))
$(eval $(call add_qmk_prefix_defs,BOARD,BOARD))
# TODO: remove this bodge? # TODO: remove this bodge?
PROJECT_DEFS := $(OPT_DEFS) PROJECT_DEFS := $(OPT_DEFS)
PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS) PROJECT_INC := $(VPATH) $(EXTRAINCDIRS) $(KEYBOARD_PATHS)
@ -487,19 +469,6 @@ check-size: build
check-md5: build check-md5: build
objs-size: build objs-size: build
ifeq ($(strip $(TOP_SYMBOLS)),yes)
all: top-symbols
check-size: top-symbols
top-symbols: build
echo "###########################################"
echo "# Highest flash usage:"
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [t] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
echo "# Highest RAM usage:"
$(NM) -Crtd --size-sort $(BUILD_DIR)/$(TARGET).elf | grep -i ' [dbv] ' | head -n10 | sed -e 's#^0000000# #g' -e 's#^000000# #g' -e 's#^00000# #g' -e 's#^0000# #g' -e 's#^000# #g' -e 's#^00# #g' -e 's#^0# #g'
echo "###########################################"
endif
include $(BUILDDEFS_PATH)/show_options.mk include $(BUILDDEFS_PATH)/show_options.mk
include $(BUILDDEFS_PATH)/common_rules.mk include $(BUILDDEFS_PATH)/common_rules.mk

View file

@ -42,7 +42,7 @@ VPATH += \
all: elf all: elf
VPATH += $(TEST_PATH) $(COMMON_VPATH) VPATH += $(COMMON_VPATH)
PLATFORM:=TEST PLATFORM:=TEST
PLATFORM_KEY:=test PLATFORM_KEY:=test
BOOTLOADER_TYPE:=none BOOTLOADER_TYPE:=none
@ -63,7 +63,6 @@ include $(TMK_PATH)/protocol.mk
include $(QUANTUM_PATH)/debounce/tests/rules.mk include $(QUANTUM_PATH)/debounce/tests/rules.mk
include $(QUANTUM_PATH)/encoder/tests/rules.mk include $(QUANTUM_PATH)/encoder/tests/rules.mk
include $(QUANTUM_PATH)/sequencer/tests/rules.mk include $(QUANTUM_PATH)/sequencer/tests/rules.mk
include $(QUANTUM_PATH)/wear_leveling/tests/rules.mk
include $(PLATFORM_PATH)/test/rules.mk include $(PLATFORM_PATH)/test/rules.mk
ifneq ($(filter $(FULL_TESTS),$(TEST)),) ifneq ($(filter $(FULL_TESTS),$(TEST)),)
include $(BUILDDEFS_PATH)/build_full_test.mk include $(BUILDDEFS_PATH)/build_full_test.mk

View file

@ -92,29 +92,10 @@ ifeq ($(MUSIC_ENABLE), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_music.c SRC += $(QUANTUM_DIR)/process_keycode/process_music.c
endif endif
VALID_STENO_PROTOCOL_TYPES := geminipr txbolt all
STENO_PROTOCOL ?= all
ifeq ($(strip $(STENO_ENABLE)), yes) ifeq ($(strip $(STENO_ENABLE)), yes)
ifeq ($(filter $(STENO_PROTOCOL),$(VALID_STENO_PROTOCOL_TYPES)),) OPT_DEFS += -DSTENO_ENABLE
$(call CATASTROPHIC_ERROR,Invalid STENO_PROTOCOL,STENO_PROTOCOL="$(STENO_PROTOCOL)" is not a valid stenography protocol) VIRTSER_ENABLE ?= yes
else SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
OPT_DEFS += -DSTENO_ENABLE
VIRTSER_ENABLE ?= yes
ifeq ($(strip $(STENO_PROTOCOL)), geminipr)
OPT_DEFS += -DSTENO_ENABLE_GEMINI
endif
ifeq ($(strip $(STENO_PROTOCOL)), txbolt)
OPT_DEFS += -DSTENO_ENABLE_BOLT
endif
ifeq ($(strip $(STENO_PROTOCOL)), all)
OPT_DEFS += -DSTENO_ENABLE_ALL
OPT_DEFS += -DSTENO_ENABLE_GEMINI
OPT_DEFS += -DSTENO_ENABLE_BOLT
endif
SRC += $(QUANTUM_DIR)/process_keycode/process_steno.c
endif
endif endif
ifeq ($(strip $(VIRTSER_ENABLE)), yes) ifeq ($(strip $(VIRTSER_ENABLE)), yes)
@ -173,36 +154,33 @@ ifeq ($(strip $(QUANTUM_PAINTER_ENABLE)), yes)
include $(QUANTUM_DIR)/painter/rules.mk include $(QUANTUM_DIR)/painter/rules.mk
endif endif
VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi wear_leveling VALID_EEPROM_DRIVER_TYPES := vendor custom transient i2c spi
EEPROM_DRIVER ?= vendor EEPROM_DRIVER ?= vendor
ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),) ifeq ($(filter $(EEPROM_DRIVER),$(VALID_EEPROM_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver) $(call CATASTROPHIC_ERROR,Invalid EEPROM_DRIVER,EEPROM_DRIVER="$(EEPROM_DRIVER)" is not a valid EEPROM driver)
else else
OPT_DEFS += -DEEPROM_ENABLE OPT_DEFS += -DEEPROM_ENABLE
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
COMMON_VPATH += $(DRIVER_PATH)/eeprom
COMMON_VPATH += $(PLATFORM_COMMON_DIR)
ifeq ($(strip $(EEPROM_DRIVER)), custom) ifeq ($(strip $(EEPROM_DRIVER)), custom)
# Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block # Custom EEPROM implementation -- only needs to implement init/erase/read_block/write_block
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_CUSTOM
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c SRC += eeprom_driver.c
else ifeq ($(strip $(EEPROM_DRIVER)), wear_leveling)
# Wear-leveling EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_WEAR_LEVELING
SRC += eeprom_driver.c eeprom_wear_leveling.c
else ifeq ($(strip $(EEPROM_DRIVER)), i2c) else ifeq ($(strip $(EEPROM_DRIVER)), i2c)
# External I2C EEPROM implementation # External I2C EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_I2C
COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += i2c_master.c QUANTUM_LIB_SRC += i2c_master.c
SRC += eeprom_driver.c eeprom_i2c.c SRC += eeprom_driver.c eeprom_i2c.c
else ifeq ($(strip $(EEPROM_DRIVER)), spi) else ifeq ($(strip $(EEPROM_DRIVER)), spi)
# External SPI EEPROM implementation # External SPI EEPROM implementation
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_SPI
COMMON_VPATH += $(DRIVER_PATH)/eeprom
QUANTUM_LIB_SRC += spi_master.c QUANTUM_LIB_SRC += spi_master.c
SRC += eeprom_driver.c eeprom_spi.c SRC += eeprom_driver.c eeprom_spi.c
else ifeq ($(strip $(EEPROM_DRIVER)), transient) else ifeq ($(strip $(EEPROM_DRIVER)), transient)
# Transient EEPROM implementation -- no data storage but provides runtime area for it # Transient EEPROM implementation -- no data storage but provides runtime area for it
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_transient.c SRC += eeprom_driver.c eeprom_transient.c
else ifeq ($(strip $(EEPROM_DRIVER)), vendor) else ifeq ($(strip $(EEPROM_DRIVER)), vendor)
# Vendor-implemented EEPROM # Vendor-implemented EEPROM
@ -213,13 +191,17 @@ else
ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),) ifneq ($(filter STM32F3xx_% STM32F1xx_% %_STM32F401xC %_STM32F401xE %_STM32F405xG %_STM32F411xE %_STM32F072xB %_STM32F042x6 %_GD32VF103xB %_GD32VF103x8, $(MCU_SERIES)_$(MCU_LDSCRIPT)),)
# Emulated EEPROM # Emulated EEPROM
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_FLASH_EMULATED
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash COMMON_VPATH += $(DRIVER_PATH)/eeprom
COMMON_VPATH += $(DRIVER_PATH)/flash SRC += eeprom_driver.c
SRC += eeprom_driver.c eeprom_stm32.c flash_stm32.c SRC += $(PLATFORM_COMMON_DIR)/eeprom_stm32.c
SRC += $(PLATFORM_COMMON_DIR)/flash_stm32.c
else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),) else ifneq ($(filter $(MCU_SERIES),STM32L0xx STM32L1xx),)
# True EEPROM on STM32L0xx, L1xx # True EEPROM on STM32L0xx, L1xx
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1 OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_STM32_L0_L1
SRC += eeprom_driver.c eeprom_stm32_L0_L1.c COMMON_VPATH += $(DRIVER_PATH)/eeprom
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/eeprom
SRC += eeprom_driver.c
SRC += eeprom_stm32_L0_L1.c
else ifneq ($(filter $(MCU_SERIES),KL2x K20x),) else ifneq ($(filter $(MCU_SERIES),KL2x K20x),)
# Teensy EEPROM implementations # Teensy EEPROM implementations
OPT_DEFS += -DEEPROM_TEENSY OPT_DEFS += -DEEPROM_TEENSY
@ -227,61 +209,32 @@ else
else else
# Fall back to transient, i.e. non-persistent # Fall back to transient, i.e. non-persistent
OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT OPT_DEFS += -DEEPROM_DRIVER -DEEPROM_TRANSIENT
COMMON_VPATH += $(DRIVER_PATH)/eeprom
SRC += eeprom_driver.c eeprom_transient.c SRC += eeprom_driver.c eeprom_transient.c
endif endif
else ifeq ($(PLATFORM),ARM_ATSAM) else ifeq ($(PLATFORM),ARM_ATSAM)
# arm_atsam EEPROM # arm_atsam EEPROM
OPT_DEFS += -DEEPROM_SAMD OPT_DEFS += -DEEPROM_SAMD
SRC += eeprom_samd.c SRC += $(PLATFORM_COMMON_DIR)/eeprom_samd.c
else ifeq ($(PLATFORM),TEST) else ifeq ($(PLATFORM),TEST)
# Test harness "EEPROM" # Test harness "EEPROM"
OPT_DEFS += -DEEPROM_TEST_HARNESS OPT_DEFS += -DEEPROM_TEST_HARNESS
SRC += eeprom.c SRC += $(PLATFORM_COMMON_DIR)/eeprom.c
endif
endif
endif
VALID_WEAR_LEVELING_DRIVER_TYPES := custom embedded_flash spi_flash legacy
WEAR_LEVELING_DRIVER ?= none
ifneq ($(strip $(WEAR_LEVELING_DRIVER)),none)
ifeq ($(filter $(WEAR_LEVELING_DRIVER),$(VALID_WEAR_LEVELING_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid WEAR_LEVELING_DRIVER,WEAR_LEVELING_DRIVER="$(WEAR_LEVELING_DRIVER)" is not a valid wear leveling driver)
else
FNV_ENABLE := yes
OPT_DEFS += -DWEAR_LEVELING_ENABLE
OPT_DEFS += -DWEAR_LEVELING_$(strip $(shell echo $(WEAR_LEVELING_DRIVER) | tr '[:lower:]' '[:upper:]'))
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling
COMMON_VPATH += $(DRIVER_PATH)/wear_leveling
COMMON_VPATH += $(QUANTUM_DIR)/wear_leveling
SRC += wear_leveling.c
ifeq ($(strip $(WEAR_LEVELING_DRIVER)), embedded_flash)
OPT_DEFS += -DHAL_USE_EFL
SRC += wear_leveling_efl.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_efl_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), spi_flash)
FLASH_DRIVER := spi
SRC += wear_leveling_flash_spi.c
POST_CONFIG_H += $(DRIVER_PATH)/wear_leveling/wear_leveling_flash_spi_config.h
else ifeq ($(strip $(WEAR_LEVELING_DRIVER)), legacy)
COMMON_VPATH += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/flash
SRC += flash_stm32.c wear_leveling_legacy.c
POST_CONFIG_H += $(PLATFORM_PATH)/$(PLATFORM_KEY)/$(DRIVER_DIR)/wear_leveling/wear_leveling_legacy_config.h
endif endif
endif endif
endif endif
VALID_FLASH_DRIVER_TYPES := spi VALID_FLASH_DRIVER_TYPES := spi
FLASH_DRIVER ?= none FLASH_DRIVER ?= no
ifneq ($(strip $(FLASH_DRIVER)), none) ifneq ($(strip $(FLASH_DRIVER)), no)
ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),) ifeq ($(filter $(FLASH_DRIVER),$(VALID_FLASH_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid FLASH_DRIVER,FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid flash driver) $(error FLASH_DRIVER="$(FLASH_DRIVER)" is not a valid FLASH driver)
else else
OPT_DEFS += -DFLASH_ENABLE OPT_DEFS += -DFLASH_ENABLE
ifeq ($(strip $(FLASH_DRIVER)),spi) ifeq ($(strip $(FLASH_DRIVER)), spi)
OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI OPT_DEFS += -DFLASH_DRIVER -DFLASH_SPI
COMMON_VPATH += $(DRIVER_PATH)/flash COMMON_VPATH += $(DRIVER_PATH)/flash
SRC += flash_spi.c SRC += flash_spi.c
QUANTUM_LIB_SRC += spi_master.c
endif endif
endif endif
endif endif
@ -547,7 +500,7 @@ ifeq ($(strip $(BACKLIGHT_ENABLE)), yes)
endif endif
endif endif
VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c vendor VALID_WS2812_DRIVER_TYPES := bitbang pwm spi i2c
WS2812_DRIVER ?= bitbang WS2812_DRIVER ?= bitbang
ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes) ifeq ($(strip $(WS2812_DRIVER_REQUIRED)), yes)
@ -589,6 +542,12 @@ ifeq ($(strip $(LED_TABLES)), yes)
SRC += $(QUANTUM_DIR)/led_tables.c SRC += $(QUANTUM_DIR)/led_tables.c
endif endif
ifeq ($(strip $(TERMINAL_ENABLE)), yes)
SRC += $(QUANTUM_DIR)/process_keycode/process_terminal.c
OPT_DEFS += -DTERMINAL_ENABLE
OPT_DEFS += -DUSER_PRINT
endif
ifeq ($(strip $(VIA_ENABLE)), yes) ifeq ($(strip $(VIA_ENABLE)), yes)
DYNAMIC_KEYMAP_ENABLE := yes DYNAMIC_KEYMAP_ENABLE := yes
RAW_ENABLE := yes RAW_ENABLE := yes
@ -636,14 +595,6 @@ ifneq ($(strip $(DEBOUNCE_TYPE)), custom)
QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c QUANTUM_SRC += $(QUANTUM_DIR)/debounce/$(strip $(DEBOUNCE_TYPE)).c
endif endif
VALID_SERIAL_DRIVER_TYPES := bitbang usart vendor
SERIAL_DRIVER ?= bitbang
ifeq ($(filter $(SERIAL_DRIVER),$(VALID_SERIAL_DRIVER_TYPES)),)
$(call CATASTROPHIC_ERROR,Invalid SERIAL_DRIVER,SERIAL_DRIVER="$(SERIAL_DRIVER)" is not a valid SERIAL driver)
endif
ifeq ($(strip $(SPLIT_KEYBOARD)), yes) ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h POST_CONFIG_H += $(QUANTUM_DIR)/split_common/post_config.h
OPT_DEFS += -DSPLIT_KEYBOARD OPT_DEFS += -DSPLIT_KEYBOARD
@ -668,11 +619,11 @@ ifeq ($(strip $(SPLIT_KEYBOARD)), yes)
endif endif
endif endif
SERIAL_DRIVER ?= bitbang
OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]')) OPT_DEFS += -DSERIAL_DRIVER_$(strip $(shell echo $(SERIAL_DRIVER) | tr '[:lower:]' '[:upper:]'))
ifeq ($(strip $(SERIAL_DRIVER)), bitbang) ifeq ($(strip $(SERIAL_DRIVER)), bitbang)
QUANTUM_LIB_SRC += serial.c QUANTUM_LIB_SRC += serial.c
else else
QUANTUM_LIB_SRC += serial_protocol.c
QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c QUANTUM_LIB_SRC += serial_$(strip $(SERIAL_DRIVER)).c
endif endif
endif endif
@ -684,12 +635,6 @@ ifeq ($(strip $(CRC_ENABLE)), yes)
SRC += crc.c SRC += crc.c
endif endif
ifeq ($(strip $(FNV_ENABLE)), yes)
OPT_DEFS += -DFNV_ENABLE
VPATH += $(LIB_PATH)/fnv
SRC += qmk_fnv_type_validation.c hash_32a.c hash_64a.c
endif
ifeq ($(strip $(HAPTIC_ENABLE)),yes) ifeq ($(strip $(HAPTIC_ENABLE)),yes)
COMMON_VPATH += $(DRIVER_PATH)/haptic COMMON_VPATH += $(DRIVER_PATH)/haptic

View file

@ -1,5 +1,19 @@
# Hey Emacs, this is a -*- makefile -*- # Hey Emacs, this is a -*- makefile -*-
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Jg Wunsch, et al.
#
# Released to the Public Domain
#
# Additional material for this makefile was written by:
# Peter Fleury
# Tim Henigan
# Colin O'Flynn
# Reiner Patommel
# Markus Pfaff
# Sander Pool
# Frederik Rouleau
# Carlos Lamas
#
# Enable vpath seraching for source files only # Enable vpath seraching for source files only
# Without this, output files, could be read from the wrong .build directories # Without this, output files, could be read from the wrong .build directories
@ -24,15 +38,36 @@ NO_LTO_OBJ := $(filter %.a,$(OBJ))
MASTER_OUTPUT := $(firstword $(OUTPUTS)) MASTER_OUTPUT := $(firstword $(OUTPUTS))
# Output format. (can be srec, ihex, binary) # Output format. (can be srec, ihex, binary)
FORMAT = ihex FORMAT = ihex
# Optimization level, can be [0, 1, 2, 3, s]. # Optimization level, can be [0, 1, 2, 3, s].
# 0 = turn off optimization. s = optimize for size.
# (Note: 3 is not always the best optimization level. See avr-libc FAQ.)
OPT ?= s OPT ?= s
# Compiler flag to set the C and C++ language standard level # Compiler flag to set the C Standard level.
CSTANDARD = -std=gnu11 # c89 = "ANSI" C
CXXSTANDARD = -std=gnu++14 # gnu89 = c89 plus GCC extensions
# c99 = ISO C99 standard (not yet fully implemented)
# gnu99 = c99 plus GCC extensions
CSTANDARD = -std=gnu99
# Place -D or -U options here for C sources
#CDEFS +=
# Place -D or -U options here for ASM sources
#ADEFS +=
# Place -D or -U options here for C++ sources
#CXXDEFS += -D__STDC_LIMIT_MACROS
#CXXDEFS += -D__STDC_CONSTANT_MACROS
#CXXDEFS +=
# Speed up recompilations by opt-in usage of ccache # Speed up recompilations by opt-in usage of ccache
USE_CCACHE ?= no USE_CCACHE ?= no
@ -40,8 +75,12 @@ ifneq ($(USE_CCACHE),no)
CC_PREFIX ?= ccache CC_PREFIX ?= ccache
endif endif
#---------------- C Compiler Options ---------------- #---------------- Compiler Options C ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
ifeq ($(strip $(LTO_ENABLE)), yes) ifeq ($(strip $(LTO_ENABLE)), yes)
ifeq ($(PLATFORM),ARM_ATSAM) ifeq ($(PLATFORM),ARM_ATSAM)
$(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.) $(info Enabling LTO on arm_atsam-targeting boards is known to have a high likelihood of failure.)
@ -72,14 +111,23 @@ CFLAGS += -Wstrict-prototypes
ifneq ($(strip $(ALLOW_WARNINGS)), yes) ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CFLAGS += -Werror CFLAGS += -Werror
endif endif
#CFLAGS += -mshort-calls
#CFLAGS += -fno-unit-at-a-time
#CFLAGS += -Wundef
#CFLAGS += -Wunreachable-code
#CFLAGS += -Wsign-compare
CFLAGS += $(CSTANDARD) CFLAGS += $(CSTANDARD)
# This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION # This fixes lots of keyboards linking errors but SHOULDN'T BE A FINAL SOLUTION
# Fixing of multiple variable definitions must be made. # Fixing of multiple variable definitions must be made.
CFLAGS += -fcommon CFLAGS += -fcommon
#---------------- C++ Compiler Options ---------------- #---------------- Compiler Options C++ ----------------
# -g*: generate debugging information
# -O*: optimization level
# -f...: tuning, see GCC manual and avr-libc documentation
# -Wall...: warning level
# -Wa,...: tell GCC to pass this to the assembler.
ifeq ($(strip $(DEBUG_ENABLE)),yes) ifeq ($(strip $(DEBUG_ENABLE)),yes)
CXXFLAGS += -g$(DEBUG) CXXFLAGS += -g$(DEBUG)
endif endif
@ -93,17 +141,57 @@ CXXFLAGS += -Wundef
ifneq ($(strip $(ALLOW_WARNINGS)), yes) ifneq ($(strip $(ALLOW_WARNINGS)), yes)
CXXFLAGS += -Werror CXXFLAGS += -Werror
endif endif
#CXXFLAGS += -mshort-calls
#CXXFLAGS += -fno-unit-at-a-time
#CXXFLAGS += -Wstrict-prototypes
#CXXFLAGS += -Wunreachable-code
#CXXFLAGS += -Wsign-compare
#CXXFLAGS += $(CSTANDARD)
#---------------- Assembler Options ---------------- #---------------- Assembler Options ----------------
ASFLAGS += $(ADEFS) ASFLAGS += $(ADEFS)
ifeq ($(VERBOSE_AS_CMD),yes) ifeq ($(VERBOSE_AS_CMD),yes)
ASFLAGS += -v ASFLAGS += -v
endif endif
#---------------- Linker Options ---------------- #---------------- Library Options ----------------
# Minimalistic printf version
PRINTF_LIB_MIN = -Wl,-u,vfprintf -lprintf_min
# Floating point printf version (requires MATH_LIB = -lm below)
PRINTF_LIB_FLOAT = -Wl,-u,vfprintf -lprintf_flt
# If this is left blank, then it will use the Standard printf version.
PRINTF_LIB =
#PRINTF_LIB = $(PRINTF_LIB_MIN)
#PRINTF_LIB = $(PRINTF_LIB_FLOAT)
# Minimalistic scanf version
SCANF_LIB_MIN = -Wl,-u,vfscanf -lscanf_min
# Floating point + %[ scanf version (requires MATH_LIB = -lm below)
SCANF_LIB_FLOAT = -Wl,-u,vfscanf -lscanf_flt
# If this is left blank, then it will use the Standard scanf version.
SCANF_LIB =
#SCANF_LIB = $(SCANF_LIB_MIN)
#SCANF_LIB = $(SCANF_LIB_FLOAT)
MATH_LIB = -lm
CREATE_MAP ?= yes CREATE_MAP ?= yes
#---------------- Linker Options ----------------
# -Wl,...: tell GCC to pass this to linker.
# -Map: create map file
# --cref: add cross reference to map file
#
# Comennt out "--relax" option to avoid a error such:
# (.vectors+0x30): relocation truncated to fit: R_AVR_13_PCREL against symbol `__vector_12'
#
ifeq ($(CREATE_MAP),yes) ifeq ($(CREATE_MAP),yes)
LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref LDFLAGS += -Wl,-Map=$(BUILD_DIR)/$(TARGET).map,--cref
endif endif
@ -113,11 +201,20 @@ endif
#LDFLAGS += -Wl,--relax #LDFLAGS += -Wl,--relax
LDFLAGS += $(EXTMEMOPTS) LDFLAGS += $(EXTMEMOPTS)
LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS)) LDFLAGS += $(patsubst %,-L%,$(EXTRALIBDIRS))
LDFLAGS += -lm LDFLAGS += $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)
#LDFLAGS += -T linker_script.x
# You can give EXTRALDFLAGS at 'make' command line. # You can give EXTRALDFLAGS at 'make' command line.
LDFLAGS += $(EXTRALDFLAGS) LDFLAGS += $(EXTRALDFLAGS)
#---------------- Assembler Listings ---------------- #---------------- Assembler Listings ----------------
# -Wa,...: tell GCC to pass this to the assembler.
# -adhlns: create listing
# -gstabs: have the assembler create line number information; note that
# for use in COFF files, additional information about filenames
# and function names needs to be present in the assembler source
# files -- see avr-libc docs [FIXME: not yet described there]
# -listing-cont-lines: Sets the maximum number of continuation lines of hex
# dump that will be displayed for a given single line of source input.
ADHLNS_ENABLE ?= no ADHLNS_ENABLE ?= no
ifeq ($(ADHLNS_ENABLE),yes) ifeq ($(ADHLNS_ENABLE),yes)

View file

@ -116,41 +116,6 @@ ifneq ($(findstring MK66FX1M0, $(MCU)),)
BOARD ?= PJRC_TEENSY_3_6 BOARD ?= PJRC_TEENSY_3_6
endif endif
ifneq ($(findstring RP2040, $(MCU)),)
# Cortex version
MCU = cortex-m0plus
# ARM version, CORTEX-M0/M1 are 6, CORTEX-M3/M4/M7 are 7
CHIBIOS_PORT = ARMv6-M-RP2
## chip/board settings
# - the next two should match the directories in
# <chibios[-contrib]>/os/hal/ports/$(MCU_PORT_NAME)/$(MCU_SERIES)
# OR
# <chibios[-contrib]>/os/hal/ports/$(MCU_FAMILY)/$(MCU_SERIES)
MCU_FAMILY = RP
MCU_SERIES = RP2040
# Linker script to use
# - it should exist either in <chibios>/os/common/ports/ARMCMx/compilers/GCC/ld/
# or <keyboard_dir>/ld/
STARTUPLD_CONTRIB = $(CHIBIOS_CONTRIB)/os/common/startup/ARMCMx/compilers/GCC/ld
MCU_LDSCRIPT ?= RP2040_FLASH
LDFLAGS += -L $(STARTUPLD_CONTRIB)
# Startup code to use
# - it should exist in <chibios>/os/common/startup/ARMCMx/compilers/GCC/mk/
MCU_STARTUP ?= rp2040
# Board: it should exist either in <chibios>/os/hal/boards/,
# <keyboard_dir>/boards/, or drivers/boards/
BOARD ?= GENERIC_PROMICRO_RP2040
# Default UF2 Bootloader settings
UF2_FAMILY ?= RP2040
FIRMWARE_FORMAT ?= uf2
endif
ifneq ($(findstring STM32F042, $(MCU)),) ifneq ($(findstring STM32F042, $(MCU)),)
# Cortex version # Cortex version
MCU = cortex-m0 MCU = cortex-m0

View file

@ -5,6 +5,7 @@ BUILD_OPTION_NAMES = \
CONSOLE_ENABLE \ CONSOLE_ENABLE \
COMMAND_ENABLE \ COMMAND_ENABLE \
NKRO_ENABLE \ NKRO_ENABLE \
TERMINAL_ENABLE \
CUSTOM_MATRIX \ CUSTOM_MATRIX \
DEBOUNCE_TYPE \ DEBOUNCE_TYPE \
SPLIT_KEYBOARD \ SPLIT_KEYBOARD \
@ -45,7 +46,6 @@ OTHER_OPTION_NAMES = \
LEADER_ENABLE \ LEADER_ENABLE \
PRINTING_ENABLE \ PRINTING_ENABLE \
STENO_ENABLE \ STENO_ENABLE \
STENO_PROTOCOL \
TAP_DANCE_ENABLE \ TAP_DANCE_ENABLE \
VIRTSER_ENABLE \ VIRTSER_ENABLE \
OLED_ENABLE \ OLED_ENABLE \

View file

@ -4,7 +4,6 @@ FULL_TESTS := $(notdir $(TEST_LIST))
include $(QUANTUM_PATH)/debounce/tests/testlist.mk include $(QUANTUM_PATH)/debounce/tests/testlist.mk
include $(QUANTUM_PATH)/encoder/tests/testlist.mk include $(QUANTUM_PATH)/encoder/tests/testlist.mk
include $(QUANTUM_PATH)/sequencer/tests/testlist.mk include $(QUANTUM_PATH)/sequencer/tests/testlist.mk
include $(QUANTUM_PATH)/wear_leveling/tests/testlist.mk
include $(PLATFORM_PATH)/test/testlist.mk include $(PLATFORM_PATH)/test/testlist.mk
define VALIDATE_TEST_LIST define VALIDATE_TEST_LIST

View file

@ -12,7 +12,6 @@
"AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"}, "AUDIO_VOICES": {"info_key": "audio.voices", "value_type": "bool"},
"BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"}, "BACKLIGHT_BREATHING": {"info_key": "backlight.breathing", "value_type": "bool"},
"BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"}, "BREATHING_PERIOD": {"info_key": "backlight.breathing_period", "value_type": "int"},
"BACKLIGHT_ON_STATE": {"info_key": "backlight.on_state", "value_type": "int"},
"BACKLIGHT_PIN": {"info_key": "backlight.pin"}, "BACKLIGHT_PIN": {"info_key": "backlight.pin"},
"BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"}, "BOTH_SHIFTS_TURNS_ON_CAPS_WORD": {"info_key": "caps_word.both_shifts_turns_on", "value_type": "bool"},
"CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"}, "CAPS_WORD_IDLE_TIMEOUT": {"info_key": "caps_word.idle_timeout", "value_type": "int"},
@ -36,9 +35,6 @@
"LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"}, "LED_CAPS_LOCK_PIN": {"info_key": "indicators.caps_lock"},
"LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"}, "LED_NUM_LOCK_PIN": {"info_key": "indicators.num_lock"},
"LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"}, "LED_SCROLL_LOCK_PIN": {"info_key": "indicators.scroll_lock"},
"LED_COMPOSE_PIN": {"info_key": "indicators.compose"},
"LED_KANA_PIN": {"info_key": "indicators.kana"},
"LED_PIN_ON_STATE": {"info_key": "indicators.on_state", "value_type": "int"},
"MANUFACTURER": {"info_key": "manufacturer"}, "MANUFACTURER": {"info_key": "manufacturer"},
"MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"}, "MATRIX_HAS_GHOST": {"info_key": "matrix_pins.ghost", "value_type": "bool"},
"MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"}, "MATRIX_IO_DELAY": {"info_key": "matrix_pins.io_delay", "value_type": "int"},

View file

@ -13,7 +13,6 @@
"BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false}, "BOOTLOADER": {"info_key": "bootloader", "warn_duplicate": false},
"BLUETOOTH": {"info_key": "bluetooth.driver"}, "BLUETOOTH": {"info_key": "bluetooth.driver"},
"CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"}, "CAPS_WORD_ENABLE": {"info_key": "caps_word.enabled", "value_type": "bool"},
"ENCODER_ENABLE": {"info_key": "encoder.enabled", "value_type": "bool"},
"FIRMWARE_FORMAT": {"info_key": "build.firmware_format"}, "FIRMWARE_FORMAT": {"info_key": "build.firmware_format"},
"KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"}, "KEYBOARD_SHARED_EP": {"info_key": "usb.shared_endpoint.keyboard", "value_type": "bool"},
"MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"}, "MOUSE_SHARED_EP": {"info_key": "usb.shared_endpoint.mouse", "value_type": "bool"},
@ -28,8 +27,6 @@
"SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"}, "SPLIT_KEYBOARD": {"info_key": "split.enabled", "value_type": "bool"},
"SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false}, "SPLIT_TRANSPORT": {"info_key": "split.transport.protocol", "to_c": false},
"WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"}, "WAIT_FOR_USB": {"info_key": "usb.wait_for", "value_type": "bool"},
"STENO_ENABLE": {"info_key": "stenography.enabled", "value_type": "bool"},
"STENO_PROTOCOL": {"info_key": "stenography.protocol"},
# Items we want flagged in lint # Items we want flagged in lint
"CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true}, "CTPC": {"info_key": "_deprecated.ctpc", "deprecated": true},

View file

@ -1,5 +1,5 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
"$id": "qmk.definitions.v1", "$id": "qmk.definitions.v1",
"title": "Common definitions used across QMK's jsonschemas.", "title": "Common definitions used across QMK's jsonschemas.",
"type": "object", "type": "object",
@ -65,7 +65,8 @@
] ]
}, },
"key_unit": { "key_unit": {
"type": "number" "type": "number",
"min": 0.25
}, },
"keyboard": { "keyboard": {
"oneOf": [ "oneOf": [
@ -102,11 +103,8 @@
"pattern": "^LINE_PIN\\d{1,2}$" "pattern": "^LINE_PIN\\d{1,2}$"
}, },
{ {
"type": "string", "type": "number",
"pattern": "^GP\\d{1,2}$" "multipleOf": 1
},
{
"type": "integer"
}, },
{ {
"type": "null" "type": "null"
@ -117,12 +115,14 @@
"type": "number" "type": "number"
}, },
"signed_int": { "signed_int": {
"type": "integer" "type": "number",
"multipleOf": 1
}, },
"signed_int_8": { "signed_int_8": {
"type": "integer", "type": "number",
"minimum": -127, "min": -127,
"maximum": 127 "max": 127,
"multipleOf": 1
}, },
"string_array": { "string_array": {
"type": "array", "type": "array",
@ -138,20 +138,17 @@
}, },
"unsigned_decimal": { "unsigned_decimal": {
"type": "number", "type": "number",
"minimum": 0 "min": 0
}, },
"unsigned_int": { "unsigned_int": {
"type": "integer", "type": "number",
"minimum": 0 "min": 0,
"multipleOf": 1
}, },
"unsigned_int_8": { "unsigned_int_8": {
"type": "integer", "type": "number",
"minimum": 0, "min": 0,
"maximum": 255 "max": 255,
}, "multipleOf": 1
"bit": {
"type": "integer",
"minimum": 0,
"maximum": 1
} }
} }

View file

@ -1,27 +1,7 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
"$id": "qmk.keyboard.v1", "$id": "qmk.keyboard.v1",
"title": "Keyboard Information", "title": "Keyboard Information",
"definitions": {
"encoder_config": {
"type": "object",
"properties": {
"rotary": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": false,
"required": ["pin_a", "pin_b"],
"properties": {
"pin_a": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"pin_b": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"resolution": {"$ref": "qmk.definitions.v1#/unsigned_int"}
}
}
}
}
}
},
"type": "object", "type": "object",
"properties": { "properties": {
"keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"}, "keyboard_name": {"$ref": "qmk.definitions.v1#/text_identifier"},
@ -42,7 +22,7 @@
}, },
"processor": { "processor": {
"type": "string", "type": "string",
"enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "RP2040", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "WB32FQ95", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"] "enum": ["cortex-m0", "cortex-m0plus", "cortex-m3", "cortex-m4", "MKL26Z64", "MK20DX128", "MK20DX256", "MK66FX1M0", "STM32F042", "STM32F072", "STM32F103", "STM32F303", "STM32F401", "STM32F405", "STM32F407", "STM32F411", "STM32F446", "STM32G431", "STM32G474", "STM32L412", "STM32L422", "STM32L432", "STM32L433", "STM32L442", "STM32L443", "GD32VF103", "WB32F3G71", "WB32FQ95", "atmega16u2", "atmega32u2", "atmega16u4", "atmega32u4", "at90usb162", "at90usb646", "at90usb647", "at90usb1286", "at90usb1287", "atmega32a", "atmega328p", "atmega328", "attiny85", "unknown"]
}, },
"audio": { "audio": {
"type": "object", "type": "object",
@ -60,12 +40,12 @@
"breathing": {"type": "boolean"}, "breathing": {"type": "boolean"},
"breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "breathing_period": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"levels": { "levels": {
"type": "integer", "type": "number",
"minimum": 1, "min": 1,
"maximum": 31 "max": 31,
"multipleOf": 1
}, },
"pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
} }
}, },
"bluetooth": { "bluetooth": {
@ -86,7 +66,7 @@
}, },
"bootloader": { "bootloader": {
"type": "string", "type": "string",
"enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "custom", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2", "rp2040"], "enum": ["atmel-dfu", "bootloadhid", "bootloadHID", "custom", "caterina", "halfkay", "kiibohd", "lufa-dfu", "lufa-ms", "md-boot", "qmk-dfu", "qmk-hid", "stm32-dfu", "stm32duino", "gd32v-dfu", "wb32-dfu", "unknown", "usbasploader", "USBasp", "tinyuf2"],
}, },
"bootloader_instructions": { "bootloader_instructions": {
"type": "string", "type": "string",
@ -133,22 +113,13 @@
"type": "array", "type": "array",
"items": {"$ref": "qmk.definitions.v1#/filename"} "items": {"$ref": "qmk.definitions.v1#/filename"}
}, },
"encoder": {
"$ref": "#/definitions/encoder_config",
"properties": {
"enabled": {"type": "boolean"}
}
},
"features": {"$ref": "qmk.definitions.v1#/boolean_array"}, "features": {"$ref": "qmk.definitions.v1#/boolean_array"},
"indicators": { "indicators": {
"type": "object", "type": "object",
"properties": { "properties": {
"caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "caps_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "num_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "scroll_lock": {"$ref": "qmk.definitions.v1#/mcu_pin"}
"compose": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"kana": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"on_state": {"$ref": "qmk.definitions.v1#/bit"}
} }
}, },
"layout_aliases": { "layout_aliases": {
@ -183,11 +154,12 @@
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"type": "integer", "type": "number",
"minimum": 0 "min": 0,
"multipleOf": 1
} }
}, },
"r": {"$ref": "qmk.definitions.v1#/signed_decimal"}, "r": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, "rx": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}, "ry": {"$ref": "qmk.definitions.v1#/unsigned_decimal"},
"h": {"$ref": "qmk.definitions.v1#/key_unit"}, "h": {"$ref": "qmk.definitions.v1#/key_unit"},
@ -258,13 +230,14 @@
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"type": "integer", "type": "number",
"minimum": 0 "min": 0,
"multipleOf": 1
} }
}, },
"x": {"$ref": "qmk.definitions.v1#/key_unit"}, "x": {"$ref": "qmk.definitions.v1#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"}, "y": {"$ref": "qmk.definitions.v1#/key_unit"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
} }
} }
} }
@ -285,13 +258,14 @@
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"type": "integer", "type": "number",
"minimum": 0 "min": 0,
"multipleOf": 1
} }
}, },
"x": {"$ref": "qmk.definitions.v1#/key_unit"}, "x": {"$ref": "qmk.definitions.v1#/key_unit"},
"y": {"$ref": "qmk.definitions.v1#/key_unit"}, "y": {"$ref": "qmk.definitions.v1#/key_unit"},
"flags": {"$ref": "qmk.definitions.v1#/unsigned_int_8"} "flags": {"$ref": "qmk.definitions.v1#/unsigned_decimal"}
} }
} }
} }
@ -316,9 +290,10 @@
"blink": {"type": "boolean"}, "blink": {"type": "boolean"},
"enabled": {"type": "boolean"}, "enabled": {"type": "boolean"},
"max": { "max": {
"type": "integer", "type": "number",
"minimum": 1, "min": 1,
"maximum": 32 "max": 32,
"multipleOf": 1
}, },
"override_rgb": {"type": "boolean"} "override_rgb": {"type": "boolean"}
} }
@ -332,8 +307,8 @@
"split": {"type": "boolean"}, "split": {"type": "boolean"},
"split_count": { "split_count": {
"type": "array", "type": "array",
"minItems": 2, "minLength": 2,
"maxItems": 2, "maxLength": 2,
"items": {"$ref": "qmk.definitions.v1#/unsigned_int"} "items": {"$ref": "qmk.definitions.v1#/unsigned_int"}
} }
} }
@ -347,31 +322,21 @@
"idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "idle_timeout": {"$ref": "qmk.definitions.v1#/unsigned_int"},
"unlock_sequence": { "unlock_sequence": {
"type": "array", "type": "array",
"minItems": 1, "minLength": 1,
"maxItems": 5, "maxLength": 5,
"items": { "items": {
"type": "array", "type": "array",
"minItems": 2, "minItems": 2,
"maxItems": 2, "maxItems": 2,
"items": { "items": {
"type": "integer", "type": "number",
"minimum": 0 "min": 0,
"multipleOf": 1
} }
} }
} }
} }
}, },
"stenography": {
"type": "object",
"additionalProperties": false,
"properties": {
"enabled": {"type": "boolean"},
"protocol": {
"type": "string",
"enum": ["all", "geminipr", "txbolt"]
}
}
},
"split": { "split": {
"type": "object", "type": "object",
"additionalProperties": false, "additionalProperties": false,
@ -400,24 +365,16 @@
} }
} }
}, },
"encoder": {
"type": "object",
"additionalProperties": false,
"properties": {
"right": {
"$ref": "#/definitions/encoder_config"
}
}
},
"main": { "main": {
"type": "string", "type": "string",
"enum": ["eeprom", "left", "matrix_grid", "pin", "right"] "enum": ["eeprom", "left", "matrix_grid", "pin", "right"]
}, },
"soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"}, "soft_serial_pin": {"$ref": "qmk.definitions.v1#/mcu_pin"},
"soft_serial_speed": { "soft_serial_speed": {
"type": "integer", "type": "number",
"minimum": 0, "min": 0,
"maximum": 5 "max": 5,
"multipleOf": 1
}, },
"transport": { "transport": {
"type": "object", "type": "object",
@ -471,7 +428,7 @@
"force_nkro": {"type": "boolean"}, "force_nkro": {"type": "boolean"},
"pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "pid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
"vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"}, "vid": {"$ref": "qmk.definitions.v1#/hex_number_4d"},
"max_power": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "max_power": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"no_startup_check": {"type": "boolean"}, "no_startup_check": {"type": "boolean"},
"polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "polling_interval": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"shared_endpoint": { "shared_endpoint": {
@ -482,7 +439,7 @@
"mouse": {"type": "boolean"} "mouse": {"type": "boolean"}
} }
}, },
"suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "suspend_wakeup_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"wait_for": {"type": "boolean"}, "wait_for": {"type": "boolean"},
} }
}, },
@ -491,8 +448,8 @@
"additionalProperties": false, "additionalProperties": false,
"properties": { "properties": {
"keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"}, "keys_per_scan": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "tap_keycode_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
"tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int"}, "tap_capslock_delay": {"$ref": "qmk.definitions.v1#/unsigned_int_8"},
} }
}, },
"qmk_lufa_bootloader": { "qmk_lufa_bootloader": {

View file

@ -1,5 +1,5 @@
{ {
"$schema": "https://json-schema.org/draft/2020-12/schema#", "$schema": "http://json-schema.org/draft-07/schema#",
"$id": "qmk.keymap.v1", "$id": "qmk.keymap.v1",
"title": "Keymap Information", "title": "Keymap Information",
"type": "object", "type": "object",
@ -50,7 +50,8 @@
}, },
"config": {"$ref": "qmk.keyboard.v1"}, "config": {"$ref": "qmk.keyboard.v1"},
"notes": { "notes": {
"type": "string" "type": "string",
"description": "asdf"
} }
}, },
"required": [ "required": [

View file

@ -84,10 +84,12 @@
* [One Shot Keys](one_shot_keys.md) * [One Shot Keys](one_shot_keys.md)
* [Pointing Device](feature_pointing_device.md) * [Pointing Device](feature_pointing_device.md)
* [Raw HID](feature_rawhid.md) * [Raw HID](feature_rawhid.md)
* [Secure](feature_secure.md)
* [Sequencer](feature_sequencer.md) * [Sequencer](feature_sequencer.md)
* [Swap Hands](feature_swap_hands.md) * [Swap Hands](feature_swap_hands.md)
* [Tap Dance](feature_tap_dance.md) * [Tap Dance](feature_tap_dance.md)
* [Tap-Hold Configuration](tap_hold.md) * [Tap-Hold Configuration](tap_hold.md)
* [Terminal](feature_terminal.md)
* [Unicode](feature_unicode.md) * [Unicode](feature_unicode.md)
* [Userspace](feature_userspace.md) * [Userspace](feature_userspace.md)
* [WPM Calculation](feature_wpm.md) * [WPM Calculation](feature_wpm.md)
@ -146,7 +148,6 @@
* [SPI Driver](spi_driver.md) * [SPI Driver](spi_driver.md)
* [WS2812 Driver](ws2812_driver.md) * [WS2812 Driver](ws2812_driver.md)
* [EEPROM Driver](eeprom_driver.md) * [EEPROM Driver](eeprom_driver.md)
* [Flash Driver](flash_driver.md)
* ['serial' Driver](serial_driver.md) * ['serial' Driver](serial_driver.md)
* [UART Driver](uart_driver.md) * [UART Driver](uart_driver.md)
* [GPIO Controls](gpio_control.md) * [GPIO Controls](gpio_control.md)
@ -165,7 +166,7 @@
* Arm/ChibiOS * Arm/ChibiOS
* [Selecting an MCU](platformdev_selecting_arm_mcu.md) * [Selecting an MCU](platformdev_selecting_arm_mcu.md)
* [Early initialization](platformdev_chibios_earlyinit.md) * [Early initialization](platformdev_chibios_earlyinit.md)
* [Raspberry Pi RP2040](platformdev_rp2040.md) * [WeAct Blackpill F411](platformdev_blackpill_f411.md)
* QMK Reference * QMK Reference
* [Contributing to QMK](contributing.md) * [Contributing to QMK](contributing.md)

View file

@ -113,15 +113,17 @@ Additionally, in the board config, you'll want to make changes to enable the DAC
### DAC Config ### DAC Config
| Define | Defaults | Description --------------------------------------------------------------------------------------------- | | Define | Defaults | Description |
| -------------------------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. | | `AUDIO_DAC_SAMPLE_MAX` | `4095U` | Highest value allowed. Lower value means lower volume. And 4095U is the upper limit, since this is limited to a 12 bit value. Only effects non-pregenerated samples. |
| `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. | | `AUDIO_DAC_OFF_VALUE` | `AUDIO_DAC_SAMPLE_MAX / 2` | The value of the DAC when notplaying anything. Some setups may require a high (`AUDIO_DAC_SAMPLE_MAX`) or low (`0`) value here. |
| `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. | | `AUDIO_MAX_SIMULTANEOUS_TONES` | __see next table__ | The number of tones that can be played simultaneously. A value that is too high may freeze the controller or glitch out when too many tones are being played. |
| `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. | | `AUDIO_DAC_SAMPLE_RATE` | __see next table__ | Effective bit rate of the DAC (in hertz), higher limits simultaneous tones, and lower sacrifices quality. |
There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets. There are a number of predefined quality settings that you can use, with "sane minimum" being the default. You can use custom values by simply defining the sample rate and number of simultaneous tones, instead of using one of the listed presets.
| Define | Sample Rate | Simultaneous tones | | Define | Sample Rate | Simultaneous tones |
| --------------------------------- | ----------- | ------------------- |
| `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` | | `AUDIO_DAC_QUALITY_VERY_LOW` | `11025U` | `8` |
| `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` | | `AUDIO_DAC_QUALITY_LOW` | `22040U` | `4` |
| `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` | | `AUDIO_DAC_QUALITY_HIGH` | `44100U` | `2` |

View file

@ -14,6 +14,10 @@ Add this to the end of your `.profile` or `.bashrc`:
If you put `qmk_firmware` into another location you will need to adjust this path. If you put `qmk_firmware` into another location you will need to adjust this path.
Zsh users will need to load `bashcompinit`. The following can be added to `~/.zshrc` file:
autoload -Uz bashcompinit && bashcompinit
### System Wide Symlink ### System Wide Symlink
If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script: If you want the tab completion available to all users of the system you can add a symlink to the `qmk_tab_complete.sh` script:

View file

@ -65,12 +65,6 @@ You can also use any ARM chip with USB that [ChibiOS](https://www.chibios.org) s
* [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180) * [MK66FX1M0](https://www.nxp.com/products/processors-and-microcontrollers/arm-microcontrollers/general-purpose-mcus/k-series-cortex-m4/k6x-ethernet/kinetis-k66-180-mhz-dual-high-speed-full-speed-usbs-2mb-flash-microcontrollers-mcus-based-on-arm-cortex-m4-core:K66_180)
* PJRC Teensy 3.6 * PJRC Teensy 3.6
### Raspberry Pi
* [RP2040](https://www.raspberrypi.com/documentation/microcontrollers/rp2040.html)
For a detailed overview about the RP2040 support by QMK see the [dedicated RP2040 page](platformdev_rp2040.md).
## Atmel ATSAM ## Atmel ATSAM
There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware. There is limited support for one of Atmel's ATSAM microcontrollers, that being the [ATSAMD51J18A](https://www.microchip.com/wwwproducts/en/ATSAMD51J18A) used by the [Massdrop keyboards](https://github.com/qmk/qmk_firmware/tree/master/keyboards/massdrop). However, it is not recommended to design a board with this microcontroller as the support is quite specialized to Massdrop hardware.

View file

@ -141,7 +141,7 @@ If you define these options you will enable the associated feature, which may in
## Behaviors That Can Be Configured ## Behaviors That Can Be Configured
* `#define TAPPING_TERM 200` * `#define TAPPING_TERM 200`
* how long before a key press becomes a hold * how long before a tap becomes a hold, if set above 500, a key tapped during the tapping term will turn it into a hold too
* `#define TAPPING_TERM_PER_KEY` * `#define TAPPING_TERM_PER_KEY`
* enables handling for per key `TAPPING_TERM` settings * enables handling for per key `TAPPING_TERM` settings
* `#define RETRO_TAPPING` * `#define RETRO_TAPPING`
@ -174,8 +174,6 @@ If you define these options you will enable the associated feature, which may in
* sets the timer for leader key chords to run on each key press rather than overall * sets the timer for leader key chords to run on each key press rather than overall
* `#define LEADER_KEY_STRICT_KEY_PROCESSING` * `#define LEADER_KEY_STRICT_KEY_PROCESSING`
* Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`. * Disables keycode filtering for Mod-Tap and Layer-Tap keycodes. Eg, if you enable this, you would need to specify `MT(MOD_CTL, KC_A)` if you want to use `KC_A`.
* `#define MOUSE_EXTENDED_REPORT`
* Enables support for extended reports (-32767 to 32767, instead of -127 to 127), which may allow for smoother reporting, and prevent maxing out of the reports. Applies to both Pointing Device and Mousekeys.
* `#define ONESHOT_TIMEOUT 300` * `#define ONESHOT_TIMEOUT 300`
* how long before oneshot times out * how long before oneshot times out
* `#define ONESHOT_TAP_TOGGLE 2` * `#define ONESHOT_TAP_TOGGLE 2`

View file

@ -2,15 +2,12 @@
The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present. The EEPROM driver can be swapped out depending on the needs of the keyboard, or whether extra hardware is present.
Selecting the EEPROM driver is done in your keyboard's `rules.mk`:
Driver | Description Driver | Description
-----------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- -----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below. `EEPROM_DRIVER = vendor` (default) | Uses the on-chip driver provided by the chip manufacturer. For AVR, this is provided by avr-libc. This is supported on ARM for a subset of chips -- STM32F3xx, STM32F1xx, and STM32F072xB will be emulated by writing to flash. STM32L0xx and STM32L1xx will use the onboard dedicated true EEPROM. Other chips will generally act as "transient" below.
`EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below. `EEPROM_DRIVER = i2c` | Supports writing to I2C-based 24xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below. `EEPROM_DRIVER = spi` | Supports writing to SPI-based 25xx EEPROM chips. See the driver section below.
`EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost. `EEPROM_DRIVER = transient` | Fake EEPROM driver -- supports reading/writing to RAM, and will be discarded when power is lost.
`EEPROM_DRIVER = wear_leveling` | Frontend driver for the wear_leveling system, allowing for EEPROM emulation on top of flash -- both in-MCU and external SPI NOR flash.
## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration ## Vendor Driver Configuration :id=vendor-eeprom-driver-configuration
@ -46,9 +43,8 @@ Module | Equivalent `#define` | Source
-----------------|---------------------------------|------------------------------------------ -----------------|---------------------------------|------------------------------------------
CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` | <https://www.sparkfun.com/products/14764> CAT24C512 EEPROM | `#define EEPROM_I2C_CAT24C512` | <https://www.sparkfun.com/products/14764>
RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` | <https://www.sparkfun.com/products/14764> RM24C512C EEPROM | `#define EEPROM_I2C_RM24C512C` | <https://www.sparkfun.com/products/14764>
24LC32A EEPROM | `#define EEPROM_I2C_24LC32A` | <https://www.microchip.com/en-us/product/24LC32A> 24LC64 EEPROM | `#define EEPROM_I2C_24LC64` | <https://www.microchip.com/wwwproducts/en/24LC64>
24LC64 EEPROM | `#define EEPROM_I2C_24LC64` | <https://www.microchip.com/en-us/product/24LC64> 24LC128 EEPROM | `#define EEPROM_I2C_24LC128` | <https://www.microchip.com/wwwproducts/en/24LC128>
24LC128 EEPROM | `#define EEPROM_I2C_24LC128` | <https://www.microchip.com/en-us/product/24LC128>
24LC256 EEPROM | `#define EEPROM_I2C_24LC256` | <https://www.sparkfun.com/products/525> 24LC256 EEPROM | `#define EEPROM_I2C_24LC256` | <https://www.sparkfun.com/products/525>
MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/product/1895> MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/product/1895>
@ -58,13 +54,13 @@ MB85RC256V FRAM | `#define EEPROM_I2C_MB85RC256V` | <https://www.adafruit.com/p
Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h: Currently QMK supports 25xx-series chips over SPI. As such, requires a working spi_master driver configuration. You can override the driver configuration via your config.h:
`config.h` override | Default Value | Description `config.h` override | Description | Default Value
-----------------------------------------------|---------------|------------------------------------------------------------------------------------- -----------------------------------------------|--------------------------------------------------------------------------------------|--------------
`#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | _none_ | SPI Slave select pin in order to inform that the EEPROM is currently being addressed `#define EXTERNAL_EEPROM_SPI_SLAVE_SELECT_PIN` | SPI Slave select pin in order to inform that the EEPROM is currently being addressed | _none_
`#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | `64` | Clock divisor used to divide the peripheral clock to derive the SPI frequency `#define EXTERNAL_EEPROM_SPI_CLOCK_DIVISOR` | Clock divisor used to divide the peripheral clock to derive the SPI frequency | `64`
`#define EXTERNAL_EEPROM_BYTE_COUNT` | `8192` | Total size of the EEPROM in bytes `#define EXTERNAL_EEPROM_BYTE_COUNT` | Total size of the EEPROM in bytes | 8192
`#define EXTERNAL_EEPROM_PAGE_SIZE` | `32` | Page size of the EEPROM in bytes, as specified in the datasheet `#define EXTERNAL_EEPROM_PAGE_SIZE` | Page size of the EEPROM in bytes, as specified in the datasheet | 32
`#define EXTERNAL_EEPROM_ADDRESS_SIZE` | `2` | The number of bytes to transmit for the memory location within the EEPROM `#define EXTERNAL_EEPROM_ADDRESS_SIZE` | The number of bytes to transmit for the memory location within the EEPROM | 2
!> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero. !> There's no way to determine if there is an SPI EEPROM actually responding. Generally, this will result in reads of nothing but zero.
@ -77,69 +73,3 @@ The only configurable item for the transient EEPROM driver is its size:
`#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64 `#define TRANSIENT_EEPROM_SIZE` | Total size of the EEPROM storage in bytes | 64
Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`. Default values and extended descriptions can be found in `drivers/eeprom/eeprom_transient.h`.
## Wear-leveling Driver Configuration :id=wear_leveling-eeprom-driver-configuration
The wear-leveling driver uses an algorithm to minimise the number of erase cycles on the underlying MCU flash memory.
There is no specific configuration for this driver, but the wear-leveling system used by this driver may need configuration. See the [wear-leveling configuration](#wear_leveling-configuration) section for more information.
# Wear-leveling Configuration :id=wear_leveling-configuration
The wear-leveling driver has a few possible _backing stores_ that may be used by adding to your keyboard's `rules.mk` file:
Driver | Description
----------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`WEAR_LEVELING_DRIVER = embedded_flash` | This driver is used for emulating EEPROM by writing to embedded flash on the MCU.
`WEAR_LEVELING_DRIVER = spi_flash` | This driver is used to address external SPI NOR Flash peripherals.
`WEAR_LEVELING_DRIVER = legacy` | This driver is the "legacy" emulated EEPROM provided in historical revisions of QMK. Currently used for STM32F0xx and STM32F4x1, but slated for deprecation and removal once `embedded_flash` support for those MCU families is complete.
!> All wear-leveling drivers require an amount of RAM equivalent to the selected logical EEPROM size. Increasing the size to 32kB of EEPROM requires 32kB of RAM, which a significant number of MCUs simply do not have.
## Wear-leveling Embedded Flash Driver Configuration :id=wear_leveling-efl-driver-configuration
This driver performs writes to the embedded flash storage embedded in the MCU. In most circumstances, the last few of sectors of flash are used in order to minimise the likelihood of collision with program code.
Configurable options in your keyboard's `config.h`:
`config.h` override | Default | Description
-----------------------------------------|-------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
`#define WEAR_LEVELING_EFL_FIRST_SECTOR` | _unset_ | The first sector on the MCU to use. By default this is not defined and calculated at runtime based on the MCU. However, different flash sizes on MCUs may require custom configuration.
`#define WEAR_LEVELING_EFL_FLASH_SIZE` | _unset_ | Allows overriding the flash size available for use for wear-leveling. Under normal circumstances this is automatically calculated and should not need to be overridden. Specifying a size larger than the amount actually available in flash will usually prevent the MCU from booting.
`#define WEAR_LEVELING_LOGICAL_SIZE` | `1024` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM.
`#define WEAR_LEVELING_BACKING_SIZE` | `2048` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
`#define BACKING_STORE_WRITE_SIZE` | _automatic_ | The byte width of the underlying write used on the MCU, and is usually automatically determined from the selected MCU family. If an error occurs in the auto-detection, you'll need to consult the MCU's datasheet and determine this value, specifying it directly.
!> If your MCU does not boot after swapping to the EFL wear-leveling driver, it's likely that the flash size is incorrectly detected, usually as an MCU with larger flash and may require overriding.
## Wear-leveling SPI Flash Driver Configuration :id=wear_leveling-flash_spi-driver-configuration
This driver performs writes to an external SPI NOR Flash peripheral. It also requires a working configuration for the SPI NOR Flash peripheral -- see the [flash driver](flash_driver.md) documentation for more information.
Configurable options in your keyboard's `config.h`:
`config.h` override | Default | Description
----------------------------------------------------|--------------------------------|--------------------------------------------------------------------------------------------------------------------------------
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT` | `1` | Number of blocks in the external flash used by the wear-leveling algorithm.
`#define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET` | `0` | The index first block in the external flash used by the wear-leveling algorithm.
`#define WEAR_LEVELING_LOGICAL_SIZE` | `((block_count*block_size)/2)` | Number of bytes "exposed" to the rest of QMK and denotes the size of the usable EEPROM. Result must be <= 64kB.
`#define WEAR_LEVELING_BACKING_SIZE` | `(block_count*block_size)` | Number of bytes used by the wear-leveling algorithm for its underlying storage, and needs to be a multiple of the logical size.
`#define BACKING_STORE_WRITE_SIZE` | `8` | The write width used whenever a write is performed on the external flash peripheral.
!> There is currently a limit of 64kB for the EEPROM subsystem within QMK, so using a larger flash is not going to be beneficial as the logical size cannot be increased beyond 65536. The backing size may be increased to a larger value, but erase timing may suffer as a result.
## Wear-leveling Legacy EEPROM Emulation Driver Configuration :id=wear_leveling-legacy-driver-configuration
This driver performs writes to the embedded flash storage embedded in the MCU much like the normal Embedded Flash Driver, and is only for use with STM32F0xx and STM32F4x1 devices. This flash implementation is still currently provided as the EFL driver is currently non-functional for the previously mentioned families.
By default, `1024` bytes of emulated EEPROM is provided:
MCU | EEPROM Provided | Flash Used
----------|-----------------|--------------
STM32F042 | `1024` bytes | `2048` bytes
STM32F070 | `1024` bytes | `2048` bytes
STM32F072 | `1024` bytes | `2048` bytes
STM32F401 | `1024` bytes | `16384` bytes
STM32F411 | `1024` bytes | `16384` bytes
Under normal circumstances configuration of this driver requires intimate knowledge of the MCU's flash structure -- reconfiguration is at your own risk and will require referring to the code.

View file

@ -87,9 +87,9 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
|`MK_KINETIC_SPEED` |undefined|Enable kinetic mode | |`MK_KINETIC_SPEED` |undefined|Enable kinetic mode |
|`MOUSEKEY_DELAY` |5 |Delay between pressing a movement key and cursor movement | |`MOUSEKEY_DELAY` |5 |Delay between pressing a movement key and cursor movement |
|`MOUSEKEY_INTERVAL` |10 |Time between cursor movements in milliseconds | |`MOUSEKEY_INTERVAL` |10 |Time between cursor movements in milliseconds |
|`MOUSEKEY_MOVE_DELTA` |16 |Step size for accelerating from initial to base speed | |`MOUSEKEY_MOVE_DELTA` |5 |Step size for accelerating from initial to base speed |
|`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second | |`MOUSEKEY_INITIAL_SPEED` |100 |Initial speed of the cursor in pixel per second |
|`MOUSEKEY_BASE_SPEED` |5000 |Maximum cursor speed at which acceleration stops | |`MOUSEKEY_BASE_SPEED` |1000 |Maximum cursor speed at which acceleration stops |
|`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed | |`MOUSEKEY_DECELERATED_SPEED` |400 |Decelerated cursor speed |
|`MOUSEKEY_ACCELERATED_SPEED` |3000 |Accelerated cursor speed | |`MOUSEKEY_ACCELERATED_SPEED` |3000 |Accelerated cursor speed |
|`MOUSEKEY_WHEEL_INITIAL_MOVEMENTS` |16 |Initial number of movements of the mouse wheel | |`MOUSEKEY_WHEEL_INITIAL_MOVEMENTS` |16 |Initial number of movements of the mouse wheel |
@ -100,7 +100,7 @@ This is an extension of the accelerated mode. The kinetic mode uses a quadratic
Tips: Tips:
* The smoothness of the cursor movement depends on the `MOUSEKEY_INTERVAL` setting. The shorter the interval is set the smoother the movement will be. Setting the value too low makes the cursor unresponsive. Lower settings are possible if the micro processor is fast enough. For example: At an interval of `8` milliseconds, `125` movements per second will be initiated. With a base speed of `1000` each movement will move the cursor by `8` pixels. * The smoothness of the cursor movement depends on the `MOUSEKEY_INTERVAL` setting. The shorter the interval is set the smoother the movement will be. Setting the value too low makes the cursor unresponsive. Lower settings are possible if the micro processor is fast enough. For example: At an interval of `8` milliseconds, `125` movements per second will be initiated. With a base speed of `1000` each movement will move the cursor by `8` pixels.
* Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `2`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second. * Mouse wheel movements are implemented differently from cursor movements. While it's okay for the cursor to move multiple pixels at once for the mouse wheel this would lead to jerky movements. Instead, the mouse wheel operates at step size `1`. Setting mouse wheel speed is done by adjusting the number of wheel movements per second.
### Constant mode ### Constant mode

View file

@ -72,6 +72,7 @@ The Analog Joystick is an analog (ADC) driven sensor. There are a variety of jo
|`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` | |`ANALOG_JOYSTICK_SPEED_MAX` | (Optional) The maximum value used for motion. | `2` |
|`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ | |`ANALOG_JOYSTICK_CLICK_PIN` | (Optional) The pin wired up to the press switch of the analog stick. | _not defined_ |
### Cirque Trackpad ### Cirque Trackpad
To use the Cirque Trackpad sensor, add this to your `rules.mk`: To use the Cirque Trackpad sensor, add this to your `rules.mk`:
@ -89,42 +90,30 @@ POINTING_DEVICE_DRIVER = cirque_pinnacle_spi
This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the TM040040, TM035035 and the TM023023 trackpads. These are I2C or SPI compatible, and both configurations are supported. This supports the Cirque Pinnacle 1CA027 Touch Controller, which is used in the TM040040, TM035035 and the TM023023 trackpads. These are I2C or SPI compatible, and both configurations are supported.
| Setting | Description | Default | | Setting | Description | Default |
|-------------------------------- |-----------------------------------------------------------------------|--------------------- | |---------------------------------|---------------------------------------------------------------------------------|-----------------------|
|`CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` | |`CIRQUE_PINNACLE_X_LOWER` | (Optional) The minimum reachable X value on the sensor. | `127` |
|`CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` | |`CIRQUE_PINNACLE_X_UPPER` | (Optional) The maximum reachable X value on the sensor. | `1919` |
|`CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` | |`CIRQUE_PINNACLE_Y_LOWER` | (Optional) The minimum reachable Y value on the sensor. | `63` |
|`CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` | |`CIRQUE_PINNACLE_Y_UPPER` | (Optional) The maximum reachable Y value on the sensor. | `1471` |
|`CIRQUE_PINNACLE_ATTENUATION` | (Optional) Sets the attenuation of the sensor data. | `ADC_ATTENUATE_4X` | |`CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|`CIRQUE_PINNACLE_TAPPING_TERM` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` | |`CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
|`CIRQUE_PINNACLE_TOUCH_DEBOUNCE` | (Optional) Length of time that a touch can be to be considered a tap. | `TAPPING_TERM`/`200` |
**`CIRQUE_PINNACLE_ATTENUATION`** is a measure of how much data is suppressed in regards to sensitivity. The higher the attenuation, the less sensitive the touchpad will be.
Default attenuation is set to 4X, although if you are using a thicker overlay (such as the curved overlay) you will want a lower attenuation such as 2X. The possible values are:
* `ADC_ATTENUATE_4X`: Least sensitive
* `ADC_ATTENUATE_3X`
* `ADC_ATTENUATE_2X`
* `ADC_ATTENUATE_1X`: Most sensitive
| I2C Setting | Description | Default | | I2C Setting | Description | Default |
|--------------------------|---------------------------------------------------------------------------------|---------| |--------------------------|---------------------------------------------------------------------------------|---------|
|`CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` | |`CIRQUE_PINNACLE_ADDR` | (Required) Sets the I2C Address for the Cirque Trackpad | `0x2A` |
|`CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` | |`CIRQUE_PINNACLE_TIMEOUT` | (Optional) The timeout for i2c communication with the trackpad in milliseconds. | `20` |
| SPI Setting | Description | Default | | SPI Setting | Description | Default |
|-------------------------------|------------------------------------------------------------------------|----------------| |-------------------------------|------------------------------------------------------------------------|---------------|
|`CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` | |`CIRQUE_PINNACLE_CLOCK_SPEED` | (Optional) Sets the clock speed that the sensor runs at. | `1000000` |
|`CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` | |`CIRQUE_PINNACLE_SPI_LSBFIRST` | (Optional) Sets the Least/Most Significant Byte First setting for SPI. | `false` |
|`CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` | |`CIRQUE_PINNACLE_SPI_MODE` | (Optional) Sets the SPI Mode for the sensor. | `1` |
|`CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ | |`CIRQUE_PINNACLE_SPI_DIVISOR` | (Optional) Sets the SPI Divisor used for SPI communication. | _varies_ |
|`CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ | |`CIRQUE_PINNACLE_SPI_CS_PIN` | (Required) Sets the Cable Select pin connected to the sensor. | _not defined_ |
Default Scaling/CPI is 1024. Default Scaling/CPI is 1024.
Also see the `POINTING_DEVICE_TASK_THROTTLE_MS`, which defaults to 10ms when using Cirque Pinnacle, which matches the internal update rate of the position registers (in standard configuration). Advanced configuration for pen/stylus usage might require lower values.
### Pimoroni Trackball ### Pimoroni Trackball
To use the Pimoroni Trackball module, add this to your `rules.mk`: To use the Pimoroni Trackball module, add this to your `rules.mk`:
@ -270,7 +259,6 @@ The following configuration options are only available when using `SPLIT_POINTIN
|`POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ | |`POINTING_DEVICE_ROTATION_270_RIGHT` | (Optional) Rotates the X and Y data by 270 degrees. | _not defined_ |
|`POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ | |`POINTING_DEVICE_INVERT_X_RIGHT` | (Optional) Inverts the X axis report. | _not defined_ |
|`POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ | |`POINTING_DEVICE_INVERT_Y_RIGHT` | (Optional) Inverts the Y axis report. | _not defined_ |
|`MOUSE_EXTENDED_REPORT` | (Optional) Enables support for extended mouse reports. (-32767 to 32767, instead of just -127 to 127) |
!> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware. !> If there is a `_RIGHT` configuration option or callback, the [common configuration](feature_pointing_device.md?id=common-configuration) option will work for the left. For correct left/right detection you should setup a [handedness option](feature_split_keyboard?id=setting-handedness), `EE_HANDS` is usually a good option for an existing board that doesn't do handedness by hardware.

View file

@ -86,7 +86,6 @@ You can use between 1 and 4 IS31FL3733 IC's. Do not specify `DRIVER_ADDR_<N>` de
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | | `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | | `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 | | `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3733B only | 0 |
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) | | `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) | | `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | | `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
@ -173,7 +172,6 @@ Configure the hardware via your `config.h`:
| `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 | | `ISSI_TIMEOUT` | (Optional) How long to wait for i2c messages, in milliseconds | 100 |
| `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 | | `ISSI_PERSISTENCE` | (Optional) Retry failed messages this many times | 0 |
| `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 | | `ISSI_PWM_FREQUENCY` | (Optional) PWM Frequency Setting - IS31FL3737B only | 0 |
| `ISSI_GLOBALCURRENT` | (Optional) Configuration for the Global Current Register | 0xFF |
| `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) | | `ISSI_SWPULLUP` | (Optional) Set the value of the SWx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) | | `ISSI_CSPULLUP` | (Optional) Set the value of the CSx lines on-chip de-ghosting resistors | PUR_0R (Disabled) |
| `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | | | `DRIVER_COUNT` | (Required) How many RGB driver IC's are present | |
@ -411,7 +409,6 @@ You can use up to 2 AW20216 IC's. Do not specify `DRIVER_<N>_xxx` defines for IC
| `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | | | `DRIVER_LED_TOTAL` | (Required) How many RGB lights are present across all drivers | |
| `AW_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 | | `AW_SCALING_MAX` | (Optional) LED current scaling value (0-255, higher values mean LED is brighter at full PWM) | 150 |
| `AW_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 | | `AW_GLOBAL_CURRENT_MAX` | (Optional) Driver global current limit (0-255, higher values means the driver may consume more power) | 150 |
| `AW_SPI_MODE` | (Optional) Mode for SPI communication (0-3, defines polarity and phase of the clock) | 3 |
| `AW_SPI_DIVISOR` | (Optional) Clock divisor for SPI communication (powers of 2, smaller numbers means faster communication, should not be less than 4) | 4 | | `AW_SPI_DIVISOR` | (Optional) Clock divisor for SPI communication (powers of 2, smaller numbers means faster communication, should not be less than 4) | 4 |
Here is an example using 2 drivers. Here is an example using 2 drivers.
@ -668,22 +665,7 @@ In order to change the delay of temperature decrease define `RGB_MATRIX_TYPING_H
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50 #define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 50
``` ```
As heatmap uses the physical position of the leds set in the g_led_config, you may need to tweak the following options to get the best effect for your keyboard. Note the size of this grid is `224x64`. Heatmap effect may not light up the correct adjacent LEDs for certain key matrix layout such as split keyboards. The following define will limit the effect to pressed keys only:
Limit the distance the effect spreads to surrounding keys.
```c
#define RGB_MATRIX_TYPING_HEATMAP_SPREAD 40
```
Limit how hot surrounding keys get from each press.
```c
#define RGB_MATRIX_TYPING_HEATMAP_AREA_LIMIT 16
```
Remove the spread effect entirely.
```c ```c
#define RGB_MATRIX_TYPING_HEATMAP_SLIM #define RGB_MATRIX_TYPING_HEATMAP_SLIM
``` ```
@ -795,6 +777,7 @@ These are defined in [`color.h`](https://github.com/qmk/qmk_firmware/blob/master
#define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature) #define RGB_MATRIX_DISABLE_KEYCODES // disables control of rgb matrix by keycodes (must use code functions to control the feature)
#define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right. #define RGB_MATRIX_SPLIT { X, Y } // (Optional) For split keyboards, the number of LEDs connected on each half. X = left, Y = Right.
// If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR // If RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is enabled, you also will want to enable SPLIT_TRANSPORT_MIRROR
#define RGB_TRIGGER_ON_KEYDOWN // Triggers RGB keypress events on key down. This makes RGB control feel more responsive. This may cause RGB to not function properly on some boards
``` ```
## EEPROM storage :id=eeprom-storage ## EEPROM storage :id=eeprom-storage

54
docs/feature_secure.md Normal file
View file

@ -0,0 +1,54 @@
# Secure
The secure feature aims to prevent unwanted interaction without user intervention.
?> Secure does **not** currently implement encryption/decryption/etc and should not be a replacement where a strong hardware/software based solution is required.
### Unlock sequence
To unlock, the user must perform a set of actions. This can optionally be configured to be multiple keys.
* While unlocking all keyboard input is ignored
* Incorrect attempts will revert back to the previously locked state
### Automatic Locking
Once unlocked, the keyboard will revert back to a locked state after the configured timeout.
The timeout can be refreshed by using the `secure_activity_event` function, for example from one of the various [hooks](custom_quantum_functions.md).
## Usage
Add the following to your `rules.mk`:
```make
SECURE_ENABLE = yes
```
## Keycodes
| Key | Description |
|------------------|--------------------------------------------------------------------------------|
| `SECURE_LOCK` | Revert back to a locked state |
| `SECURE_UNLOCK` | Forces unlock without performing a unlock sequence |
| `SECURE_TOGGLE` | Toggle directly between locked and unlock without performing a unlock sequence |
| `SECURE_REQUEST` | Request that user perform the unlock sequence |
## Configuration
| Define | Default | Description |
|-------------------------|----------------|---------------------------------------------------------------------------------|
|`SECURE_UNLOCK_TIMEOUT` | `5000` | Timeout for the user to perform the configured unlock sequence - `0` to disable |
|`SECURE_IDLE_TIMEOUT` | `60000` | Timeout while unlocked before returning to locked - `0` to disable |
|`SECURE_UNLOCK_SEQUENCE` | `{ { 0, 0 } }` | Array of matrix locations describing a sequential sequence of keypresses |
## Functions
| Function | Description |
|---------------------------|----------------------------------------------------------------------------|
| `secure_is_locked()` | Check if the device is currently locked |
| `secure_is_unlocking()` | Check if an unlock sequence is currently in progress |
| `secure_is_unlocked()` | Check if the device is currently unlocked |
| `secure_lock()` | Lock down the device |
| `secure_unlock()` | Force unlock the device - bypasses user unlock sequence |
| `secure_request_unlock()` | Begin listening for an unlock sequence |
| `secure_activity_event()` | Flag that user activity has happened and the device should remain unlocked |

View file

@ -143,9 +143,6 @@ Next, you will have to flash the EEPROM files once for the correct hand to the c
* ARM controllers with a DFU compatible bootloader (e.g. Proton-C): * ARM controllers with a DFU compatible bootloader (e.g. Proton-C):
* `:dfu-util-split-left` * `:dfu-util-split-left`
* `:dfu-util-split-right` * `:dfu-util-split-right`
* ARM controllers with a UF2 compatible bootloader:
* `:uf2-split-left`
* `:uf2-split-right`
Example: Example:
@ -370,7 +367,7 @@ There are some settings that you may need to configure, based on how the hardwar
#define MATRIX_COL_PINS_RIGHT { <col pins> } #define MATRIX_COL_PINS_RIGHT { <col pins> }
``` ```
This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency). The number of pins in the right and left matrices must be the same, if you have a board with a different number of rows or columns on one side, pad out the extra spaces with `NO_PIN` and make sure you add the unused rows or columns to your matrix. This allows you to specify a different set of pins for the matrix on the right side. This is useful if you have a board with differently-shaped halves that requires a different configuration (such as Keebio's Quefrency).
```c ```c
#define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } } #define DIRECT_PINS_RIGHT { { F1, F0, B0, C7 }, { F4, F5, F6, F7 } }

View file

@ -8,107 +8,46 @@ The [Open Steno Project](https://www.openstenoproject.org/) has built an open-so
Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar. Plover can work with any standard QWERTY keyboard, although it is more efficient if the keyboard supports NKRO (n-key rollover) to allow Plover to see all the pressed keys at once. An example keymap for Plover can be found in `planck/keymaps/default`. Switching to the `PLOVER` layer adjusts the position of the keyboard to support the number bar.
To enable NKRO, add `NKRO_ENABLE = yes` in your `rules.mk` and make sure to press `NK_ON` to turn it on because `NKRO_ENABLE = yes` merely adds the possibility of switching to NKRO mode but it doesn't automatically switch to it. If you want to automatically switch, add `#define FORCE_NKRO` in your `config.h`. To use Plover with QMK just enable NKRO and optionally adjust your layout if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
You may also need to adjust your layout, either in QMK or in Plover, if you have anything other than a standard layout. You may also want to purchase some steno-friendly keycaps to make it easier to hit multiple keys.
## Plover with Steno Protocol :id=plover-with-steno-protocol ## Plover with Steno Protocol :id=plover-with-steno-protocol
Plover also understands the language of several steno machines. QMK can speak a couple of these languages: TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`. Plover also understands the language of several steno machines. QMK can speak a couple of these languages, TX Bolt and GeminiPR. An example layout can be found in `planck/keymaps/steno`.
When QMK speaks to Plover over a steno protocol, Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover. When QMK speaks to Plover over a steno protocol Plover will not use the keyboard as input. This means that you can switch back and forth between a standard keyboard and your steno keyboard, or even switch layers from Plover to standard and back without needing to activate/deactivate Plover.
In this mode, Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard. In this mode Plover expects to speak with a steno machine over a serial port so QMK will present itself to the operating system as a virtual serial port in addition to a keyboard. By default QMK will speak the TX Bolt protocol but can be switched to GeminiPR; the last protocol used is stored in non-volatile memory so QMK will use the same protocol on restart.
> Note: Due to hardware limitations, you might not be able to run both a virtual serial port and mouse emulation at the same time. > Note: Due to hardware limitations you may not be able to run both a virtual serial port and mouse emulation at the same time.
!> Serial stenography protocols are not supported on [V-USB keyboards](compatible_microcontrollers#atmel-avr).
To enable stenography protocols, add the following lines to your `rules.mk`:
```mk
STENO_ENABLE = yes
```
### TX Bolt :id=tx-bolt ### TX Bolt :id=tx-bolt
TX Bolt communicates the status of 24 keys over a simple protocol in variable-sized (1&ndash;4 bytes) packets. TX Bolt communicates the status of 24 keys over a very simple protocol in variable-sized (1-5 byte) packets.
To select TX Bolt, add the following lines to your `rules.mk`:
```mk
STENO_ENABLE = yes
STENO_PROTOCOL = txbolt
```
Each byte of the packet represents a different group of steno keys. Determining the group of a certain byte of the packet is done by checking the first two bits, the remaining bits are set if the corresponding steno key was pressed for the stroke. The last set of keys (as indicated by leading `11`) needs to keep track of less keys than there are bits so one of the bits is constantly 0.
The start of a new packet can be detected by comparing the group “ID” (the two MSBs) of the current byte to that of the previously received byte. If the group “ID” of the current byte is smaller or equal to that of the previous byte, it means that the current byte is the beginning of a new packet.
The format of TX Bolt packets is shown below.
```
00HWPKTS 01UE*OAR 10GLBPRF 110#ZDST
```
Examples of steno strokes and the associated packet:
- `EUBG` = `01110000 10101000`
- `WAZ` = `00010000 01000010 11001000`
- `PHAPBGS` = `00101000 01000010 10101100 11000010`
### GeminiPR :id=geminipr ### GeminiPR :id=geminipr
GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including differentiating between top and bottom `S-`, and supporting non-English theories. GeminiPR encodes 42 keys into a 6-byte packet. While TX Bolt contains everything that is necessary for standard stenography, GeminiPR opens up many more options, including supporting non-English theories.
To select GeminiPR, add the following lines to your `rules.mk`:
```mk
STENO_ENABLE = yes
STENO_PROTOCOL = geminipr
```
All packets in the GeminiPR protocol consist of exactly six bytes, used as bit-arrays for different groups of keys. The beginning of a packet is indicated by setting the most significant bit (MSB) to 1 while setting the MSB of the remaining five bytes to 0.
The format of GeminiPR packets is shown below.
```
1 Fn #1 #2 #3 #4 #5 #6
0 S1- S2- T- K- P- W- H-
0 R- A- O- *1 *2 res1 res2
0 pwr *3 *4 -E -U -F -R
0 -P -B -L -G -T -S -D
0 #7 #8 #9 #A #B #C -Z
```
Examples of steno strokes and the associated packet:
- `EUBG` = `10000000 00000000 00000000 00001100 00101000 00000000`
- `WAZ` = `10000000 00000010 00100000 00000000 00000000 00000001`
- `PHAPBGS` = `10000000 00000101 00100000 00000000 01101010 00000000`
### Switching protocols on the fly :id=switching-protocols-on-the-fly
If you wish to switch the serial protocol used to transfer the steno chords without having to recompile your keyboard firmware every time, you can press the `QK_STENO_BOLT` and `QK_STENO_GEMINI` keycodes in order to switch protocols on the fly.
To enable these special keycodes, add the following lines to your `rules.mk`:
```mk
STENO_ENABLE = yes
STENO_PROTOCOL = all
```
If you want to switch protocols programatically, as part of a custom macro for example, don't use `tap_code(QK_STENO_*)`, as `tap_code` only supports [basic keycodes](keycodes_basic). Instead, you should use `steno_set_mode(STENO_MODE_*)`, whose valid arguments are `STENO_MODE_BOLT` and `STENO_MODE_GEMINI`.
The default protocol is Gemini PR but the last protocol used is stored in non-volatile memory so QMK will remember your choice between reboots of your keyboard &mdash; assuming that your keyboard features (emulated) EEPROM.
Naturally, this option takes the most amount of firmware space as it needs to compile the code for all the available stenography protocols. In most cases, compiling a single stenography protocol is sufficient.
The default value for `STENO_PROTOCOL` is `all`.
## Configuring QMK for Steno :id=configuring-qmk-for-steno ## Configuring QMK for Steno :id=configuring-qmk-for-steno
After enabling stenography and optionally selecting a protocol, you may also need disable mouse keys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them. Firstly, enable steno in your keymap's Makefile. You may also need disable mousekeys, extra keys, or another USB endpoint to prevent conflicts. The builtin USB stack for some processors only supports a certain number of USB endpoints and the virtual serial port needed for steno fills 3 of them.
!> If you had *explicitly* set `VIRSTER_ENABLE = no`, none of the serial stenography protocols (GeminiPR, TX Bolt) will work properly. You are expected to either set it to `yes`, remove the line from your `rules.mk` or send the steno chords yourself in an alternative way using the [provided interceptable hooks](#interfacing-with-the-code). ```make
STENO_ENABLE = yes
MOUSEKEY_ENABLE = no
```
In your keymap, create a new layer for Plover, that you can fill in with the [steno keycodes](#keycode-reference) (you will need to include `keymap_steno.h`, see `planck/keymaps/steno/keymap.c` for an example). Remember to create a key to switch to the layer as well as a key for exiting the layer. In your keymap create a new layer for Plover. You will need to include `keymap_steno.h`. See `planck/keymaps/steno/keymap.c` for an example. Remember to create a key to switch to the layer as well as a key for exiting the layer. If you would like to switch modes on the fly you can use the keycodes `QK_STENO_BOLT` and `QK_STENO_GEMINI`. If you only want to use one of the protocols you may set it up in your initialization function:
Once you have your keyboard flashed, launch Plover. Click the 'Configure...' button. In the 'Machine' tab, select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control). ```c
void eeconfig_init_user() {
steno_set_mode(STENO_MODE_GEMINI); // or STENO_MODE_BOLT
}
```
To test your keymap, you can chord keys on your keyboard and either look at the output of the 'paper tape' (Tools > Paper Tape) or that of the 'layout display' (Tools > Layout Display). If your strokes correctly show up, you are now ready to steno! Once you have your keyboard flashed launch Plover. Click the 'Configure...' button. In the 'Machine' tab select the Stenotype Machine that corresponds to your desired protocol. Click the 'Configure...' button on this tab and enter the serial port or click 'Scan'. Baud rate is fine at 9600 (although you should be able to set as high as 115200 with no issues). Use the default settings for everything else (Data Bits: 8, Stop Bits: 1, Parity: N, no flow control).
On the display tab click 'Open stroke display'. With Plover disabled you should be able to hit keys on your keyboard and see them show up in the stroke display window. Use this to make sure you have set up your keymap correctly. You are now ready to steno!
## Learning Stenography :id=learning-stenography ## Learning Stenography :id=learning-stenography
@ -121,7 +60,7 @@ To test your keymap, you can chord keys on your keyboard and either look at the
The steno code has three interceptable hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things. The steno code has three interceptable hooks. If you define these functions, they will be called at certain points in processing; if they return true, processing continues, otherwise it's assumed you handled things.
```c ```c
bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[MAX_STROKE_SIZE]); bool send_steno_chord_user(steno_mode_t mode, uint8_t chord[6]);
``` ```
This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen. This function is called when a chord is about to be sent. Mode will be one of `STENO_MODE_BOLT` or `STENO_MODE_GEMINI`. This represents the actual chord that would be sent via whichever protocol. You can modify the chord provided to alter what gets sent. Remember to return true if you want the regular sending process to happen.
@ -133,23 +72,15 @@ bool process_steno_user(uint16_t keycode, keyrecord_t *record) { return true; }
This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values. This function is called when a keypress has come in, before it is processed. The keycode should be one of `QK_STENO_BOLT`, `QK_STENO_GEMINI`, or one of the `STN_*` key values.
```c ```c
bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[MAX_STROKE_SIZE], int8_t n_pressed_keys); bool postprocess_steno_user(uint16_t keycode, keyrecord_t *record, steno_mode_t mode, uint8_t chord[6], int8_t pressed);
``` ```
This function is called after a key has been processed, but before any decision about whether or not to send a chord. This is where to put hooks for things like, say, live displays of steno chords or keys. This function is called after a key has been processed, but before any decision about whether or not to send a chord. If `IS_PRESSED(record->event)` is false, and `pressed` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This is where to put hooks for things like, say, live displays of steno chords or keys.
If `IS_PRESSED(record->event)` is false, and `n_pressed_keys` is 0 or 1, the chord will be sent shortly, but has not yet been sent. This relieves you of the need of keeping track of where a packet ends and another begins.
The `chord` argument contains the packet of the current chord as specified by the protocol in use. This is *NOT* simply a list of chorded steno keys of the form `[STN_E, STN_U, STN_BR, STN_GR]`. Refer to the appropriate protocol section of this document to learn more about the format of the packets in your steno protocol/mode of choice.
The `n_pressed_keys` argument is the number of physical keys actually being held down.
This is not always equal to the number of bits set to 1 (aka the [Hamming weight](https://en.wikipedia.org/wiki/Hamming_weight)) in `chord` because it is possible to simultaneously press down four keys, then release three of those four keys and then press yet another key while the fourth finger is still holding down its key.
At the end of this scenario given as an example, `chord` would have five bits set to 1 but
`n_pressed_keys` would be set to 2 because there are only two keys currently being pressed down.
## Keycode Reference :id=keycode-reference ## Keycode Reference :id=keycode-reference
You must include `keymap_steno.h` to your `keymap.c` with `#include "keymap_steno.h"` before you can use these keycodes As defined in `keymap_steno.h`.
> Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both. > Note: TX Bolt does not support the full set of keys. The TX Bolt implementation in QMK will map the GeminiPR keys to the nearest TX Bolt key so that one key map will work for both.
@ -193,10 +124,10 @@ You must include `keymap_steno.h` to your `keymap.c` with `#include "keymap_sten
|`STN_SR`|`STN_SR`| `-S`| |`STN_SR`|`STN_SR`| `-S`|
|`STN_DR`|`STN_DR`| `-D`| |`STN_DR`|`STN_DR`| `-D`|
|`STN_ZR`|`STN_ZR`| `-Z`| |`STN_ZR`|`STN_ZR`| `-Z`|
|`STN_FN`|| (Function)| |`STN_FN`|| (GeminiPR only)|
|`STN_RES1`||(Reset 1)| |`STN_RES1`||(GeminiPR only)|
|`STN_RES2`||(Reset 2)| |`STN_RES2`||(GeminiPR only)|
|`STN_PWR`||(Power)| |`STN_PWR`||(GeminiPR only)|
If you do not want to hit two keys with one finger combined keycodes can be used. These are also defined in `keymap_steno.h`, and causes both keys to be reported as pressed or released. To use these keycodes define `STENO_COMBINEDMAP` in your `config.h` file. If you do not want to hit two keys with one finger combined keycodes can be used. These are also defined in `keymap_steno.h`, and causes both keys to be reported as pressed or released. To use these keycodes define `STENO_COMBINEDMAP` in your `config.h` file.

View file

@ -14,48 +14,55 @@ Optionally, you might want to set a custom `TAPPING_TERM` time by adding somethi
```c ```c
#define TAPPING_TERM 175 #define TAPPING_TERM 175
#define TAPPING_TERM_PER_KEY
``` ```
The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead. The `TAPPING_TERM_PER_KEY` definition is only needed if you control the tapping term through a [custom `get_tapping_term` function](tap_hold.md#tapping_term), which may be needed because `TAPPING_TERM` affects not just tap-dance keys. The `TAPPING_TERM` time is the maximum time allowed between taps of your Tap Dance key, and is measured in milliseconds. For example, if you used the above `#define` statement and set up a Tap Dance key that sends `Space` on single-tap and `Enter` on double-tap, then this key will send `ENT` only if you tap this key twice in less than 175ms. If you tap the key, wait more than 175ms, and tap the key again you'll end up sending `SPC SPC` instead.
Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro. That macro takes a number which will later be used as an index into the `tap_dance_actions` array and turns it into a tap-dance keycode. Next, you will want to define some tap-dance keys, which is easiest to do with the `TD()` macro, that takes a number which will later be used as an index into the `tap_dance_actions` array.
After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options: After this, you'll want to use the `tap_dance_actions` array to specify what actions shall be taken when a tap-dance key is in action. Currently, there are five possible options:
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held. * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: Sends the `kc1` keycode when tapped once, `kc2` otherwise. When the key is held, the appropriate keycode is registered: `kc1` when pressed and held, `kc2` when tapped once, then pressed and held.
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode). * `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: Sends the `kc` keycode when tapped once, or moves to `layer`. (this functions like the `TO` layer keycode).
* This is the same as `ACTION_TAP_DANCE_DUAL_ROLE`, but renamed to something that is clearer about its functionality. Both names will work.
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode). * `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: Sends the `kc` keycode when tapped once, or toggles the state of `layer`. (this functions like the `TG` layer keycode).
* `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action. * `ACTION_TAP_DANCE_FN(fn)`: Calls the specified function - defined in the user keymap - with the final tap count of the tap dance action.
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets. * `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: Calls the first specified function - defined in the user keymap - on every tap, the second function when the dance action finishes (like the previous option), and the last function when the tap dance action resets.
* ~~`ACTION_TAP_DANCE_FN_ADVANCED_TIME(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn, tap_specific_tapping_term)`~~: This functions identically to the `ACTION_TAP_DANCE_FN_ADVANCED` function, but uses a custom tapping term for it, instead of the predefined `TAPPING_TERM`.
* This is deprecated in favor of the Per Key Tapping Term functionality, as outlined [here](tap_hold.md#tapping-term). You'd want to check for the specific `TD()` macro that you want to use (such as `TD(TD_ESC_CAPS)`) instead of using this specific Tap Dance function.
The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise. The first option is enough for a lot of cases, that just want dual roles. For example, `ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT)` will result in `Space` being sent on single-tap, `Enter` otherwise.
!> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported. !> Keep in mind that only [basic keycodes](keycodes_basic.md) are supported here. Custom keycodes are not supported.
Similar to the first option, the second and third option are good for simple layer-switching cases. Similar to the first option, the second option is good for simple layer-switching cases.
For more complicated cases, like blink the LEDs, fiddle with the backlighting, and so on, use the fourth or fifth option. Examples of each are listed below. For more complicated cases, use the third or fourth options (examples of each are listed below).
Finally, the fifth option is particularly useful if your non-Tap-Dance keys start behaving weirdly after adding the code for your Tap Dance keys. The likely problem is that you changed the `TAPPING_TERM` time to make your Tap Dance keys easier for you to use, and that this has changed the way your other keys handle interrupts.
## Implementation Details :id=implementation ## Implementation Details :id=implementation
Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works! Well, that's the bulk of it! You should now be able to work through the examples below, and to develop your own Tap Dance functionality. But if you want a deeper understanding of what's going on behind the scenes, then read on for the explanation of how it all works!
Let's go over the three functions mentioned in `ACTION_TAP_DANCE_FN_ADVANCED` in a little more detail. They all receive the same too arguments: a pointer to a structure that holds all dance related state information, and a pointer to a use case specific state variable. The three functions differ in when they are called. The first, `on_each_tap_fn()`, is called every time the tap dance key is *pressed*. Before it is called, the counter is incremented and the timer is reset. The second function, `on_dance_finished_fn()`, is called when the tap dance is interrupted or ends because `TAPPING_TERM` milliseconds have passed since the last tap. When the `finished` field of the dance state structure is set to `true`, the `on_dance_finished_fn()` is skipped. After `on_dance_finished_fn()` was called or would have been called, but no sooner than when the tap dance key is *released*, `on_dance_reset_fn()` is called. It is possible to end a tap dance immediately, skipping `on_dance_finished_fn()`, but not `on_dance_reset_fn`, by calling `reset_tap_dance(state)`. The main entry point is `process_tap_dance()`, called from `process_record_quantum()`, which is run for every keypress, and our handler gets to run early. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. If it was the same, we increment the counter and reset the timer.
To accomplish this logic, the tap dance mechanics use three entry points. The main entry point is `process_tap_dance()`, called from `process_record_quantum()` *after* `process_record_kb()` and `process_record_user()`. This function is responsible for calling `on_each_tap_fn()` and `on_dance_reset_fn()`. In order to handle interruptions of a tap dance, another entry point, `preprocess_tap_dance()` is run right at the beginning of `process_record_quantum()`. This function checks whether the key pressed is a tap-dance key. If it is not, and a tap-dance was in action, we handle that first, and enqueue the newly pressed key. If it is a tap-dance key, then we check if it is the same as the already active one (if there's one active, that is). If it is not, we fire off the old one first, then register the new one. Finally, `tap_dance_task()` periodically checks whether `TAPPING_TERM` has passed since the last key press and finishes a tap dance if that is the case.
This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness. This means that you have `TAPPING_TERM` time to tap the key again; you do not have to input all the taps within a single `TAPPING_TERM` timeframe. This allows for longer tap counts, with minimal impact on responsiveness.
Our next stop is `tap_dance_task()`. This handles the timeout of tap-dance keys.
For the sake of flexibility, tap-dance actions can be either a pair of keycodes, or a user function. The latter allows one to handle higher tap counts, or do extra things, like blink the LEDs, fiddle with the backlighting, and so on. This is accomplished by using an union, and some clever macros.
## Examples :id=examples ## Examples :id=examples
### Simple Example: Send `ESC` on Single Tap, `CAPS_LOCK` on Double Tap :id=simple-example ### Simple Example :id=simple-example
Here's a simple example for a single definition: Here's a simple example for a single definition:
1. In your `rules.mk`, add `TAP_DANCE_ENABLE = yes` 1. In your `rules.mk`, add `TAP_DANCE_ENABLE = yes`
2. In your `keymap.c` file, define the variables and definitions, then add to your keymap: 2. In your `config.h` (which you can copy from `qmk_firmware/keyboards/planck/config.h` to your keymap directory), add `#define TAPPING_TERM 200`
3. In your `keymap.c` file, define the variables and definitions, then add to your keymap:
```c ```c
// Tap Dance declarations // Tap Dance declarations
@ -85,15 +92,40 @@ All the enums used in the examples are declared like this:
```c ```c
// Enums defined for all examples: // Enums defined for all examples:
enum { enum {
TD_ESC_CAPS, CT_SE,
CT_CLN,
CT_EGG, CT_EGG,
CT_FLSH, CT_FLSH,
CT_CLN, X_TAP_DANCE
X_CTL,
}; };
``` ```
#### Example 1: Send "Safety Dance!" After 100 Taps :id=example-1 #### Example 1: Send `:` on Single Tap, `;` on Double Tap :id=example-1
```c
void dance_cln_finished(qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
register_code16(KC_COLN);
} else {
register_code(KC_SCLN);
}
}
void dance_cln_reset(qk_tap_dance_state_t *state, void *user_data) {
if (state->count == 1) {
unregister_code16(KC_COLN);
} else {
unregister_code(KC_SCLN);
}
}
// All tap dance functions would go here. Only showing this one.
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
};
```
#### Example 2: Send "Safety Dance!" After 100 Taps :id=example-2
```c ```c
void dance_egg(qk_tap_dance_state_t *state, void *user_data) { void dance_egg(qk_tap_dance_state_t *state, void *user_data) {
@ -108,7 +140,7 @@ qk_tap_dance_action_t tap_dance_actions[] = {
}; };
``` ```
#### Example 2: Turn LED Lights On Then Off, One at a Time :id=example-2 #### Example 3: Turn LED Lights On Then Off, One at a Time :id=example-3
```c ```c
// On each tap, light up one LED, from right to left // On each tap, light up one LED, from right to left
@ -149,74 +181,15 @@ void dance_flsh_reset(qk_tap_dance_state_t *state, void *user_data) {
ergodox_right_led_3_off(); ergodox_right_led_3_off();
} }
// All tap dances now put together. Example 2 is "CT_FLSH" // All tap dances now put together. Example 3 is "CT_FLASH"
qk_tap_dance_action_t tap_dance_actions[] = { qk_tap_dance_action_t tap_dance_actions[] = {
[TD_ESC_CAPS] = ACTION_TAP_DANCE_DOUBLE(KC_ESC, KC_CAPS), [CT_SE] = ACTION_TAP_DANCE_DOUBLE(KC_SPC, KC_ENT),
[CT_CLN] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, dance_cln_finished, dance_cln_reset),
[CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg), [CT_EGG] = ACTION_TAP_DANCE_FN(dance_egg),
[CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset) [CT_FLSH] = ACTION_TAP_DANCE_FN_ADVANCED(dance_flsh_each, dance_flsh_finished, dance_flsh_reset)
}; };
``` ```
#### Example 3: Send `:` on Tap, `;` on Hold :id=example-3
With a little effort, powerful tap-hold configurations can be implemented as tap dances. To emit taps as early as possible, we need to act on releases of the tap dance key. There is no callback for this in the tap dance framework, so we use `process_record_user()`.
```c
typedef struct {
uint16_t tap;
uint16_t hold;
uint16_t held;
} tap_dance_tap_hold_t;
bool process_record_user(uint16_t keycode, keyrecord_t *record) {
qk_tap_dance_action_t *action;
switch (keycode) {
case TD(CT_CLN): // list all tap dance keycodes with tap-hold configurations
action = &tap_dance_actions[TD_INDEX(keycode)];
if (!record->event.pressed && action->state.count && !action->state.finished) {
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)action->user_data;
tap_code16(tap_hold->tap);
}
}
return true;
}
void tap_dance_tap_hold_finished(qk_tap_dance_state_t *state, void *user_data) {
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
if (state->pressed) {
if (state->count == 1
#ifndef PERMISSIVE_HOLD
&& !state->interrupted
#endif
) {
register_code16(tap_hold->hold);
tap_hold->held = tap_hold->hold;
} else {
register_code16(tap_hold->tap);
tap_hold->held = tap_hold->tap;
}
}
}
void tap_dance_tap_hold_reset(qk_tap_dance_state_t *state, void *user_data) {
tap_dance_tap_hold_t *tap_hold = (tap_dance_tap_hold_t *)user_data;
if (tap_hold->held) {
unregister_code16(tap_hold->held);
tap_hold->held = 0;
}
}
#define ACTION_TAP_DANCE_TAP_HOLD(tap, hold) \
{ .fn = {NULL, tap_dance_tap_hold_finished, tap_dance_tap_hold_reset}, .user_data = (void *)&((tap_dance_tap_hold_t){tap, hold, 0}), }
qk_tap_dance_action_t tap_dance_actions[] = {
[CT_CLN] = ACTION_TAP_DANCE_TAP_HOLD(KC_COLN, KC_SCLN),
};
```
#### Example 4: 'Quad Function Tap-Dance' :id=example-4 #### Example 4: 'Quad Function Tap-Dance' :id=example-4
By [DanielGGordon](https://github.com/danielggordon) By [DanielGGordon](https://github.com/danielggordon)
@ -356,7 +329,7 @@ And then simply use `TD(X_CTL)` anywhere in your keymap.
If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace. If you want to implement this in your userspace, then you may want to check out how [DanielGGordon](https://github.com/qmk/qmk_firmware/tree/master/users/gordon) has implemented this in their userspace.
> In this configuration "hold" takes place **after** tap dance timeout. To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`). > In this configuration "hold" takes place **after** tap dance timeout (see `ACTION_TAP_DANCE_FN_ADVANCED_TIME`). To achieve instant hold, remove `state->interrupted` checks in conditions. As a result you may use comfortable longer tapping periods to have more time for taps and not to wait too long for holds (try starting with doubled `TAPPING_TERM`).
#### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5 #### Example 5: Using tap dance for advanced mod-tap and layer-tap keys :id=example-5
@ -538,18 +511,8 @@ void ql_reset(qk_tap_dance_state_t *state, void *user_data) {
// Associate our tap dance key with its functionality // Associate our tap dance key with its functionality
qk_tap_dance_action_t tap_dance_actions[] = { qk_tap_dance_action_t tap_dance_actions[] = {
[QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED(NULL, ql_finished, ql_reset) [QUOT_LAYR] = ACTION_TAP_DANCE_FN_ADVANCED_TIME(NULL, ql_finished, ql_reset, 275)
}; };
// Set a long-ish tapping term for tap-dance keys
uint16_t get_tapping_term(uint16_t keycode, keyrecord_t *record) {
switch (keycode) {
case QK_TAP_DANCE ... QK_TAP_DANCE_MAX:
return 275;
default:
return TAPPING_TERM;
}
}
``` ```
The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is(layer)` function which returns `true` if the given `layer` is active. The above code is similar to that used in previous examples. The one point to note is that we need to be able to check which layers are active at any time so we can toggle them if needed. To do this we use the `layer_state_is(layer)` function which returns `true` if the given `layer` is active.
@ -558,6 +521,6 @@ The use of `cur_dance()` and `ql_tap_state` mirrors the above examples.
The `case: TD_SINGLE_TAP` in `ql_finished` is similar to the above examples. The `TD_SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `TD_DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`. The `case: TD_SINGLE_TAP` in `ql_finished` is similar to the above examples. The `TD_SINGLE_HOLD` case works in conjunction with `ql_reset()` to switch to `_MY_LAYER` while the tap dance key is held, and to switch away from `_MY_LAYER` when the key is released. This mirrors the use of `MO(_MY_LAYER)`. The `TD_DOUBLE_TAP` case works by checking whether `_MY_LAYER` is the active layer, and toggling it on or off accordingly. This mirrors the use of `TG(_MY_LAYER)`.
`tap_dance_actions[]` works similar to the above examples. Note that, additionally, I set a longer tapping term for the tap dance keys. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here. In order for the per-key tapping terms to take effect, `TAPPING_TERM_PER_KEY` must be defined in your `config.h`. `tap_dance_actions[]` works similar to the above examples. Note that I used `ACTION_TAP_DANCE_FN_ADVANCED_TIME()` instead of `ACTION_TAP_DANCE_FN_ADVANCED()`. This is because I like my `TAPPING_TERM` to be short (\~175ms) for my non-tap-dance keys but find that this is too quick for me to reliably complete tap dance actions - thus the increased time of 275ms here.
Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`. Finally, to get this tap dance key working, be sure to include `TD(QUOT_LAYR)` in your `keymaps[]`.

107
docs/feature_terminal.md Normal file
View file

@ -0,0 +1,107 @@
# Terminal
> This feature is currently *huge*, and should probably only be put on boards with a lot of memory, or for fun.
The terminal feature is a command-line-like interface designed to communicate through a text editor with keystrokes. It's beneficial to turn off auto-indent features in your editor.
To enable, stick this in your `rules.mk` or `Makefile`:
TERMINAL_ENABLE = yes
And use the `TERM_ON` and `TERM_OFF` keycodes to turn it on or off.
When enabled, a `> ` prompt will appear, where you'll be able to type, backspace (a bell will ding if you reach the beginning and audio is enabled), and hit enter to send the command. Arrow keys are currently disabled so it doesn't get confused. Moving your cursor around with the mouse is discouraged.
`#define TERMINAL_HELP` enables some other output helpers that aren't really needed with this page.
Pressing "up" and "down" will allow you to cycle through the past 5 commands entered.
## Future Ideas
* Keyboard/user-extensible commands
* Smaller footprint
* Arrow key support
* Command history - Done
* SD card support
* LCD support for buffer display
* Keycode -> name string LUT
* Layer status
* *Analog/digital port read/write*
* RGB mode stuff
* Macro definitions
* EEPROM read/write
* Audio control
## Current Commands
### `about`
Prints out the current version of QMK with a build date:
```
> about
QMK Firmware
v0.5.115-7-g80ed73-dirty
Built: 2017-08-29-20:24:44
```
### `print-buffer`
Outputs the last 5 commands entered
```
> print-buffer
0. print-buffer
1. help
2. about
3. keymap 0
4. help
5. flush-buffer
```
### `flush-buffer`
Clears command buffer
```
> flush-buffer
Buffer cleared!
```
### `help`
Prints out the available commands:
```
> help
commands available:
about help keycode keymap exit print-buffer flush-buffer
```
### `keycode <layer> <row> <col>`
Prints out the keycode value of a certain layer, row, and column:
```
> keycode 0 1 0
0x29 (41)
```
### `keymap <layer>`
Prints out the entire keymap for a certain layer
```
> keymap 0
0x002b, 0x0014, 0x001a, 0x0008, 0x0015, 0x0017, 0x001c, 0x0018, 0x000c, 0x0012, 0x0013, 0x002a,
0x0029, 0x0004, 0x0016, 0x0007, 0x0009, 0x000a, 0x000b, 0x000d, 0x000e, 0x000f, 0x0033, 0x0034,
0x00e1, 0x001d, 0x001b, 0x0006, 0x0019, 0x0005, 0x0011, 0x0010, 0x0036, 0x0037, 0x0038, 0x0028,
0x5cd6, 0x00e0, 0x00e2, 0x00e3, 0x5cd4, 0x002c, 0x002c, 0x5cd5, 0x0050, 0x0051, 0x0052, 0x004f,
>
```
### `exit`
Exits the terminal - same as `TERM_OFF`.

View file

@ -358,46 +358,3 @@ CLI Flashing sequence:
2. Wait for the OS to detect the device 2. Wait for the OS to detect the device
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/blackpill_f411_tinyuf2 --keymap default` 3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/blackpill_f411_tinyuf2 --keymap default`
4. Wait for the keyboard to become available 4. Wait for the keyboard to become available
### `make` Targets
* `:uf2-split-left` and `:uf2-split-right`: Flashes the firmware but also sets the handedness setting in EEPROM by generating a side specific firmware.
## Raspberry Pi RP2040 UF2
The `rules.mk` setting for this bootloader is `rp2040`, and can be specified at the keymap or user level.
To ensure compatibility with the rp2040 bootloader, make sure this block is present in your `rules.mk`:
```make
# Bootloader selection
BOOTLOADER = rp2040
```
Compatible flashers:
* Any application able to copy a file from one place to another, such as _macOS Finder_ or _Windows Explorer_.
Flashing sequence:
1. Enter the bootloader using any of the following methods:
* Tap the `QK_BOOTLOADER` keycode
* Hold the `BOOTSEL` button on the PCB while plugin in the usb cable.
* Double-tap the `RESET` button on the PCB<sup>1</sup>.
2. Wait for the OS to detect the device
3. Copy the .uf2 file to the new USB disk
4. Wait for the keyboard to become available
or
CLI Flashing sequence:
1. Enter the bootloader using any of the following methods:
* Tap the `QK_BOOTLOADER` keycode
* Hold the `BOOTSEL` button on the PCB while plugin in the usb cable.
* Double-tap the `RESET` button on the PCB<sup>1</sup>.
2. Wait for the OS to detect the device
3. Flash via QMK CLI eg. `qmk flash --keyboard handwired/onekey/rpi_pico --keymap default`
4. Wait for the keyboard to become available
<sup>1</sup>: This works only if QMK was compiled with `RP2040_BOOTLOADER_DOUBLE_TAP_RESET` defined.

View file

@ -85,6 +85,7 @@
* [スワップハンド](ja/feature_swap_hands.md) * [スワップハンド](ja/feature_swap_hands.md)
* [タップダンス](ja/feature_tap_dance.md) * [タップダンス](ja/feature_tap_dance.md)
* [タップホールド設定](ja/tap_hold.md) * [タップホールド設定](ja/tap_hold.md)
* [ターミナル](ja/feature_terminal.md)
* [ユニコード](ja/feature_unicode.md) * [ユニコード](ja/feature_unicode.md)
* [ユーザスペース](ja/feature_userspace.md) * [ユーザスペース](ja/feature_userspace.md)
* [WPM 計算](ja/feature_wpm.md) * [WPM 計算](ja/feature_wpm.md)

View file

@ -144,7 +144,7 @@ QMK での全ての利用可能な設定にはデフォルトがあります。
## 設定可能な挙動 :id=behaviors-that-can-be-configured ## 設定可能な挙動 :id=behaviors-that-can-be-configured
* `#define TAPPING_TERM 200` * `#define TAPPING_TERM 200`
* タップがホールドになるまでの時間。 * タップがホールドになるまでの時間。500以上に設定された場合、タップ期間中にタップされたキーもホールドになります。(訳注: PERMISSIVE_HOLDも参照)
* `#define TAPPING_TERM_PER_KEY` * `#define TAPPING_TERM_PER_KEY`
* キーごとの `TAPPING_TERM` 設定の処理を有効にします * キーごとの `TAPPING_TERM` 設定の処理を有効にします
* `#define RETRO_TAPPING` * `#define RETRO_TAPPING`

View file

@ -28,6 +28,7 @@
* `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: 1回タップすると `kc1` キーコードを送信し、2回タップすると `kc2` キーコードを送信します。キーを押し続けているときは、適切なキーコードが登録されます: キーを押し続けた場合は `kc1`、一度タップしてから続けてもう一度キーを押してそのまま押し続けたときは、 `kc2` が登録されます。 * `ACTION_TAP_DANCE_DOUBLE(kc1, kc2)`: 1回タップすると `kc1` キーコードを送信し、2回タップすると `kc2` キーコードを送信します。キーを押し続けているときは、適切なキーコードが登録されます: キーを押し続けた場合は `kc1`、一度タップしてから続けてもう一度キーを押してそのまま押し続けたときは、 `kc2` が登録されます。
* `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` レイヤーに移動します(これは `TO` レイヤーキーコードのように機能します)。 * `ACTION_TAP_DANCE_LAYER_MOVE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` レイヤーに移動します(これは `TO` レイヤーキーコードのように機能します)。
* この機能は `ACTION_TAP_DANCE_DUAL_ROLE` と同じですが、機能が明確になるように関数名を変更しました。どちらの関数名でも実行できます。
* `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` の状態をトグルします(これは `TG` レイヤーキーコードのように機能します)。 * `ACTION_TAP_DANCE_LAYER_TOGGLE(kc, layer)`: 1回タップすると `kc` キーコードが送信され、2回タップすると `layer` の状態をトグルします(これは `TG` レイヤーキーコードのように機能します)。
* `ACTION_TAP_DANCE_FN(fn)`: ユーザーキーマップに定義した指定の関数が呼び出されます。タップダンス実行の回数分タップすると、最後の時点で呼び出されます。 * `ACTION_TAP_DANCE_FN(fn)`: ユーザーキーマップに定義した指定の関数が呼び出されます。タップダンス実行の回数分タップすると、最後の時点で呼び出されます。
* `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: タップする度にユーザーキーマップに定義した最初の関数が呼び出されます。タップダンスの実行が終わった時点で2番目の関数が呼び出され、タップダンスの実行をリセットするときに最後の関数が呼び出されます。 * `ACTION_TAP_DANCE_FN_ADVANCED(on_each_tap_fn, on_dance_finished_fn, on_dance_reset_fn)`: タップする度にユーザーキーマップに定義した最初の関数が呼び出されます。タップダンスの実行が終わった時点で2番目の関数が呼び出され、タップダンスの実行をリセットするときに最後の関数が呼び出されます。

112
docs/ja/feature_terminal.md Normal file
View file

@ -0,0 +1,112 @@
# ターミナル
<!---
original document: 0.8.147:docs/feature_terminal.md
git diff 0.8.147 HEAD -- docs/feature_terminal.md | cat
-->
> この機能は現在のところ*巨大*であり、おそらく大量のメモリを搭載したキーボード、または楽しみのためにのみ配置する必要があります。
ターミナル機能はテキストエディタを介してキーストロークで通信するように設計されたコマンドラインのようなインタフェースです。エディタで自動インデント機能をオフにすることは有益です。
有効にするには、以下を `rules.mk` または `Makefile` に貼り付けます:
TERMINAL_ENABLE = yes
そして、オンまたはオフにするために、`TERM_ON` および `TERM_OFF` キーコードを使います。
有効な場合、`> ` プロンプトが現れ、ここでコマンドやバックスペース(オーディオが有効な場合は、先頭に到達するとベルが鳴ります)を入力することができ、エンターを入力するとコマンドを送信します。矢印キーは現在のところ無効なため、混乱することはありません。マウスでカーソルを移動することはお勧めしません。
`#define TERMINAL_HELP` は、このページでは実際には必要のない他の出力ヘルパーを有効にします。
"上矢印" および "下矢印" により、過去に入力した5つのコマンドを順に切り替えることができます。
## 今後のアイデア
* キーボード/ユーザ拡張可能なコマンド
* より小さなフットプリント
* 矢印キーのサポート
* コマンド履歴 - 完了
* SD カードのサポート
* バッファディスプレイのための LCD サポート
* キーコード -> 名称の対応表
* レイヤー状態
* *アナログ/デジタル ポートの読み込み/書き込み*
* RGB モード関連機能
* マクロ定義
* EEPROM の読み込み/書き込み
* オーディオ制御
## 現在のコマンド
### `about`
現在の QMK のバージョンとビルドした日の出力:
```
> about
QMK Firmware
v0.5.115-7-g80ed73-dirty
Built: 2017-08-29-20:24:44
```
### `print-buffer`
最後に入力した5つのコマンドの出力
```
> print-buffer
0. print-buffer
1. help
2. about
3. keymap 0
4. help
5. flush-buffer
```
### `flush-buffer`
コマンドバッファをクリア
```
> flush-buffer
Buffer cleared!
```
### `help`
利用可能なコマンドの出力:
```
> help
commands available:
about help keycode keymap exit print-buffer flush-buffer
```
### `keycode <layer> <row> <col>`
特定のレイヤー、行および列のキーコード値の出力:
```
> keycode 0 1 0
0x29 (41)
```
### `keymap <layer>`
特定のレイヤーの全てのキーマップの出力
```
> keymap 0
0x002b, 0x0014, 0x001a, 0x0008, 0x0015, 0x0017, 0x001c, 0x0018, 0x000c, 0x0012, 0x0013, 0x002a,
0x0029, 0x0004, 0x0016, 0x0007, 0x0009, 0x000a, 0x000b, 0x000d, 0x000e, 0x000f, 0x0033, 0x0034,
0x00e1, 0x001d, 0x001b, 0x0006, 0x0019, 0x0005, 0x0011, 0x0010, 0x0036, 0x0037, 0x0038, 0x0028,
0x5cd6, 0x00e0, 0x00e2, 0x00e3, 0x5cd4, 0x002c, 0x002c, 0x5cd5, 0x0050, 0x0051, 0x0052, 0x004f,
>
```
### `exit`
ターミナルの終了 - `TERM_OFF` と同じ。

View file

@ -161,6 +161,7 @@ const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
* [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115) * [`bool process_combo(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_combo.c#L115)
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77) * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94) * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
* [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
* [Quantum 固有のキーコードを識別して処理する](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291) * [Quantum 固有のキーコードを識別して処理する](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
この一連のイベントの中の任意のステップで (`process_record_kb()` のような)関数は `false` を返して、以降の処理を停止することができます。 この一連のイベントの中の任意のステップで (`process_record_kb()` のような)関数は `false` を返して、以降の処理を停止することができます。

View file

@ -108,6 +108,8 @@ However, this does rely on the bootloader being set by the keyboard. If this inf
In this case, you'll have to fall back on specifying the bootloader. See the [Flashing Firmware](flashing.md) Guide for more details. In this case, you'll have to fall back on specifying the bootloader. See the [Flashing Firmware](flashing.md) Guide for more details.
!> If your bootloader is not detected by `qmk flash`, try running `qmk doctor` for suggestions on how to fix common problems.
## Test It Out! ## Test It Out!
Congrats! Your custom firmware has been programmed to your keyboard and you're ready to test it out! Congrats! Your custom firmware has been programmed to your keyboard and you're ready to test it out!

View file

@ -27,30 +27,24 @@ QMK maintains a Bundle of MSYS2, the CLI and all necessary dependencies. It also
You will need to install [QMK MSYS](https://msys.qmk.fm/). The latest release is available [here](https://github.com/qmk/qmk_distro_msys/releases/latest). You will need to install [QMK MSYS](https://msys.qmk.fm/). The latest release is available [here](https://github.com/qmk/qmk_distro_msys/releases/latest).
Alternatively, if you'd like to manually install MSYS2, the following section will walk you through the process.
<details> <details>
<summary>Manual Install</summary> <summary>Advanced Users</summary>
?> Ignore the following steps if you use `QMK MSYS`. !> <b style="font-size:150%">This process is not recommended for new users.</b>
If you'd like to manually install MSYS2, the following sections will walk you through the process.
#### Prerequisites #### Prerequisites
You will need to install MSYS2, Git and Python. Follow the installation instructions on https://www.msys2.org. You will need to install [MSYS2](https://www.msys2.org). Once installed, close any open MSYS terminals (purple icon) and open a new MinGW 64-bit terminal (blue icon) from the Start Menu.
Once MSYS2 is installed, close any open MSYS terminals and open a new MinGW 64-bit terminal.
!> **NOTE:** The MinGW 64-bit terminal is *not* the same as the MSYS terminal that opens when installation is completed. Your prompt should say "MINGW64" in purple text, rather than "MSYS". See [this page](https://www.msys2.org/wiki/MSYS2-introduction/#subsystems) for more information on the differences. !> **NOTE:** The MinGW 64-bit terminal is *not* the same as the MSYS terminal that opens when installation is completed. Your prompt should say "MINGW64" in purple text, rather than "MSYS". See [this page](https://www.msys2.org/wiki/MSYS2-introduction/#subsystems) for more information on the differences.
Then run the following command:
pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-toolchain mingw-w64-x86_64-python3-pip mingw-w64-x86_64-python-pillow
#### Installation #### Installation
Install the QMK CLI by running: Install the QMK CLI by running:
python3 -m pip install qmk pacman --needed --noconfirm --disable-download-timeout -S git mingw-w64-x86_64-python-qmk
</details> </details>

View file

@ -0,0 +1,48 @@
# WeAct Blackpill (STM32F411)
The WeAct Blackpill is a popular choice for handwired boards, as it offers a powerful micro controller, USB Type C, a good number of pins to use, and a large amount of firmware space. All for a ~$6 USD price tag.
* [WeAct GitHub for F411 Blackpill](https://github.com/WeActTC/MiniSTM32F4x1)
* Unfortunately, due to supply issues official WeAct F411 based blackpills may not be available.
![Blackpill F411](https://i.imgur.com/nCgeolTh.png)
## Pin Usage Limitations
While the Blackpill is a great choice to use in your keyboard, there are a number of caveats in regards to using them. The first is that a number of exposed pins cannot be used, or have special considerations/hardware tweaks that are required for proper opertion.
### Unusable pins
* Pins `A11` and `A12` are not useable because they're used for USB connection, and cannot be shared.
* In theory, these pins can be used. However, doing so may disable USB connectivity, outright, if used for anything other than a USB port
* Pin `B2` is used by `BOOT1` and cannot be used, without causing problems.
* `VBAT` is not a usable pin.
* `NRST` is not a usable pin.
### Pins to be avoided
* Pin `A9` is meant for VBUS Sense and should not be used, if it can be avoided. It has an internal pull-down resesitor, which may cause issues with usage. However, a pull-up resistor can work (~5.1k), but should be avoided.
* Pin `A10` can be used, but should be avoided. Any connection on this pin can prevent the bootloader from entering the proper mode for DFU flashing. A pull-up resistor (~22k) on this pin fixes the bootloader issue.
### Shared Usage
* Pin `A0` is shared with the User Key (button) on the controller. It can be used.
* Pin `C13` is shared with the onboard LED indicator, and is connected to +3.3V. This can be used, but may cause the LED to blink intermittently, depending on activity on the pin.
*
* Pins `A4`, `A5`, `A6` and `A7` are used by the SOI8 footprint on the back of the controller, that can be used for either an SPI Flash chip, or an SPI EEPROM chip. `A4` is the Chip Select pin, and cannot be shared. However, `A5`, `A6`, and `A7` are the `SCK`, `MISO`, and `MOSI` pins, respectively, and can be shared with other SPI devices.
### Limited Usage
* Pins `C13`, `C14`, and `C15` have limits on output current. They should be used only as input. Eg, they should not be used for row pins in COL2ROW matrix configurations, but can be used as column pins.
* This is because the column pins (in COL2ROW) are pulled up (the pullup strength is independant of the current sourcing limitation) and the ROW is driven low and sinks current, then we check the state of the COLs to look for keypresses.
* Pins `A0` and `B5` are not 5V tolerant, and should only be used with 3.3V compatible functionality.
## Additional Information
### Bootloader issuse
Due to the use of a 25MHz crystal, the controller may have issues entering the bootloader. Heating up the controller can help with this issue.
Also, if pin `A10` is connected to anything at all, it needs to have a pullup resistor (see [Pins to be avoided](#pins-to-be-avoided), above)
### Tiny UF2 Support
There is [tinyuf2 support for the WeAct Blackpill](https://github.com/adafruit/tinyuf2/tree/master/ports/stm32f4/boards/stm32f411ce_blackpill). Instructions on how to compile the bootloadr can be found [here](https://github.com/adafruit/tinyuf2#build-and-flash). Setting `BOOTLOADER = tinyuf2` will enable support for this user bootloader, and the correct configuration to prevent it from being overwritten when flashing firmware.

View file

@ -20,7 +20,7 @@ As such, if you wish to override this API consider limiting use to writing to lo
| `#define STM32_BOOTLOADER_DUAL_BANK` | Relevant for dual-bank STM32 MCUs, signifies that a GPIO is to be toggled in order to enter bootloader mode. | `FALSE` | | `#define STM32_BOOTLOADER_DUAL_BANK` | Relevant for dual-bank STM32 MCUs, signifies that a GPIO is to be toggled in order to enter bootloader mode. | `FALSE` |
| `#define STM32_BOOTLOADER_DUAL_BANK_GPIO` | Relevant for dual-bank STM32 MCUs, the pin to toggle when attempting to enter bootloader mode, e.g. `B8` | `<none>` | | `#define STM32_BOOTLOADER_DUAL_BANK_GPIO` | Relevant for dual-bank STM32 MCUs, the pin to toggle when attempting to enter bootloader mode, e.g. `B8` | `<none>` |
| `#define STM32_BOOTLOADER_DUAL_BANK_POLARITY` | Relevant for dual-bank STM32 MCUs, the value to set the pin to in order to trigger charging of the RC circuit. e.g. `0` or `1`. | `0` | | `#define STM32_BOOTLOADER_DUAL_BANK_POLARITY` | Relevant for dual-bank STM32 MCUs, the value to set the pin to in order to trigger charging of the RC circuit. e.g. `0` or `1`. | `0` |
| `#define STM32_BOOTLOADER_DUAL_BANK_DELAY` | Relevant for dual-bank STM32 MCUs, an arbitrary measurement of time to delay before resetting the MCU. Increasing number increases the delay. | `100` | | `#define STM32_BOOTLOADER_DUAL_BANK_DELAY` | Relevant for dual-bank STM32 MCUs, an arbitrary measurement of time to delay before resetting the MCU. Increasing number increases the delay. | `100000` |
Kinetis MCUs have no configurable options. Kinetis MCUs have no configurable options.

View file

@ -1,125 +0,0 @@
# Raspberry Pi RP2040
The following table shows the current driver status for peripherals on RP2040 MCUs:
| System | Support |
| ------------------------------------ | ---------------------------------------------- |
| [ADC driver](adc_driver.md) | Support planned (no ETA) |
| [Audio](audio_driver.md) | Support planned (no ETA) |
| [I2C driver](i2c_driver.md) | :heavy_check_mark: |
| [SPI driver](spi_driver.md) | :heavy_check_mark: |
| [WS2812 driver](ws2812_driver.md) | :heavy_check_mark: using `PIO` driver |
| [External EEPROMs](eeprom_driver.md) | :heavy_check_mark: using `I2C` or `SPI` driver |
| [EEPROM emulation](eeprom_driver.md) | Support planned (no ETA) |
| [serial driver](serial_driver.md) | :heavy_check_mark: using `SIO` or `PIO` driver |
| [UART driver](uart_driver.md) | Support planned (no ETA) |
## GPIO
<img alt="Raspberry Pi Pico pinout" src="https://i.imgur.com/nLaiYDE.jpg" width="48%"/>
<img alt="Sparkfun RP2040 Pro Micro pinout" src="https://i.imgur.com/1TPAhrs.jpg" width="48%"/>
!> The GPIO pins of the RP2040 are not 5V tolerant!
### Pin nomenclature
To address individual pins on the RP2040, QMK uses the `GPx` abbreviation -- where the `x` stands for the GPIO number of the pin. This number can likely be found on the official pinout diagram of your board. Note that these GPIO numbers match the RP2040 MCU datasheet, and don't necessarily match the number you see printed on the board. For instance the Raspberry Pi Pico uses numbers from 1 to 40 for their pins, but these are not identical to the RP2040's GPIO numbers. So if you want to use the pin 11 of the Pico for your keyboard, you would refer to it as `GP8` in the config files.
### Alternate functions
The RP2040 features flexible GPIO function multiplexing, this means that every pin can be connected to nearly all the internal peripherals like I2C, SPI, UART or PWM. This allows for flexible PCB designs that are much less restricted in the selection of GPIO pins. To find out which pin can use which peripheral refer to the official [Raspberry PI RP2040 datasheet](https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf#page=14) section 1.4.3 GPIO functions.
## Selecting hardware peripherals and drivers
QMK RP2040 support builds upon ChibiOS and thus follows their convention for activating drivers and associated hardware peripherals. These tables only give a quick overview which values have to be used, please refer to the ChibiOS specific sections on the driver pages.
### I2C Driver
| RP2040 Peripheral | `mcuconf.h` values | `I2C_DRIVER` |
| ----------------- | ------------------ | ------------ |
| `I2C0` | `RP_I2C_USE_I2C0` | `I2CD1` |
| `I2C1` | `RP_I2C_USE_I2C1` | `I2CD2` |
To configure the I2C driver please read the [ChibiOS/ARM](i2c_driver.md#arm-configuration) section.
### SPI Driver
| RP2040 Peripheral | `mcuconf.h` values | `SPI_DRIVER` |
| ----------------- | ------------------ | ------------ |
| `SPI0` | `RP_SPI_USE_SPI0` | `SPID0` |
| `SPI1` | `RP_SPI_USE_SPI1` | `SPID1` |
To configure the SPI driver please read the [ChibiOS/ARM](spi_driver.md#chibiosarm-configuration) section.
## Double-tap reset boot-loader entry :id=double-tap
The double-tap reset mechanism is an alternate way in QMK to enter the embedded mass storage UF2 boot-loader of the RP2040. It enables bootloader entry by a fast double-tap of the reset pin on start up, which is similar to the behavior of AVR Pro Micros. This feature activated by default for the Pro Micro RP2040 board, but has to be configured for other boards. To activate it, add the following options to your keyboards `config.h` file:
```c
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET // Activates the double-tap behavior
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_TIMEOUT 200U // Timeout window in ms in which the double tap can occur.
#define RP2040_BOOTLOADER_DOUBLE_TAP_RESET_LED_MASK 0U // Specify a optional status led which blinks when entering the bootloader
```
## Pre-defined RP2040 boards
QMK defines two boards that you can choose from to base your RP2040 powered keyboard upon. These boards provide pre-configured default pins and drivers.
### Generic Pro Micro RP2040
This is the default board that is chosen, unless any other RP2040 board is selected in your keyboards `rules.mk` file. It assumes a pin layout for the I2C, SPI and Serial drivers which is identical to the Sparkfun Pro Micro RP2040, however all values can be overwritten by defining them in your keyboards `config.h` file. The [double-tap](#double-tap) reset to enter boot-loader behavior is activated by default.
| Driver configuration define | Value |
| -------------------------------------------------------------------------- | ------------------------------------ |
| **I2C driver** | |
| `I2C_DRIVER` | `I2CD2` |
| `I2C1_SDA_PIN` | `GP2` |
| `I2C1_SCL_PIN` | `GP3` |
| **SPI driver** | |
| `SPI_DRIVER` | `SPID0` |
| `SPI_SCK_PIN` | `GP18` |
| `SPI_MISO_PIN` | `GP20` |
| `SPI_MOSI_PIN` | `GP19` |
| **Serial driver** | |
| `SERIAL_USART_DRIVER` ([SIO Driver](serial_driver.md#the-sio-driver) only) | `SIOD0` |
| `SOFT_SERIAL_PIN` | undefined, use `SERIAL_USART_TX_PIN` |
| `SERIAL_USART_TX_PIN` | `GP0` |
| `SERIAL_USART_RX_PIN` | `GP1` |
?> The pin-outs of Adafruit's KB2040 and Boardsource's Blok both deviate from the Sparkfun Pro Micro RP2040. Lookup the pin-out of these boards and adjust your keyboards pin definition accordingly if you want to use these boards.
### Generic RP2040 board
This board can be chosen as a base for RP2040 keyboards which configure all necessary pins and drivers themselves and do not wish to leverage the configuration matching the Generic Pro Micro RP2040 board. Thus it doesn't provide any pre-configured pins or drivers. To select this board add the following line to your keyboards `rules.mk` file.
```make
BOARD = GENERIC_RP_RP2040
```
## Split keyboard support
Split keyboards are fully supported using the [serial driver](serial_driver.md) in both full-duplex and half-duplex configurations. Two driver subsystems are supported by the RP2040, the hardware UART based `SIO` and the Programmable IO based `PIO` driver.
| Feature | [SIO Driver](serial_driver.md#the-sio-driver) | [PIO Driver](serial_driver.md#the-pio-driver) |
| ----------------------------- | --------------------------------------------- | --------------------------------------------- |
| Half-Duplex operation | | :heavy_check_mark: |
| Full-Duplex operation | :heavy_check_mark: | :heavy_check_mark: |
| `TX` and `RX` pin swapping | | :heavy_check_mark: |
| Any GPIO as `TX` and `RX` pin | Only UART capable pins | :heavy_check_mark: |
| Simple configuration | | :heavy_check_mark: |
The `PIO` driver is much more flexible then the `SIO` driver, the only "downside" is the usage of `PIO` resources which in turn are not available for advanced user programs. Under normal circumstances, this resource allocation will be a non-issue.
## RP2040 second stage bootloader selection
As the RP2040 does not have any internal flash memory it depends on an external SPI flash memory chip to store and execute instructions from. To successfully interact with a wide variety of these chips a second stage bootloader that is compatible with the chosen external flash memory has to be supplied with each firmware image. By default an `W25Q080` compatible bootloader is assumed, but others can be chosen by adding one of the defines listed in the table below to your keyboards `config.h` file.
| Compatible with flash chip | Selection |
| :------------------------- | ---------------------------------- |
| W25Q080 | Selected by default |
| AT25SF128A | `#define RP2040_FLASH_AT25SF128A` |
| GD25Q64CS | `#define RP2040_FLASH_GD25Q64CS` |
| W25X10CL | `#define RP2040_FLASH_W25X10CL` |
| IS25LP080 | `#define RP2040_FLASH_IS25LP080` |
| Generic 03H flash | `#define RP2040_FLASH_GENERIC_03H` |

View file

@ -79,6 +79,9 @@ https://github.com/qmk/qmk_firmware/pulls?q=is%3Apr+is%3Aclosed+label%3Akeyboard
- `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions.md?id=keyboard_pre_init_-function-documentation) - `matrix_init_board()` etc. migrated to `keyboard_pre_init_kb()`, see: [keyboard_pre_init*](custom_quantum_functions.md?id=keyboard_pre_init_-function-documentation)
- prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix.md?id=lite) - prefer `CUSTOM_MATRIX = lite` if custom matrix used, allows for standard debounce, see [custom matrix 'lite'](custom_matrix.md?id=lite)
- prefer LED indicator [Configuration Options](feature_led_indicators.md?id=configuration-options) to custom `led_update_*()` implementations where possible - prefer LED indicator [Configuration Options](feature_led_indicators.md?id=configuration-options) to custom `led_update_*()` implementations where possible
- Encoder support should not be hacked into the keymap here -- no `tap_code(dynamic_keymap_get_keycode())` or `action_exec()` hacks. The [Encoder Map](feature_encoders.md?id=encoder-map) feature already supports the dynamic keymap feature (what power's VIA's "live keymap updates" capability).
- If support is absolutely necessary, it should be implemented exclusively at the keymap level, with none of the implementation bleeding into the keyboard level (no empty rows/columns, no encoder specific layouts, etc.), as those configurations can be redefined at the keymap level. Keymaps can then choose to use the `action_exec` hack. <!-- because people will complain, give them a way to implement it, in the meanwhile. To be removed. -->
- [Request for official proper VIA support](https://github.com/the-via/app/issues/26)
- `<keyboard>.h` - `<keyboard>.h`
- `#include "quantum.h"` appears at the top - `#include "quantum.h"` appears at the top
- `LAYOUT` macros should use standard definitions if applicable - `LAYOUT` macros should use standard definitions if applicable

View file

@ -108,7 +108,58 @@ Example:
} }
``` ```
### RGB Lighting ## Non-RGB LED Lighting
This section controls basic 2-pin LEDs, which typically pass through keyswitches and are soldered into the PCB, or are placed in PCB sockets.
### Backlight
* `breathing`
* Enable backlight breathing, if supported
* `breathing_period`
* The length of one backlight “breath” in seconds
* `levels`
* The number of brightness levels (maximum 31, excluding off)
* `pin`
* The pin that controls the backlight LED(s)
Example:
```json
{
"backlight": {
"breathing": true,
"breathing_period": 5,
"levels": 15,
"pin": "B7"
}
}
```
### LED Indicators
Used for indicating Num Lock, Caps Lock, and Scroll Lock. May be soldered in-switch or in a dedicated area.
* `num_lock`
* The pin that controls the `Num Lock` LED
* `caps_lock`
* The pin that controls the `Caps Lock` LED
* `scroll_lock`
* The pin that controls the `Scroll Lock` LED
Example:
```json
{
"indicators": {
"num_lock": "B6",
"caps_lock": "D2",
"scroll_lock": "A3"
}
}
```
## RGB Lighting
This section controls the legacy WS2812 support in QMK. This should not be confused with the RGB Matrix feature, which can be used to control both WS2812 and ISSI RGB LEDs. This section controls the legacy WS2812 support in QMK. This should not be confused with the RGB Matrix feature, which can be used to control both WS2812 and ISSI RGB LEDs.
@ -152,7 +203,7 @@ Example:
} }
``` ```
#### RGBLight Animations ### RGBLight Animations
The following animations can be enabled: The following animations can be enabled:
@ -188,38 +239,24 @@ Example:
The device version is a BCD (binary coded decimal) value, in the format `MMmr`, so the below value would look like `0x0100` in the generated code. This also means the maximum valid values for each part are `99.9.9`, despite it being a hexadecimal value under the hood. The device version is a BCD (binary coded decimal) value, in the format `MMmr`, so the below value would look like `0x0100` in the generated code. This also means the maximum valid values for each part are `99.9.9`, despite it being a hexadecimal value under the hood.
### Encoders ### Secure
This section controls the basic [rotary encoder](feature_encoders.md) support. The following options can be configured:
The following items can be set. Not every value is required. |Key |Description |
|------------------|---------------------------------------------------------------------------------|
|`unlock_sequence` | Timeout for the user to perform the configured unlock sequence - `0` to disable |
|`unlock_timeout` | Timeout while unlocked before returning to locked - `0` to disable |
|`idle_timeout` | Array of matrix locations describing a sequential sequence of keypresses |
* `pin_a` Example:
* __Required__. A pad definition
* `pin_b`
* __Required__. B pad definition
* `resolution`
* How many pulses the encoder registers between each detent
Examples:
```json ```json
{ {
"encoder": { "secure": {
"rotary": [ "unlock_sequence": [ [0,0], [0,1] ],
{ "pin_a": "B5", "pin_b": "A2" } "unlock_timeout": 5000,
] "idle_timeout": 60000
}
}
```
```json
{
"encoder": {
"rotary": [
{ "pin_a": "B5", "pin_b": "A2", "resolution": 4 }
{ "pin_a": "B6", "pin_b": "A3", "resolution": 2 }
]
} }
} }
``` ```

View file

@ -1,301 +1,129 @@
# 'serial' Driver # 'serial' Driver
This driver powers the [Split Keyboard](feature_split_keyboard.md) feature.
The serial driver powers the [Split Keyboard](feature_split_keyboard.md) feature. Several implementations are available, depending on the platform of your split keyboard. Note that none of the drivers support split keyboards with more then two halves.
| Driver | AVR | ARM | Connection between halves |
| --------------------------------------- | ------------------ | ------------------ | --------------------------------------------------------------------------------------------- |
| [Bitbang](#bitbang) | :heavy_check_mark: | :heavy_check_mark: | Single wire communication. One wire is used for reception and transmission. |
| [USART Half-duplex](#usart-half-duplex) | | :heavy_check_mark: | Efficient single wire communication. One wire is used for reception and transmission. |
| [USART Full-duplex](#usart-full-duplex) | | :heavy_check_mark: | Efficient two wire communication. Two distinct wires are used for reception and transmission. |
?> Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards. ?> Serial in this context should be read as **sending information one bit at a time**, rather than implementing UART/USART/RS485/RS232 standards.
<hr> Drivers in this category have the following characteristics:
* bit bang and USART Half-duplex provide data and signaling over a single conductor
* USART Full-duplex provide data and signaling over two conductors
* They are all limited to single master and single slave communication scheme
## Bitbang ## Supported Driver Types
This is the Default driver, the absence of configuration assumes this driver. It works by [bit banging](https://en.wikipedia.org/wiki/Bit_banging) a GPIO pin using the CPU. It is therefore not as efficient as a dedicated hardware peripheral, which the Half-duplex and Full-duplex drivers use. | | AVR | ARM |
| ----------------- | ------------------ | ------------------ |
| bit bang | :heavy_check_mark: | :heavy_check_mark: |
| USART Half-duplex | | :heavy_check_mark: |
| USART Full-duplex | | :heavy_check_mark: |
!> On ARM platforms the bitbang driver causes connection issues when using it together with the bitbang WS2812 driver. Choosing alternate drivers for both serial and WS2812 (instead of bitbang) is strongly recommended. ## Driver configuration
### Pin configuration ### Bitbang
Default driver, the absence of configuration assumes this driver. To configure it, add this to your rules.mk:
```
LEFT RIGHT
+-------+ SERIAL +-------+
| SSP |-----------------| SSP |
| | VDD | |
| |-----------------| |
| | GND | |
| |-----------------| |
+-------+ +-------+
```
One GPIO pin is needed for the bitbang driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SOFT_SERIAL_PIN` (SSP) in the configuration. A simple TRS or USB cable provides enough conductors for this driver to work.
### Setup
To use the bitbang driver follow these steps to activate it.
1. Change the `SERIAL_DRIVER` to `bitbang` in your keyboards `rules.mk` file:
```make ```make
SERIAL_DRIVER = bitbang SERIAL_DRIVER = bitbang
``` ```
2. Configure the GPIO pin of your keyboard via the `config.h` file: Configure the driver via your config.h:
```c ```c
#define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6 #define SOFT_SERIAL_PIN D0 // or D1, D2, D3, E6
#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
// 0: about 189kbps (Experimental only)
// 1: about 137kbps (default)
// 2: about 75kbps
// 3: about 39kbps
// 4: about 26kbps
// 5: about 20kbps
``` ```
3. On ARM platforms you must turn on ChibiOS `PAL_USE_CALLBACKS` feature: #### ARM
* In `halconf.h` add the line `#define PAL_USE_CALLBACKS TRUE`. !> The bitbang driver causes connection issues with bitbang WS2812 driver
<hr> Along with the generic options above, you must also turn on the `PAL_USE_CALLBACKS` feature in your halconf.h.
## USART Half-duplex ### USART Half-duplex
Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. `SERIAL_PIN_TX` for this driver is the configured USART TX pin. As this Pin is configured in open-drain mode an **external pull-up resistor is needed to keep the line high** (resistor values of 1.5k to 8.2k are known to work). To configure it, add this to your rules.mk:
Targeting ARM boards based on ChibiOS, where communication is offloaded to a USART hardware device that supports Half-duplex operation. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose this driver or the Full-duplex driver whenever possible.
### Pin configuration
```
LEFT RIGHT
+-------+ | | +-------+
| | R R | |
| | | SERIAL | | |
| TX |-----------------| TX |
| | VDD | |
| |-----------------| |
| | GND | |
| |-----------------| |
+-------+ +-------+
```
Only one GPIO pin is needed for the Half-duplex driver, as only one wire is used for receiving and transmitting data. This pin is referred to as the `SERIAL_USART_TX_PIN` in the configuration. Take care that the pin you chose can act as the TX pin of the USART peripheral. A simple TRS or USB cable provides enough conductors for this driver to work. As the split connection is configured to work in open-drain mode, an **external pull-up resistor is needed to keep the line high**. Resistor values of 1.5kΩ to 8.2kΩ are known to work.
### Setup
To use the Half-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
```make ```make
SERIAL_DRIVER = usart SERIAL_DRIVER = usart
``` ```
2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file: Configure the hardware via your config.h:
```make
SERIAL_DRIVER = vendor
```
3. Configure the hardware of your keyboard via the `config.h` file:
```c ```c
#define SERIAL_USART_TX_PIN B6 // The GPIO pin that is used split communication. #define SOFT_SERIAL_PIN B6 // USART TX pin
``` //#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
For STM32 MCUs several GPIO configuration options can be changed as well. See the section ["Alternate Functions for selected STM32 MCUs"](alternate-functions-for-selected-stm32-mcus). // 0: about 460800 baud
// 1: about 230400 baud (default)
```c // 2: about 115200 baud
#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below. // 3: about 57600 baud
// 4: about 38400 baud
// 5: about 19200 baud
#define SERIAL_USART_DRIVER SD1 // USART driver of TX pin. default: SD1
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 #define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
``` ```
1. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem). You must also enable the ChibiOS `SERIAL` feature:
* In your board's halconf.h: `#define HAL_USE_SERIAL TRUE`
* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
<hr> Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
## USART Full-duplex ### USART Full-duplex
Targeting STM32 boards where communication is offloaded to a USART hardware device. The advantage over bitbang is that this provides fast and accurate timings. USART Full-Duplex requires two conductors **without** pull-up resistors instead of one conductor with a pull-up resistor unlike the Half-duplex driver. Due to its internal design it is more efficent, which can result in even faster transmission speeds.
Targeting ARM boards based on ChibiOS where communication is offloaded to an USART hardware device. The advantages over bitbanging are fast, accurate timings and reduced CPU usage. Therefore it is advised to choose this driver or the Full-duplex driver whenever possible. Due to its internal design it is slightly more efficient then the Half-duplex driver, but it should be primarily chosen if Half-duplex operation is not supported by the USART peripheral. #### Pin configuration
### Pin configuration `SERIAL_USART_TX_PIN` is the USART `TX` pin, `SERIAL_USART_RX_PIN` is the USART `RX` pin. No external pull-up resistors are needed as the `TX` pin operates in push-pull mode. To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refeer to the corresponding datasheets of your MCU or find those settings in the table below.
``` #### Connecting the halves and Pin Swap
LEFT RIGHT Please note that `TX` of the master half has to be connected with the `RX` pin of the slave half and `RX` of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the pcb. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU, this feature can be enabled using `#define SERIAL_USART_PIN_SWAP` in your config.h.
+-------+ +-------+
| | SERIAL | |
| TX |-----------------| RX |
| | SERIAL | |
| RX |-----------------| TX |
| | VDD | |
| |-----------------| |
| | GND | |
| |-----------------| |
+-------+ +-------+
```
Two GPIO pins are needed for the Full-duplex driver, as two distinct wires are used for receiving and transmitting data. The pin transmitting data is the `TX` pin and refereed to as the `SERIAL_USART_TX_PIN`, the pin receiving data is the `RX` pin and refereed to as the `SERIAL_USART_RX_PIN` in this configuration. Please note that `TX` pin of the master half has to be connected with the `RX` pin of the slave half and the `RX` pin of the master half has to be connected with the `TX` pin of the slave half! Usually this pin swap has to be done outside of the MCU e.g. with cables or on the PCB. Some MCUs like the STM32F303 used on the Proton-C allow this pin swap directly inside the MCU. A simple TRRS or USB cable provides enough conductors for this driver to work. #### Setup
To use the driver, add this to your rules.mk:
To use this driver the usart peripherals `TX` and `RX` pins must be configured with the correct Alternate-functions. If you are using a Proton-C everything is already setup, same is true for STM32F103 MCUs. For MCUs which are using a modern flexible GPIO configuration you have to specify these by setting `SERIAL_USART_TX_PAL_MODE` and `SERIAL_USART_RX_PAL_MODE`. Refer to the corresponding datasheets of your MCU or find those settings in the section ["Alternate Functions for selected STM32 MCUs"](#alternate-functions-for-selected-stm32-mcus).
### Setup
To use the Full-duplex driver follow these steps to activate it. If you target the Raspberry Pi RP2040 PIO implementation skip step 1.
1. Change the `SERIAL_DRIVER` to `usart` in your keyboards `rules.mk` file:
```make ```make
SERIAL_DRIVER = usart SERIAL_DRIVER = usart
``` ```
2. (RP2040 PIO only!) Change the `SERIAL_DRIVER` to `vendor` in your keyboards `rules.mk` file: Next configure the hardware via your config.h:
```make
SERIAL_DRIVER = vendor
```
3. Configure the hardware of your keyboard via the `config.h` file:
```c ```c
#define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode. #define SERIAL_USART_FULL_DUPLEX // Enable full duplex operation mode.
#define SERIAL_USART_TX_PIN B6 // USART TX pin #define SERIAL_USART_TX_PIN B6 // USART TX pin
#define SERIAL_USART_RX_PIN B7 // USART RX pin #define SERIAL_USART_RX_PIN B7 // USART RX pin
``` //#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below.
//#define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve.
For STM32 MCUs several GPIO configuration options, including the ability for `TX` to `RX` pin swapping, can be changed as well. See the section ["Alternate Functions for selected STM32 MCUs"](alternate-functions-for-selected-stm32-mcus). // Check if this feature is necessary with your keyboard design and available on the mcu.
#define SELECT_SOFT_SERIAL_SPEED 1 // or 0, 2, 3, 4, 5
```c // 0: 460800 baud
#define SERIAL_USART_PIN_SWAP // Swap TX and RX pins if keyboard is master halve. (Only available on some MCUs) // 1: 230400 baud (default)
#define USART1_REMAP // Remap USART TX and RX pins on STM32F103 MCUs, see table below. // 2: 115200 baud
// 3: 57600 baud
// 4: 38400 baud
// 5: 19200 baud
#define SERIAL_USART_DRIVER SD1 // USART driver of TX and RX pin. default: SD1
#define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7 #define SERIAL_USART_TX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
``` #define SERIAL_USART_RX_PAL_MODE 7 // Pin "alternate function", see the respective datasheet for the appropriate values for your MCU. default: 7
1. Decide either for `SERIAL`, `SIO` or `PIO` subsystem, see the section ["Choosing a driver subsystem"](#choosing-a-driver-subsystem).
<hr>
## Choosing a driver subsystem
### The `SERIAL` driver
The `SERIAL` Subsystem is supported for the majority of ChibiOS MCUs and should be used whenever supported. Follow these steps in order to activate it:
1. In your keyboards `halconf.h` add:
```c
#define HAL_USE_SERIAL TRUE
```
2. In your keyboards `mcuconf.h`: activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
Just below `#include_next <mcuconf.h>` add:
```c
#include_next <mcuconf.h>
#undef STM32_SERIAL_USE_USARTn
#define STM32_SERIAL_USE_USARTn TRUE
```
Where 'n' matches the peripheral number of your selected USART on the MCU.
3. In you keyboards `config.h`: override the default USART `SERIAL` driver if you use a USART peripheral that does not belong to the default selected `SD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SD3`.
```c
#define SERIAL_USART_DRIVER SD3
```
### The `SIO` driver
The `SIO` Subsystem was added to ChibiOS with the 21.11 release and is only supported on selected MCUs. It should only be chosen when the `SERIAL` subsystem is not supported by your MCU.
Follow these steps in order to activate it:
1. In your keyboards `halconf.h` add:
```c
#define HAL_USE_SIO TRUE
```
2. In your keyboards `mcuconf.h:` activate the USART peripheral that is used on your MCU. The shown example is for an STM32 MCU, so this will not work on MCUs by other manufacturers. You can find the correct names in the `mcuconf.h` files of your MCU that ship with ChibiOS.
Just below `#include_next <mcuconf.h>` add:
```c
#include_next <mcuconf.h>
#undef STM32_SIO_USE_USARTn
#define STM32_SIO_USE_USARTn TRUE
```
Where 'n' matches the peripheral number of your selected USART on the MCU.
3. In you keyboards `config.h`: override the default USART `SIO` driver if you use a USART peripheral that does not belong to the default selected `SIOD1` driver. For instance, if you selected `STM32_SERIAL_USE_USART3` the matching driver would be `SIOD3`.
```c
#define SERIAL_USART_DRIVER SIOD3
```
### The `PIO` driver
The `PIO` subsystem is a Raspberry Pi RP2040 specific implementation, using the integrated PIO peripheral and is therefore only available on this MCU. Because of the flexible nature of the PIO peripherals, **any** GPIO pin can be used as a `TX` or `RX` pin. Half-duplex and Full-duplex operation is fully supported. The Half-duplex operation mode uses the built-in pull-ups and GPIO manipulation on the RP2040 to drive the line high by default. An external pull-up is therefore not necessary.
Configure the hardware via your config.h:
```c
#define SERIAL_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the Serial implementation uses the PIO0 peripheral
```
The Serial PIO program uses 2 state machines, 13 instructions and the complete interrupt handler of the PIO peripheral it is running on.
<hr>
## Advanced Configuration
There are several advanced configuration options that can be defined in your keyboards `config.h` file:
### Baudrate
If you're having issues or need a higher baudrate with serial communication, you can change the baudrate which in turn controls the communication speed for serial. You want to lower the baudrate if you experience failed transactions.
```c
#define SELECT_SOFT_SERIAL_SPEED {#}
```
| Speed | Bitbang | Half-duplex and Full-duplex |
| ----- | -------------------------- | --------------------------- |
| `0` | 189000 baud (experimental) | 460800 baud |
| `1` | 137000 baud (default) | 230400 baud (default) |
| `2` | 75000 baud | 115200 baud |
| `3` | 39000 baud | 57600 baud |
| `4` | 26000 baud | 38400 baud |
| `5` | 20000 baud | 19200 baud |
Alternatively you can specify the baudrate directly by defining `SERIAL_USART_SPEED`.
### Timeout
This is the default time window in milliseconds in which a successful communication has to complete. Usually you don't want to change this value. But you can do so anyways by defining an alternate one in your keyboards `config.h` file:
```c
#define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20 #define SERIAL_USART_TIMEOUT 20 // USART driver timeout. default 20
``` ```
<hr> You must also enable the ChibiOS `SERIAL` feature:
* In your board's halconf.h: `#define HAL_USE_SERIAL TRUE`
* In your board's mcuconf.h: `#define STM32_SERIAL_USE_USARTn TRUE` (where 'n' matches the peripheral number of your selected USART on the MCU)
## Troubleshooting Do note that the configuration required is for the `SERIAL` peripheral, not the `UART` peripheral.
If you're having issues withe serial communication, you can enable debug messages that will give you insights which part of the communication failed. The enable these messages add to your keyboards `config.h` file: #### Pins for USART Peripherals with Alternate Functions for selected STM32 MCUs
```c ##### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
#define SERIAL_DEBUG
```
?> The messages will be printed out to the `CONSOLE` output. For additional information, refer to [Debugging/Troubleshooting QMK](faq_debug.md).
## Alternate Functions for selected STM32 MCUs
Pins for USART Peripherals with
### STM32F303 / Proton-C [Datasheet](https://www.st.com/resource/en/datasheet/stm32f303cc.pdf)
Pin Swap available: :heavy_check_mark: Pin Swap available: :heavy_check_mark:
| Pin | Function | Mode | | Pin | Function | Mode |
| ---------- | -------- | ---- | | ---------- | -------- | ---- |
| **USART1** | | | | **USART1** | | |
| PA9 | TX | AF7 | | PA9 | TX | AF7 |
@ -323,11 +151,11 @@ Pin Swap available: :heavy_check_mark:
| PD8 | TX | AF7 | | PD8 | TX | AF7 |
| PD9 | RX | AF7 | | PD9 | RX | AF7 |
### STM32F072 [Datasheet](https://www.st.com/resource/en/datasheet/stm32f072c8.pdf) ##### STM32F072 [Datasheet](https://www.st.com/resource/en/datasheet/stm32f072c8.pdf)
Pin Swap available: :heavy_check_mark: Pin Swap available: :heavy_check_mark:
| Pin | Function | Mode | | Pin | Function | Mode |
| ------ | -------- | ---- | | ------ | -------- | ---- |
| USART1 | | | | USART1 | | |
| PA9 | TX | AF1 | | PA9 | TX | AF1 |
@ -352,7 +180,7 @@ Pin Swap available: :heavy_check_mark:
| PA0 | TX | AF4 | | PA0 | TX | AF4 |
| PA1 | RX | AF4 | | PA1 | RX | AF4 |
### STM32F103 Medium Density (C8-CB) [Datasheet](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf) ##### STM32F103 Medium Density (C8-CB) [Datasheet](https://www.st.com/resource/en/datasheet/stm32f103c8.pdf)
Pin Swap available: N/A Pin Swap available: N/A
@ -362,7 +190,7 @@ Pin remapping:
The pins of USART Peripherals use default Pins that can be remapped to use other pins using the AFIO registers. Default pins are marked **bold**. Add the appropriate defines to your config.h file. The pins of USART Peripherals use default Pins that can be remapped to use other pins using the AFIO registers. Default pins are marked **bold**. Add the appropriate defines to your config.h file.
| Pin | Function | Mode | USART_REMAP | | Pin | Function | Mode | USART_REMAP |
| ---------- | -------- | ---- | ------------------- | | ---------- | -------- | ---- | ------------------- |
| **USART1** | | | | | **USART1** | | | |
| **PA9** | TX | AFPP | | | **PA9** | TX | AFPP | |

View file

@ -155,6 +155,7 @@ The `process_record()` function itself is deceptively simple, but hidden within
* [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77) * [`bool process_printer(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_printer.c#L77)
* [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94) * [`bool process_auto_shift(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_auto_shift.c#L94)
* `bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)` * `bool process_dynamic_tapping_term(uint16_t keycode, keyrecord_t *record)`
* [`bool process_terminal(uint16_t keycode, keyrecord_t *record)`](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/process_keycode/process_terminal.c#L264)
* [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291) * [Identify and process Quantum-specific keycodes](https://github.com/qmk/qmk_firmware/blob/e1203a222bb12ab9733916164a000ef3ac48da93/quantum/quantum.c#L291)
At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing. At any step during this chain of events a function (such as `process_record_kb()`) can `return false` to halt all further processing.

View file

@ -11,12 +11,11 @@ These LEDs are called "addressable" because instead of using a wire per color, e
## Supported Driver Types ## Supported Driver Types
| | AVR | ARM | | | AVR | ARM |
| -------- | ------------------ | ------------------ | |----------|--------------------|--------------------|
| bit bang | :heavy_check_mark: | :heavy_check_mark: | | bit bang | :heavy_check_mark: | :heavy_check_mark: |
| I2C | :heavy_check_mark: | | | I2C | :heavy_check_mark: | |
| SPI | | :heavy_check_mark: | | SPI | | :heavy_check_mark: |
| PWM | | :heavy_check_mark: | | PWM | | :heavy_check_mark: |
| PIO | | :heavy_check_mark: |
## Driver configuration ## Driver configuration
@ -34,11 +33,11 @@ The default setting is 280 µs, which should work for most cases, but this can b
Some variants of the WS2812 may have their color components in a different physical or logical order. For example, the WS2812B-2020 has physically swapped red and green LEDs, which causes the wrong color to be displayed, because the default order of the bytes sent over the wire is defined as GRB. Some variants of the WS2812 may have their color components in a different physical or logical order. For example, the WS2812B-2020 has physically swapped red and green LEDs, which causes the wrong color to be displayed, because the default order of the bytes sent over the wire is defined as GRB.
In this case, you can change the byte order by defining `WS2812_BYTE_ORDER` as one of the following values: In this case, you can change the byte order by defining `WS2812_BYTE_ORDER` as one of the following values:
| Byte order | Known devices | |Byte order |Known devices |
| --------------------------------- | ----------------------------- | |---------------------------------|-----------------------------|
| `WS2812_BYTE_ORDER_GRB` (default) | Most WS2812's, SK6812, SK6805 | |`WS2812_BYTE_ORDER_GRB` (default)|Most WS2812's, SK6812, SK6805|
| `WS2812_BYTE_ORDER_RGB` | WS2812B-2020 | |`WS2812_BYTE_ORDER_RGB` |WS2812B-2020 |
| `WS2812_BYTE_ORDER_BGR` | TM1812 | |`WS2812_BYTE_ORDER_BGR` |TM1812 |
### Bitbang ### Bitbang
@ -55,13 +54,13 @@ WS2812_DRIVER = bitbang
The WS2812 LED communication topology depends on a serialized timed window. Different versions of the addressable LEDs have differing requirements for the timing parameters, for instance, of the SK6812. The WS2812 LED communication topology depends on a serialized timed window. Different versions of the addressable LEDs have differing requirements for the timing parameters, for instance, of the SK6812.
You can tune these parameters through the definition of the following macros: You can tune these parameters through the definition of the following macros:
| Macro | Default | AVR | ARM | | Macro |Default | AVR | ARM |
| --------------- | ---------------------------- | ------------------ | ------------------ | |---------------------|--------------------------------------------|--------------------|--------------------|
| `WS2812_TIMING` | `1250` | :heavy_check_mark: | :heavy_check_mark: | |`WS2812_TIMING` |`1250` | :heavy_check_mark: | :heavy_check_mark: |
| `WS2812_T0H` | `350` | :heavy_check_mark: | :heavy_check_mark: | |`WS2812_T0H` |`350` | :heavy_check_mark: | :heavy_check_mark: |
| `WS2812_T0L` | `WS2812_TIMING - WS2812_T0H` | | :heavy_check_mark: | |`WS2812_T0L` |`WS2812_TIMING - WS2812_T0H` | | :heavy_check_mark: |
| `WS2812_T1H` | `900` | :heavy_check_mark: | :heavy_check_mark: | |`WS2812_T1H` |`900` | :heavy_check_mark: | :heavy_check_mark: |
| `WS2812_T1L` | `WS2812_TIMING - WS2812_T1H` | | :heavy_check_mark: | |`WS2812_T1L` |`WS2812_TIMING - WS2812_T1H` | | :heavy_check_mark: |
### I2C ### I2C
Targeting boards where WS2812 support is offloaded to a 2nd MCU. Currently the driver is limited to AVR given the known consumers are ps2avrGB/BMC. To configure it, add this to your rules.mk: Targeting boards where WS2812 support is offloaded to a 2nd MCU. Currently the driver is limited to AVR given the known consumers are ps2avrGB/BMC. To configure it, add this to your rules.mk:
@ -108,16 +107,16 @@ To adjust the baudrate at which the SPI peripheral is configured, users will nee
Only divisors of 2, 4, 8, 16, 32, 64, 128 and 256 are supported by hardware. Only divisors of 2, 4, 8, 16, 32, 64, 128 and 256 are supported by hardware.
| Define | Default | Description | |Define |Default|Description |
| -------------------- | ------- | ----------------------------------- | |--------------------|-------|-------------------------------------|
| `WS2812_SPI_DIVISOR` | `16` | SPI source clock peripheral divisor | |`WS2812_SPI_DIVISOR`|`16` |SPI source clock peripheral divisor |
#### Testing Notes #### Testing Notes
While not an exhaustive list, the following table provides the scenarios that have been partially validated: While not an exhaustive list, the following table provides the scenarios that have been partially validated:
| | SPI1 | SPI2 | SPI3 | | | SPI1 | SPI2 | SPI3 |
| ---- | ------------------------------------------- | --------------------------------------- | --------------------- | |------|---------------------------------------------|-----------------------------------------|-----------------------|
| f072 | ? | B15 :heavy_check_mark: (needs SCK: B13) | N/A | | f072 | ? | B15 :heavy_check_mark: (needs SCK: B13) | N/A |
| f103 | A7 :heavy_check_mark: | B15 :heavy_check_mark: | N/A | | f103 | A7 :heavy_check_mark: | B15 :heavy_check_mark: | N/A |
| f303 | A7 :heavy_check_mark: B5 :heavy_check_mark: | B15 :heavy_check_mark: | B5 :heavy_check_mark: | | f303 | A7 :heavy_check_mark: B5 :heavy_check_mark: | B15 :heavy_check_mark: | B5 :heavy_check_mark: |
@ -151,32 +150,15 @@ You must also turn on the PWM feature in your halconf.h and mcuconf.h
While not an exhaustive list, the following table provides the scenarios that have been partially validated: While not an exhaustive list, the following table provides the scenarios that have been partially validated:
| | Status | | | Status |
| --------- | ------------------ | |-|-|
| f072 | ? | | f072 | ? |
| f103 | :heavy_check_mark: | | f103 | :heavy_check_mark: |
| f303 | :heavy_check_mark: | | f303 | :heavy_check_mark: |
| f401/f411 | :heavy_check_mark: | | f401/f411 | :heavy_check_mark: |
*Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.* *Other supported ChibiOS boards and/or pins may function, it will be highly chip and configuration dependent.*
### PIO
Targeting Raspberry Pi RP2040 boards only where WS2812 support is offloaded to an dedicated PIO implementation. This offloads processing of the WS2812 protocol from the MCU to a dedicated PIO program using DMA transfers.
To configure it, add this to your rules.mk:
```make
WS2812_DRIVER = vendor
```
Configure the hardware via your config.h:
```c
#define WS2812_PIO_USE_PIO1 // Force the usage of PIO1 peripheral, by default the WS2812 implementation uses the PIO0 peripheral
```
The WS2812 PIO programm uses 1 state machine, 4 instructions and does not use any interrupt handlers.
### Push Pull and Open Drain Configuration ### Push Pull and Open Drain Configuration
The default configuration is a push pull on the defined pin. The default configuration is a push pull on the defined pin.
This can be configured for bitbang, PWM and SPI. This can be configured for bitbang, PWM and SPI.

View file

@ -91,6 +91,7 @@
* [换手](zh-cn/feature_swap_hands.md) * [换手](zh-cn/feature_swap_hands.md)
* [一键多用](zh-cn/feature_tap_dance.md) * [一键多用](zh-cn/feature_tap_dance.md)
* [点按配置](zh-cn/tap_hold.md) * [点按配置](zh-cn/tap_hold.md)
* [终端](zh-cn/feature_terminal.md)
* [Unicode](zh-cn/feature_unicode.md) * [Unicode](zh-cn/feature_unicode.md)
* [用户空间](zh-cn/feature_userspace.md) * [用户空间](zh-cn/feature_userspace.md)
* [WPM计算](zh-cn/feature_wpm.md) * [WPM计算](zh-cn/feature_wpm.md)

View file

@ -240,7 +240,7 @@ void suspend_wakeup_init_user(void) {
```c ```c
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
switch (get_highest_layer(state)) { switch (biton32(state)) {
case _RAISE: case _RAISE:
rgblight_setrgb (0x00, 0x00, 0xFF); rgblight_setrgb (0x00, 0x00, 0xFF);
break; break;
@ -267,7 +267,7 @@ layer_state_t layer_state_set_user(layer_state_t state) {
### `layer_state_set_*` 函数文档 ### `layer_state_set_*` 函数文档
* 键盘/各子版本:`layer_state_t layer_state_set_kb(layer_state_t state)` * 键盘/各子版本:`uint32_t layer_state_set_kb(uint32_t state)`
* 布局: `layer_state_t layer_state_set_user(layer_state_t state)` * 布局: `layer_state_t layer_state_set_user(layer_state_t state)`
@ -325,7 +325,7 @@ void keyboard_post_init_user(void) {
```c ```c
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
switch (get_highest_layer(state)) { switch (biton32(state)) {
case _RAISE: case _RAISE:
if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); } if (user_config.rgb_layer_change) { rgblight_sethsv_noeeprom_magenta(); rgblight_mode_noeeprom(1); }
break; break;
@ -474,3 +474,4 @@ cancel_deferred_exec(my_token);
```c ```c
#define MAX_DEFERRED_EXECUTORS 16 #define MAX_DEFERRED_EXECUTORS 16
``` ```

View file

@ -54,11 +54,6 @@
# define EXTERNAL_EEPROM_PAGE_SIZE 32 # define EXTERNAL_EEPROM_PAGE_SIZE 32
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2 # define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 5 # define EXTERNAL_EEPROM_WRITE_TIME 5
#elif defined(EEPROM_I2C_24LC32A)
# define EXTERNAL_EEPROM_BYTE_COUNT 4096
# define EXTERNAL_EEPROM_PAGE_SIZE 32
# define EXTERNAL_EEPROM_ADDRESS_SIZE 2
# define EXTERNAL_EEPROM_WRITE_TIME 5
#elif defined(EEPROM_I2C_MB85RC256V) #elif defined(EEPROM_I2C_MB85RC256V)
# define EXTERNAL_EEPROM_BYTE_COUNT 32768 # define EXTERNAL_EEPROM_BYTE_COUNT 32768
# define EXTERNAL_EEPROM_PAGE_SIZE 128 # define EXTERNAL_EEPROM_PAGE_SIZE 128

View file

@ -1,23 +0,0 @@
// Copyright 2022 Nick Brassel (@tzarc)
// SPDX-License-Identifier: GPL-2.0-or-later
#include <stdint.h>
#include <string.h>
#include "eeprom_driver.h"
#include "wear_leveling.h"
void eeprom_driver_init(void) {
wear_leveling_init();
}
void eeprom_driver_erase(void) {
wear_leveling_erase();
}
void eeprom_read_block(void *buf, const void *addr, size_t len) {
wear_leveling_read((uint32_t)addr, buf, len);
}
void eeprom_write_block(const void *buf, void *addr, size_t len) {
wear_leveling_write((uint32_t)addr, buf, len);
}

View file

@ -53,10 +53,6 @@
# define AW_GLOBAL_CURRENT_MAX 150 # define AW_GLOBAL_CURRENT_MAX 150
#endif #endif
#ifndef AW_SPI_MODE
# define AW_SPI_MODE 0
#endif
#ifndef AW_SPI_DIVISOR #ifndef AW_SPI_DIVISOR
# define AW_SPI_DIVISOR 4 # define AW_SPI_DIVISOR 4
#endif #endif
@ -67,7 +63,7 @@ bool g_pwm_buffer_update_required[DRIVER_COUNT] = {false};
bool AW20216_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* data, uint8_t len) { bool AW20216_write(pin_t cs_pin, uint8_t page, uint8_t reg, uint8_t* data, uint8_t len) {
static uint8_t s_spi_transfer_buffer[2] = {0}; static uint8_t s_spi_transfer_buffer[2] = {0};
if (!spi_start(cs_pin, false, AW_SPI_MODE, AW_SPI_DIVISOR)) { if (!spi_start(cs_pin, false, 3, AW_SPI_DIVISOR)) {
spi_stop(); spi_stop();
return false; return false;
} }

View file

@ -70,10 +70,6 @@
# define ISSI_CSPULLUP PUR_0R # define ISSI_CSPULLUP PUR_0R
#endif #endif
#ifndef ISSI_GLOBALCURRENT
# define ISSI_GLOBALCURRENT 0xFF
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -186,7 +182,7 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
// Set de-ghost pull-down resistors (CSx) // Set de-ghost pull-down resistors (CSx)
IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP); IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01); IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);

View file

@ -69,10 +69,6 @@
# define ISSI_CSPULLUP PUR_0R # define ISSI_CSPULLUP PUR_0R
#endif #endif
#ifndef ISSI_GLOBALCURRENT
# define ISSI_GLOBALCURRENT 0xFF
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -176,7 +172,7 @@ void IS31FL3733_init(uint8_t addr, uint8_t sync) {
// Set de-ghost pull-down resistors (CSx) // Set de-ghost pull-down resistors (CSx)
IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP); IS31FL3733_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); IS31FL3733_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01); IS31FL3733_write_register(addr, ISSI_REG_CONFIGURATION, ((sync & 0b11) << 6) | ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);

View file

@ -63,10 +63,6 @@
# define ISSI_CSPULLUP PUR_0R # define ISSI_CSPULLUP PUR_0R
#endif #endif
#ifndef ISSI_GLOBALCURRENT
# define ISSI_GLOBALCURRENT 0xFF
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -158,7 +154,7 @@ void IS31FL3736_init(uint8_t addr) {
// Set de-ghost pull-down resistors (CSx) // Set de-ghost pull-down resistors (CSx)
IS31FL3736_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP); IS31FL3736_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); IS31FL3736_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01); IS31FL3736_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);

View file

@ -69,10 +69,6 @@
# define ISSI_CSPULLUP PUR_0R # define ISSI_CSPULLUP PUR_0R
#endif #endif
#ifndef ISSI_GLOBALCURRENT
# define ISSI_GLOBALCURRENT 0xFF
#endif
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
uint8_t g_twi_transfer_buffer[20]; uint8_t g_twi_transfer_buffer[20];
@ -165,7 +161,7 @@ void IS31FL3737_init(uint8_t addr) {
// Set de-ghost pull-down resistors (CSx) // Set de-ghost pull-down resistors (CSx)
IS31FL3737_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP); IS31FL3737_write_register(addr, ISSI_REG_CSPULLUP, ISSI_CSPULLUP);
// Set global current to maximum. // Set global current to maximum.
IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); IS31FL3737_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Disable software shutdown. // Disable software shutdown.
IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01); IS31FL3737_write_register(addr, ISSI_REG_CONFIGURATION, ((ISSI_PWM_FREQUENCY & 0b111) << 3) | 0x01);

View file

@ -69,10 +69,6 @@
# define ISSI_CSPULLUP PUR_32KR # define ISSI_CSPULLUP PUR_32KR
#endif #endif
#ifndef ISSI_GLOBALCURRENT
# define ISSI_GLOBALCURRENT 0xFF
#endif
#define ISSI_MAX_LEDS 351 #define ISSI_MAX_LEDS 351
// Transfer buffer for TWITransmitData() // Transfer buffer for TWITransmitData()
@ -167,7 +163,7 @@ void IS31FL3741_init(uint8_t addr) {
IS31FL3741_write_register(addr, ISSI_REG_CONFIGURATION, 0x01); IS31FL3741_write_register(addr, ISSI_REG_CONFIGURATION, 0x01);
// Set Golbal Current Control Register // Set Golbal Current Control Register
IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, ISSI_GLOBALCURRENT); IS31FL3741_write_register(addr, ISSI_REG_GLOBALCURRENT, 0xFF);
// Set Pull up & Down for SWx CSy // Set Pull up & Down for SWx CSy
IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, ((ISSI_CSPULLUP << 4) | ISSI_SWPULLUP)); IS31FL3741_write_register(addr, ISSI_REG_PULLDOWNUP, ((ISSI_CSPULLUP << 4) | ISSI_SWPULLUP));

View file

@ -89,7 +89,6 @@ uint8_t ps2_host_send(uint8_t data);
uint8_t ps2_host_recv_response(void); uint8_t ps2_host_recv_response(void);
uint8_t ps2_host_recv(void); uint8_t ps2_host_recv(void);
void ps2_host_set_led(uint8_t usb_led); void ps2_host_set_led(uint8_t usb_led);
bool pbuf_has_data(void);
/*-------------------------------------------------------------------- /*--------------------------------------------------------------------
* static functions * static functions

View file

@ -66,8 +66,8 @@ uint8_t ps2_error = PS2_ERR_NONE;
static inline uint8_t pbuf_dequeue(void); static inline uint8_t pbuf_dequeue(void);
static inline void pbuf_enqueue(uint8_t data); static inline void pbuf_enqueue(uint8_t data);
static inline bool pbuf_has_data(void);
static inline void pbuf_clear(void); static inline void pbuf_clear(void);
bool pbuf_has_data(void);
#if defined(PROTOCOL_CHIBIOS) #if defined(PROTOCOL_CHIBIOS)
void ps2_interrupt_service_routine(void); void ps2_interrupt_service_routine(void);
@ -309,7 +309,7 @@ static inline uint8_t pbuf_dequeue(void) {
return val; return val;
} }
bool pbuf_has_data(void) { static inline bool pbuf_has_data(void) {
#if defined(__AVR__) #if defined(__AVR__)
uint8_t sreg = SREG; uint8_t sreg = SREG;
cli(); cli();

View file

@ -53,7 +53,6 @@ void ps2_mouse_init(void) {
ps2_mouse_set_remote_mode(); ps2_mouse_set_remote_mode();
#else #else
ps2_mouse_enable_data_reporting(); ps2_mouse_enable_data_reporting();
ps2_mouse_set_stream_mode();
#endif #endif
#ifdef PS2_MOUSE_ENABLE_SCROLLING #ifdef PS2_MOUSE_ENABLE_SCROLLING
@ -76,33 +75,19 @@ void ps2_mouse_task(void) {
extern int tp_buttons; extern int tp_buttons;
/* receives packet from mouse */ /* receives packet from mouse */
#ifdef PS2_MOUSE_USE_REMOTE_MODE
uint8_t rcv; uint8_t rcv;
rcv = ps2_host_send(PS2_MOUSE_READ_DATA); rcv = ps2_host_send(PS2_MOUSE_READ_DATA);
if (rcv == PS2_ACK) { if (rcv == PS2_ACK) {
mouse_report.buttons = ps2_host_recv_response() | tp_buttons; mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER; mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER; mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
# ifdef PS2_MOUSE_ENABLE_SCROLLING #ifdef PS2_MOUSE_ENABLE_SCROLLING
mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER; mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
# endif
} else {
if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
return;
}
#else
if (pbuf_has_data()) {
mouse_report.buttons = ps2_host_recv_response() | tp_buttons;
mouse_report.x = ps2_host_recv_response() * PS2_MOUSE_X_MULTIPLIER;
mouse_report.y = ps2_host_recv_response() * PS2_MOUSE_Y_MULTIPLIER;
# ifdef PS2_MOUSE_ENABLE_SCROLLING
mouse_report.v = -(ps2_host_recv_response() & PS2_MOUSE_SCROLL_MASK) * PS2_MOUSE_V_MULTIPLIER;
# endif
} else {
if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
return;
}
#endif #endif
} else {
if (debug_mouse) print("ps2_mouse: fail to get mouse packet\n");
return;
}
/* if mouse moves or buttons state changes */ /* if mouse moves or buttons state changes */
if (mouse_report.x || mouse_report.y || mouse_report.v || ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) { if (mouse_report.x || mouse_report.y || mouse_report.v || ((mouse_report.buttons ^ buttons_prev) & PS2_MOUSE_BTN_MASK)) {

View file

@ -1,13 +1,8 @@
// Copyright (c) 2018 Cirque Corp. Restrictions apply. See: www.cirque.com/sw-license // Copyright (c) 2018 Cirque Corp. Restrictions apply. See: www.cirque.com/sw-license
// based on https://github.com/cirque-corp/Cirque_Pinnacle_1CA027/tree/master/Circular_Trackpad
// with modifications and changes for QMK
// refer to documentation: Gen2 and Gen3 (Pinnacle ASIC) at https://www.cirque.com/documentation
#include "cirque_pinnacle.h" #include "cirque_pinnacle.h"
#include "print.h" #include "print.h"
#include "debug.h" #include "debug.h"
#include "wait.h" #include "wait.h"
#include "timer.h"
// Registers for RAP // Registers for RAP
// clang-format off // clang-format off
@ -43,9 +38,11 @@
#define ADC_ATTENUATE_3X 0x80 #define ADC_ATTENUATE_3X 0x80
#define ADC_ATTENUATE_4X 0xC0 #define ADC_ATTENUATE_4X 0xC0
#ifndef CIRQUE_PINNACLE_ATTENUATION // Register config values for this demo
# define CIRQUE_PINNACLE_ATTENUATION ADC_ATTENUATE_4X #define SYSCONFIG_1_VALUE 0x00
#endif #define FEEDCONFIG_1_VALUE 0x03 // 0x03 for absolute mode 0x01 for relative mode
#define FEEDCONFIG_2_VALUE 0x1C // 0x1F for normal functionality 0x1E for intellimouse disabled
#define Z_IDLE_COUNT_VALUE 0x05
// clang-format on // clang-format on
bool touchpad_init; bool touchpad_init;
@ -113,14 +110,16 @@ void cirque_pinnacle_clear_flags() {
// Enables/Disables the feed // Enables/Disables the feed
void cirque_pinnacle_enable_feed(bool feedEnable) { void cirque_pinnacle_enable_feed(bool feedEnable) {
uint8_t temp; uint8_t temp;
RAP_ReadBytes(FEEDCONFIG_1, &temp, 1); // Store contents of FeedConfig1 register RAP_ReadBytes(FEEDCONFIG_1, &temp, 1); // Store contents of FeedConfig1 register
if (feedEnable) { if (feedEnable) {
temp |= 0x01; // Set Feed Enable bit temp |= 0x01; // Set Feed Enable bit
RAP_Write(0x04, temp);
} else { } else {
temp &= ~0x01; // Clear Feed Enable bit temp &= ~0x01; // Clear Feed Enable bit
RAP_Write(0x04, temp);
} }
RAP_Write(FEEDCONFIG_1, temp);
} }
/* ERA (Extended Register Access) Functions */ /* ERA (Extended Register Access) Functions */
@ -192,7 +191,7 @@ void cirque_pinnacle_tune_edge_sensitivity(void) {
ERA_ReadBytes(0x0168, &temp, 1); ERA_ReadBytes(0x0168, &temp, 1);
} }
/* Pinnacle-based TM040040/TM035035/TM023023 Functions */ /* Pinnacle-based TM040040 Functions */
void cirque_pinnacle_init(void) { void cirque_pinnacle_init(void) {
#if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_spi) #if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_spi)
spi_init(); spi_init();
@ -201,87 +200,39 @@ void cirque_pinnacle_init(void) {
#endif #endif
touchpad_init = true; touchpad_init = true;
// Host clears SW_CC flag // Host clears SW_CC flag
cirque_pinnacle_clear_flags(); cirque_pinnacle_clear_flags();
// SysConfig1 (Low Power Mode) // Host configures bits of registers 0x03 and 0x05
// Bit 0: Reset, 1=Reset RAP_Write(SYSCONFIG_1, SYSCONFIG_1_VALUE);
// Bit 1: Shutdown, 1=Shutdown, 0=Active RAP_Write(FEEDCONFIG_2, FEEDCONFIG_2_VALUE);
// Bit 2: Sleep Enable, 1=low power mode, 0=normal mode
// send a RESET command now, in case QMK had a soft-reset without a power cycle
RAP_Write(SYSCONFIG_1, 0x01);
wait_ms(30); // Pinnacle needs 10-15ms to boot, so wait long enough before configuring
RAP_Write(SYSCONFIG_1, 0x00);
wait_us(50);
// FeedConfig2 (Feature flags for Relative Mode Only) // Host enables preferred output mode (absolute)
// Bit 0: IntelliMouse Enable, 1=enable, 0=disable RAP_Write(FEEDCONFIG_1, FEEDCONFIG_1_VALUE);
// Bit 1: All Taps Disable, 1=disable, 0=enable
// Bit 2: Secondary Tap Disable, 1=disable, 0=enable
// Bit 3: Scroll Disable, 1=disable, 0=enable
// Bit 4: GlideExtend® Disable, 1=disable, 0=enable
// Bit 5: reserved
// Bit 6: reserved
// Bit 7: Swap X & Y, 1=90° rotation, 0=0° rotation
RAP_Write(FEEDCONFIG_2, 0x00);
// FeedConfig1 (Data Output Flags) // Host sets z-idle packet count to 5 (default is 30)
// Bit 0: Feed enable, 1=feed, 0=no feed RAP_Write(Z_IDLE_COUNT, Z_IDLE_COUNT_VALUE);
// Bit 1: Data mode, 1=absolute, 0=relative
// Bit 2: Filter disable, 1=no filter, 0=filter
// Bit 3: X disable, 1=no X data, 0=X data
// Bit 4: Y disable, 1=no Y data, 0=Y data
// Bit 5: reserved
// Bit 6: X data Invert, 1=X max to 0, 0=0 to Y max
// Bit 7: Y data Invert, 1=Y max to 0, 0=0 to Y max
RAP_Write(FEEDCONFIG_1, CIRQUE_PINNACLE_POSITION_MODE << 1);
// Host sets z-idle packet count to 5 (default is 0x1F/30)
RAP_Write(Z_IDLE_COUNT, 5);
cirque_pinnacle_set_adc_attenuation(CIRQUE_PINNACLE_ATTENUATION);
cirque_pinnacle_set_adc_attenuation(0xFF);
cirque_pinnacle_tune_edge_sensitivity(); cirque_pinnacle_tune_edge_sensitivity();
cirque_pinnacle_enable_feed(true); cirque_pinnacle_enable_feed(true);
} }
// Reads XYZ data from Pinnacle registers 0x14 through 0x17
// Stores result in pinnacle_data_t struct with xValue, yValue, and zValue members
pinnacle_data_t cirque_pinnacle_read_data(void) { pinnacle_data_t cirque_pinnacle_read_data(void) {
uint8_t data_ready = 0; uint8_t data[6] = {0};
uint8_t data[6] = {0}; pinnacle_data_t result = {0};
pinnacle_data_t result = {0};
// Check if there is valid data available
RAP_ReadBytes(STATUS_1, &data_ready, 1); // bit2 is Software Data Ready, bit3 is Command Complete, bit0 and bit1 are reserved/unused
if ((data_ready & 0x04) == 0) {
// no data available yet
result.valid = false; // be explicit
return result;
}
// Read all data bytes
RAP_ReadBytes(PACKET_BYTE_0, data, 6); RAP_ReadBytes(PACKET_BYTE_0, data, 6);
// Get ready for the next data sample
cirque_pinnacle_clear_flags(); cirque_pinnacle_clear_flags();
#if CIRQUE_PINNACLE_POSITION_MODE result.buttonFlags = data[0] & 0x3F;
// Decode data for absolute mode result.xValue = data[2] | ((data[4] & 0x0F) << 8);
// Register 0x13 is unused in this mode (palm detection area) result.yValue = data[3] | ((data[4] & 0xF0) << 4);
result.buttonFlags = data[0] & 0x3F; // bit0 to bit5 are switch 0-5, only hardware button presses (from input pin on the Pinnacle chip) result.zValue = data[5] & 0x3F;
result.xValue = data[2] | ((data[4] & 0x0F) << 8); // merge high and low bits for X
result.yValue = data[3] | ((data[4] & 0xF0) << 4); // merge high and low bits for Y result.touchDown = (result.xValue != 0 || result.yValue != 0);
result.zValue = data[5] & 0x3F; // Z is only lower 6 bits, upper 2 bits are reserved/unused
result.touchDown = (result.xValue != 0 || result.yValue != 0); // (0,0) is a "magic coordinate" to indicate "finger touched down"
#else
// Decode data for relative mode
// Registers 0x16 and 0x17 are unused in this mode
result.buttons = data[0] & 0x07; // bit0 = primary button, bit1 = secondary button, bit2 = auxilary button, if Taps enabled then also software-recognized taps are reported
result.xDelta = data[1];
result.yDelta = data[2];
result.wheelCount = data[3];
#endif
result.valid = true;
return result; return result;
} }

View file

@ -5,14 +5,23 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#ifndef CIRQUE_PINNACLE_TIMEOUT // Convenient way to store and access measurements
# define CIRQUE_PINNACLE_TIMEOUT 20 // I2C timeout in milliseconds typedef struct {
#endif uint16_t xValue;
uint16_t yValue;
uint16_t zValue;
uint8_t buttonFlags;
bool touchDown;
} pinnacle_data_t;
#define CIRQUE_PINNACLE_ABSOLUTE_MODE 1 void cirque_pinnacle_init(void);
#define CIRQUE_PINNACLE_RELATIVE_MODE 0 pinnacle_data_t cirque_pinnacle_read_data(void);
#ifndef CIRQUE_PINNACLE_POSITION_MODE void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution);
# define CIRQUE_PINNACLE_POSITION_MODE CIRQUE_PINNACLE_ABSOLUTE_MODE uint16_t cirque_pinnacle_get_scale(void);
void cirque_pinnacle_set_scale(uint16_t scale);
#ifndef CIRQUE_PINNACLE_TIMEOUT
# define CIRQUE_PINNACLE_TIMEOUT 20
#endif #endif
// Coordinate scaling values // Coordinate scaling values
@ -34,9 +43,7 @@
#ifndef CIRQUE_PINNACLE_Y_RANGE #ifndef CIRQUE_PINNACLE_Y_RANGE
# define CIRQUE_PINNACLE_Y_RANGE (CIRQUE_PINNACLE_Y_UPPER - CIRQUE_PINNACLE_Y_LOWER) # define CIRQUE_PINNACLE_Y_RANGE (CIRQUE_PINNACLE_Y_UPPER - CIRQUE_PINNACLE_Y_LOWER)
#endif #endif
#if !defined(POINTING_DEVICE_TASK_THROTTLE_MS)
# define POINTING_DEVICE_TASK_THROTTLE_MS 10 // Cirque Pinnacle in normal operation produces data every 10ms. Advanced configuration for pen/stylus usage might require lower values.
#endif
#if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_i2c) #if defined(POINTING_DEVICE_DRIVER_cirque_pinnacle_i2c)
# include "i2c_master.h" # include "i2c_master.h"
// Cirque's 7-bit I2C Slave Address // Cirque's 7-bit I2C Slave Address
@ -65,26 +72,3 @@
# endif # endif
# endif # endif
#endif #endif
// Convenient way to store and access measurements
typedef struct {
bool valid; // true if valid data was read, false if no data was ready
#if CIRQUE_PINNACLE_POSITION_MODE
uint16_t xValue;
uint16_t yValue;
uint16_t zValue;
uint8_t buttonFlags;
bool touchDown;
#else
uint8_t xDelta;
uint8_t yDelta;
uint8_t wheelCount;
uint8_t buttons;
#endif
} pinnacle_data_t;
void cirque_pinnacle_init(void);
pinnacle_data_t cirque_pinnacle_read_data(void);
void cirque_pinnacle_scale_data(pinnacle_data_t* coordinates, uint16_t xResolution, uint16_t yResolution);
uint16_t cirque_pinnacle_get_scale(void);
void cirque_pinnacle_set_scale(uint16_t scale);

View file

@ -19,7 +19,7 @@ void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT); i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, NULL, 0, CIRQUE_PINNACLE_TIMEOUT);
if (i2c_readReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { if (i2c_readReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, data, count, CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
dprintf("error cirque_pinnacle i2c_readReg\n"); dprintf("error right touchpad\n");
#endif #endif
touchpad_init = false; touchpad_init = false;
} }
@ -34,7 +34,7 @@ void RAP_Write(uint8_t address, uint8_t data) {
if (touchpad_init) { if (touchpad_init) {
if (i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) { if (i2c_writeReg(CIRQUE_PINNACLE_ADDR << 1, cmdByte, &data, sizeof(data), CIRQUE_PINNACLE_TIMEOUT) != I2C_STATUS_SUCCESS) {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
dprintf("error cirque_pinnacle i2c_writeReg\n"); dprintf("error right touchpad\n");
#endif #endif
touchpad_init = false; touchpad_init = false;
} }

View file

@ -25,7 +25,7 @@ void RAP_ReadBytes(uint8_t address, uint8_t* data, uint8_t count) {
} }
} else { } else {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
dprintf("error cirque_pinnacle spi_start read\n"); dprintf("error right touchpad\n");
#endif #endif
touchpad_init = false; touchpad_init = false;
} }
@ -43,7 +43,7 @@ void RAP_Write(uint8_t address, uint8_t data) {
spi_write(data); spi_write(data);
} else { } else {
#ifdef CONSOLE_ENABLE #ifdef CONSOLE_ENABLE
dprintf("error cirque_pinnacle spi_start write\n"); dprintf("error right touchpad\n");
#endif #endif
touchpad_init = false; touchpad_init = false;
} }

View file

@ -95,3 +95,16 @@ int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_di
uint16_t magnitude = (scale * offset * offset * precision) >> 7; uint16_t magnitude = (scale * offset * offset * precision) >> 7;
return isnegative ? -(int16_t)(magnitude) : (int16_t)(magnitude); return isnegative ? -(int16_t)(magnitude) : (int16_t)(magnitude);
} }
void pimoroni_trackball_adapt_values(int8_t* mouse, int16_t* offset) {
if (*offset > 127) {
*mouse = 127;
*offset -= 127;
} else if (*offset < -127) {
*mouse = -127;
*offset += 127;
} else {
*mouse = *offset;
*offset = 0;
}
}

View file

@ -52,6 +52,7 @@ typedef struct {
void pimoroni_trackball_device_init(void); void pimoroni_trackball_device_init(void);
void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white); void pimoroni_trackball_set_rgbw(uint8_t red, uint8_t green, uint8_t blue, uint8_t white);
int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale); int16_t pimoroni_trackball_get_offsets(uint8_t negative_dir, uint8_t positive_dir, uint8_t scale);
void pimoroni_trackball_adapt_values(int8_t* mouse, int16_t* offset);
uint16_t pimoroni_trackball_get_cpi(void); uint16_t pimoroni_trackball_get_cpi(void);
void pimoroni_trackball_set_cpi(uint16_t cpi); void pimoroni_trackball_set_cpi(uint16_t cpi);
i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data); i2c_status_t read_pimoroni_trackball(pimoroni_data_t* data);

View file

@ -27,13 +27,3 @@ void soft_serial_initiator_init(void);
void soft_serial_target_init(void); void soft_serial_target_init(void);
bool soft_serial_transaction(int sstd_index); bool soft_serial_transaction(int sstd_index);
#ifdef SERIAL_DEBUG
# include <debug.h>
# include <print.h>
# define serial_dprintf(...) dprintf(__VA_ARGS__)
#else
# define serial_dprintf(...) \
do { \
} while (0)
#endif

View file

@ -1,101 +0,0 @@
// Copyright 2022 Nick Brassel (@tzarc)
// SPDX-License-Identifier: GPL-2.0-or-later
#include <stdbool.h>
#include <hal.h>
#include "util.h"
#include "timer.h"
#include "wear_leveling.h"
#include "wear_leveling_internal.h"
#ifndef WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT
# define WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT 32
#endif // WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT
bool backing_store_init(void) {
bs_dprintf("Init\n");
flash_init();
return true;
}
bool backing_store_unlock(void) {
bs_dprintf("Unlock\n");
// No-op -- handled by the flash driver as it is.
return true;
}
bool backing_store_erase(void) {
#ifdef WEAR_LEVELING_DEBUG_OUTPUT
uint32_t start = timer_read32();
#endif
bool ret = true;
for (int i = 0; i < (WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT); ++i) {
flash_status_t status = flash_erase_block(((WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET) + i) * (EXTERNAL_FLASH_BLOCK_SIZE));
if (status != FLASH_STATUS_SUCCESS) {
ret = false;
break;
}
}
bs_dprintf("Backing store erase took %ldms to complete\n", ((long)(timer_read32() - start)));
return ret;
}
bool backing_store_write(uint32_t address, backing_store_int_t value) {
return backing_store_write_bulk(address, &value, 1);
}
bool backing_store_lock(void) {
bs_dprintf("Lock \n");
// No-op -- handled by the flash driver as it is.
return true;
}
bool backing_store_read(uint32_t address, backing_store_int_t *value) {
return backing_store_read_bulk(address, value, 1);
}
bool backing_store_read_bulk(uint32_t address, backing_store_int_t *values, size_t item_count) {
bs_dprintf("Read ");
uint32_t offset = (WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET) * (EXTERNAL_FLASH_BLOCK_SIZE) + address;
flash_status_t status = flash_read_block(offset, values, sizeof(backing_store_int_t) * item_count);
if (status == FLASH_STATUS_SUCCESS) {
for (size_t i = 0; i < item_count; ++i) {
values[i] = ~values[i];
}
wl_dump(offset, values, sizeof(backing_store_int_t) * item_count);
}
return status == FLASH_STATUS_SUCCESS;
}
bool backing_store_write_bulk(uint32_t address, backing_store_int_t *values, size_t item_count) {
uint32_t offset = (WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET) * (EXTERNAL_FLASH_BLOCK_SIZE) + address;
size_t index = 0;
backing_store_int_t temp[WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT];
do {
// Copy out the block of data we want to transmit first
size_t this_loop = MIN(item_count, WEAR_LEVELING_EXTERNAL_FLASH_BULK_COUNT);
for (size_t i = 0; i < this_loop; ++i) {
temp[i] = values[index + i];
}
bs_dprintf("Write ");
wl_dump(offset, temp, sizeof(backing_store_int_t) * this_loop);
// Take the complement instead
for (size_t i = 0; i < this_loop; ++i) {
temp[i] = ~temp[i];
}
// Write out the block
if (flash_write_block(offset, temp, sizeof(backing_store_int_t) * this_loop) != FLASH_STATUS_SUCCESS) {
return false;
}
offset += this_loop * sizeof(backing_store_int_t);
index += this_loop;
item_count -= this_loop;
} while (item_count > 0);
return true;
}

View file

@ -1,34 +0,0 @@
// Copyright 2022 Nick Brassel (@tzarc)
// SPDX-License-Identifier: GPL-2.0-or-later
#pragma once
#ifndef __ASSEMBLER__
# include <stdlib.h>
# include <stdint.h>
# include "flash_spi.h"
#endif
// Use 1 block -- check the config for the SPI flash to determine how big it is
#ifndef WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT
# define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT 1
#endif // WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT
// Start at the first block of the external flash
#ifndef WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET
# define WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET 0
#endif // WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_OFFSET
// 8-byte writes by default
#ifndef BACKING_STORE_WRITE_SIZE
# define BACKING_STORE_WRITE_SIZE 8
#endif
// The space allocated by the block
#ifndef WEAR_LEVELING_BACKING_SIZE
# define WEAR_LEVELING_BACKING_SIZE ((EXTERNAL_FLASH_BLOCK_SIZE) * (WEAR_LEVELING_EXTERNAL_FLASH_BLOCK_COUNT))
#endif // WEAR_LEVELING_BACKING_SIZE
// Use half of the backing size for logical EEPROM
#ifndef WEAR_LEVELING_LOGICAL_SIZE
# define WEAR_LEVELING_LOGICAL_SIZE ((WEAR_LEVELING_BACKING_SIZE) / 2)
#endif // WEAR_LEVELING_LOGICAL_SIZE

View file

@ -0,0 +1,89 @@
/* Copyright 2022 ItsFiremanSam
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 "config_common.h"
/* key matrix size */
#define MATRIX_ROWS 2
#define MATRIX_COLS 4
/*
* Keyboard Matrix Assignments
*
* Change this to how you wired your keyboard
* COLS: AVR pins used for columns, left to right
* ROWS: AVR pins used for rows, top to bottom
* DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
/* Keyboard Matrix Assignments */
#define DIRECT_PINS { \
{ E6, D7, B1, B3 }, \
{ B5, B4, B2, B6 } \
}
#define RGB_DI_PIN D3 // LED data pin on controller
#define RGBLED_NUM 4 // Number of LEDs connected
#define RGBLIGHT_HUE_STEP 10 // The number of steps to cycle through the hue by
#define RGBLIGHT_SAT_STEP 17 // The number of steps to increment the saturation by
#define RGBLIGHT_VAL_STEP 17 // The number of steps to increment the brightness by
#define RGBLIGHT_LIMIT_VAL 255 // Max brightness level
#define RGBLIGHT_SLEEP // RGB will switch off when host goes to sleep
#define RGBLIGHT_EFFECT_BREATHING // Enable all additional RGB animation modes
#define RGBLIGHT_EFFECT_RAINBOW_MOOD
#define RGBLIGHT_EFFECT_RAINBOW_SWIRL
#define RGBLIGHT_EFFECT_SNAKE
#define RGBLIGHT_EFFECT_KNIGHT
#define RGBLIGHT_EFFECT_CHRISTMAS
#define RGBLIGHT_EFFECT_STATIC_GRADIENT
#define RGBLIGHT_EFFECT_RGB_TEST
#define RGBLIGHT_EFFECT_ALTERNATING
#define RGBLIGHT_EFFECT_TWINKLE
#define OLED_TIMEOUT 20000 // Turns off OLED after said amount of milliseconds
#define OLED_BRIGHTNESS 128
#define OLED_DISPLAY_128X64
/* If defined, GRAVE_ESC will always act as ESC when CTRL is held.
* This is useful for the Windows task manager shortcut (ctrl+shift+esc).
*/
//#define GRAVE_ESC_CTRL_OVERRIDE
/*
* 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
/* Bootmagic Lite key configuration */
#define BOOTMAGIC_LITE_ROW 1
#define BOOTMAGIC_LITE_COLUMN 0

View file

@ -0,0 +1,26 @@
{
"keyboard_name": "TutelPad",
"manufacturer": "ItsFiremanSam",
"url": "",
"maintainer": "ItsFiremanSam",
"usb": {
"vid": "0xCB00",
"pid": "0xF09F",
"device_version": "0.0.1"
},
"layouts": {
"LAYOUT": {
"layout": [
{"label": "k03", "x": 0, "y": 0},
{"label": "k02", "x": 1, "y": 0},
{"label": "k01", "x": 2, "y": 0},
{"label": "k00", "x": 3, "y": 0},
{"label": "k13", "x": 0, "y": 1},
{"label": "k12", "x": 1, "y": 1},
{"label": "k11", "x": 2, "y": 1},
{"label": "k10", "x": 3, "y": 1}
]
}
}
}

View file

@ -0,0 +1,29 @@
/* Copyright 2022 ItsFiremanSam
*
* 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 QMK_KEYBOARD_H
// Defines names for use in layer keycodes and the keymap
enum layer_names {
_BASE
};
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base */
[_BASE] = LAYOUT(
KC_1, KC_2, KC_3, KC_4,
KC_5, KC_6, KC_7, KC_8
)
};

View file

@ -0,0 +1,39 @@
/* Copyright 2022 ItsFiremanSam
*
* 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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Base */
[0] = LAYOUT(
KC_1, KC_2, KC_3, KC_4,
KC_5, LT(1, KC_6), LT(1, KC_7), LT(1, KC_8)
),
[1] = LAYOUT(
_______, _______, _______, _______,
_______, _______, _______, _______
),
[2] = LAYOUT(
_______, _______, _______, _______,
_______, _______, _______, _______
),
[3] = LAYOUT(
_______, _______, _______, _______,
_______, _______, _______, _______
),
};

View file

@ -0,0 +1 @@
VIA_ENABLE = yes

View file

@ -0,0 +1,19 @@
# TutelPad macropad
* Keyboard Maintainer: [ItsFiremanSam](https://github.com/ItsFiremanSam)
* Hardware Supported: [TutelPad GitHub](https://github.com/0xCB-dev/0xCB-TutelPad)
* Hardware Availability: [KeebSupply](https://keeb.supply/)
## Bootloader
You can enter the bootloader by pressing the reset switch on the side while the keyboard is plugged in. You can also short the GND and RST pads on the controller.
Make example for this keyboard (after setting up your build environment):
make 0xcb/tutelpad:default
Flashing example for this keyboard:
make 0xcb/tutelpad:default:flash
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).

View file

@ -0,0 +1,21 @@
## MCU name
MCU = atmega32u4
# Bootloader selection
BOOTLOADER = caterina
# 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
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality
RGBLIGHT_ENABLE = yes # Enable keyboard RGB underglow
AUDIO_ENABLE = no # Audio output
OLED_ENABLE = yes
OLED_DRIVER = SSD1306

View file

@ -0,0 +1,106 @@
/* Copyright 2022 ItsFiremanSam
*
* 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 "tutelpad.h"
#ifdef OLED_ENABLE
oled_rotation_t oled_init_user(oled_rotation_t rotation) {
return OLED_ROTATION_180;
}
static void render_logo(void) {
static const char PROGMEM tutel[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff,
0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0,
0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xf0, 0xf0, 0xf0,
0xf0, 0xf0, 0xf0, 0xf0, 0x0f, 0x0f, 0x0f, 0x0f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
oled_write_raw_P(tutel, sizeof(tutel));
}
bool oled_task_kb(void) {
if (!oled_task_user()) {
return false;
}
render_logo();
return false;
}
#endif

View file

@ -0,0 +1,35 @@
/* Copyright 2022 ItsFiremanSam
*
* 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 "quantum.h"
/* This is a shortcut to help you visually see your layout.
*
* The first section contains all of the arguments representing the physical
* layout of the board and position of the keys.
*
* The second converts the arguments into a two-dimensional array which
* represents the switch matrix.
*/
#define LAYOUT( \
k00, k01, k02, k03, \
k10, k11, k12, k13 \
) { \
{ k00, k01, k02, k03 }, \
{ k10, k11, k12, k13 } \
}

View file

@ -17,13 +17,6 @@
#include "config_common.h" #include "config_common.h"
/* USB Device descriptor parameter */
#define VENDOR_ID 0x0009
#define PRODUCT_ID 0x0001
#define DEVICE_VER 0x0001
#define MANUFACTURER MakotoKurauchi
#define PRODUCT 1K
/* matrix size */ /* matrix size */
#define MATRIX_ROWS 1 #define MATRIX_ROWS 1
#define MATRIX_COLS 1 #define MATRIX_COLS 1

View file

@ -1,7 +1,13 @@
{ {
"keyboard_name": "1k", "keyboard_name": "1K",
"manufacturer": "MakotoKurauchi",
"url": "", "url": "",
"maintainer": "MakotoKurauchi", "maintainer": "MakotoKurauchi",
"usb": {
"vid": "0x0009",
"pid": "0x0001",
"device_version": "0.0.1"
},
"layouts": { "layouts": {
"LAYOUT_ortho_1x1": { "LAYOUT_ortho_1x1": {
"layout": [ "layout": [

View file

@ -4,4 +4,3 @@
#pragma once #pragma once
#define TAPPING_TERM 500 #define TAPPING_TERM 500
#define PERMISSIVE_HOLD

View file

@ -3,7 +3,6 @@
/* tap dance stuff*/ /* tap dance stuff*/
#undef TAPPING_TERM #undef TAPPING_TERM
#define TAPPING_TERM 500 #define TAPPING_TERM 500
#define PERMISSIVE_HOLD
#define TAPPING_TOGGLE 2 #define TAPPING_TOGGLE 2

View file

@ -196,7 +196,7 @@ void matrix_scan_user(void) {
} }
} }
layer_state_t layer_state_set_user(layer_state_t state) { layer_state_t layer_state_set_user(layer_state_t state) {
switch (get_highest_layer(state)) { switch (biton32(state)) {
case _TAPLAND: case _TAPLAND:
rgblight_setrgb(0, 16, 0); //green rgblight_setrgb(0, 16, 0); //green
break; break;

View file

@ -1,11 +0,0 @@
# Gherkin Layout
This is my gherkin layout.
It is used as a game pad, and key layout is inspired by spare keys I had lying around.
The firmware is very simple, and only includes one layer keymap, and RGB effects.
# Flashing
The following command should be used from the main qmk directory.
```
make gherkin:bbaserdem
sudo avrdude -p atmgea34u4 -P `ls /dev/ttyACM*` -c avr109 -U flash:.build/gherkin_bbaserdem.hex
```

View file

@ -1,9 +0,0 @@
#pragma once
#define RGB_DI_PIN F6
#define RGBLED_NUM 10
#define RGBLIGHT_ANIMATIONS
#ifdef BACKLIGHT_LEVELS
#undef BACKLIGHT_LEVELS
#endif
#define BACKLIGHT_LEVELS 3

View file

@ -1,36 +0,0 @@
// This is a game-pad gherkin layout with RGB and LED lights
#include QMK_KEYBOARD_H
backlight_config_t backlight_config;
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
/* Game pad
* ,-----------------------------------------------------------.
* | Esc | 1 | 2 | 3 | 4 | 5 | 6 | Ctl | Alt | ~ |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | Tab | Q | W | E | R | T | |^| | ; | ' | / |
* |-----+-----+-----+-----+-----+-----+-----+-----+-----+-----|
* | Shf | A | S | D | F | <-- | |v| | --> | , | . |
* `-----------------------------------------------------------'
*/
LAYOUT_ortho_3x10(
KC_ESCAPE, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_LCTRL, KC_LALT, KC_GRAVE,
KC_TAB, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_UP, KC_SCLN, KC_QUOTE, KC_SLASH,
KC_LSHIFT, KC_A, KC_S, KC_D, KC_F, KC_LEFT, KC_DOWN, KC_RIGHT, KC_COMMA, KC_DOT
)
};
void matrix_init_user(void) {
// Set LED's to max
_delay_us(300);
backlight_config.level = 2;
backlight_config.enable = 1;
eeconfig_update_backlight(backlight_config.raw);
backlight_set(backlight_config.level);
// Set RGB to rainbow mood light
rgblight_enable();
rgblight_mode(1);
rgblight_sethsv(120,255,255);
rgblight_mode(6);
}

View file

@ -1,13 +0,0 @@
USER_NAME := bbaserdem-nouserspace
STENO_ENABLE = no # Additional protocols for Stenography(+1700), requires VIRTSER
MOUSEKEY_ENABLE = no # Mouse keys(+4700)
EXTRAKEY_ENABLE = no # Audio control and System control(+450)
CONSOLE_ENABLE = no # Console for debug(+400)
COMMAND_ENABLE = no # Commands for debug and configuration
SLEEP_LED_ENABLE = no # Breathing sleep LED during USB suspend
AUDIO_ENABLE = no # Enable audio output from keyboard
NKRO_ENABLE = yes # USB Nkey Rollover - if this doesn't work, see here: https://github.com/tmk/tmk_keyboard/wiki/FAQ#nkro-doesnt-work
RGBLIGHT_ENABLE = yes # Enable RBG light strips
BACKLIGHT_ENABLE = yes # Enable keyboard backlight functionality

View file

@ -105,7 +105,7 @@ void matrix_scan_user(void) {
#ifdef RGBLIGHT_ENABLE #ifdef RGBLIGHT_ENABLE
static uint8_t old_layer = 255; static uint8_t old_layer = 255;
uint8_t new_layer = get_highest_layer(layer_state); uint8_t new_layer = biton32(layer_state);
// Color of the Icons. // Color of the Icons.
if (old_layer != new_layer) { if (old_layer != new_layer) {

View file

@ -128,10 +128,10 @@ void tap_dance_choose_layer_reset (qk_tap_dance_state_t *state, void *user_data)
layer_off(_RAISE); layer_off(_RAISE);
break; break;
case 3: case 3:
if (get_highest_layer(default_layer_state) == _DVORAK) { if (biton32(default_layer_state) == _DVORAK) {
set_single_persistent_default_layer(_QWERTY); set_single_persistent_default_layer(_QWERTY);
} }
else if (get_highest_layer(default_layer_state) == _QWERTY) { else if (biton32(default_layer_state) == _QWERTY) {
set_single_persistent_default_layer(_DVORAK); set_single_persistent_default_layer(_DVORAK);
} }
break; break;

View file

@ -1,5 +1,6 @@
BACKLIGHT_DRIVER = custom BACKLIGHT_DRIVER = custom
NKRO_ENABLE = yes NKRO_ENABLE = yes
TERMINAL_ENABLE = yes
DYNAMIC_MACRO_ENABLE = yes DYNAMIC_MACRO_ENABLE = yes
# Use RAM (fake EEPROM, transient) instead of real EEPROM # Use RAM (fake EEPROM, transient) instead of real EEPROM

View file

@ -0,0 +1,10 @@
{
"keyboard_name": "Perk60 ISO Rev A",
"url": "",
"maintainer": "4pplet",
"layouts": {
"LAYOUT_60_iso": {
"layout": [{"label":"\u00ac", "x":0, "y":0}, {"label":"!", "x":1, "y":0}, {"label":"\"", "x":2, "y":0}, {"label":"\u00a3", "x":3, "y":0}, {"label":"$", "x":4, "y":0}, {"label":"%", "x":5, "y":0}, {"label":"^", "x":6, "y":0}, {"label":"&", "x":7, "y":0}, {"label":"*", "x":8, "y":0}, {"label":"(", "x":9, "y":0}, {"label":")", "x":10, "y":0}, {"label":"_", "x":11, "y":0}, {"label":"+", "x":12, "y":0}, {"label":"Backspace", "x":13, "y":0, "w":2}, {"label":"Tab", "x":0, "y":1, "w":1.5}, {"label":"Q", "x":1.5, "y":1}, {"label":"W", "x":2.5, "y":1}, {"label":"E", "x":3.5, "y":1}, {"label":"R", "x":4.5, "y":1}, {"label":"T", "x":5.5, "y":1}, {"label":"Y", "x":6.5, "y":1}, {"label":"U", "x":7.5, "y":1}, {"label":"I", "x":8.5, "y":1}, {"label":"O", "x":9.5, "y":1}, {"label":"P", "x":10.5, "y":1}, {"label":"{", "x":11.5, "y":1}, {"label":"}", "x":12.5, "y":1}, {"label":"Caps Lock", "x":0, "y":2, "w":1.75}, {"label":"A", "x":1.75, "y":2}, {"label":"S", "x":2.75, "y":2}, {"label":"D", "x":3.75, "y":2}, {"label":"F", "x":4.75, "y":2}, {"label":"G", "x":5.75, "y":2}, {"label":"H", "x":6.75, "y":2}, {"label":"J", "x":7.75, "y":2}, {"label":"K", "x":8.75, "y":2}, {"label":"L", "x":9.75, "y":2}, {"label":":", "x":10.75, "y":2}, {"label":"@", "x":11.75, "y":2}, {"label":"~", "x":12.75, "y":2}, {"label":"Enter", "x":13.75, "y":1, "w":1.25, "h":2}, {"label":"Shift", "x":0, "y":3, "w":1.25}, {"label":"|", "x":1.25, "y":3}, {"label":"Z", "x":2.25, "y":3}, {"label":"X", "x":3.25, "y":3}, {"label":"C", "x":4.25, "y":3}, {"label":"V", "x":5.25, "y":3}, {"label":"B", "x":6.25, "y":3}, {"label":"N", "x":7.25, "y":3}, {"label":"M", "x":8.25, "y":3}, {"label":"<", "x":9.25, "y":3}, {"label":">", "x":10.25, "y":3}, {"label":"?", "x":11.25, "y":3}, {"label":"Shift", "x":12.25, "y":3, "w":2.75}, {"label":"Ctrl", "x":0, "y":4, "w":1.25}, {"label":"Win", "x":1.25, "y":4, "w":1.25}, {"label":"Alt", "x":2.5, "y":4, "w":1.25}, {"x":3.75, "y":4, "w":6.25}, {"label":"AltGr", "x":10, "y":4, "w":1.25}, {"label":"Win", "x":11.25, "y":4, "w":1.25}, {"label":"Menu", "x":12.5, "y":4, "w":1.25}, {"label":"Ctrl", "x":13.75, "y":4, "w":1.25}]
}
}
}

View file

@ -0,0 +1,34 @@
/*
Copyright 2022 Stefan Sundin "4pplet" <4pplet@protonmail.com>
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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// main layer
[0] = LAYOUT_60_iso(
KC_ESC, 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_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_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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL),
// basic function layer
[1] = LAYOUT_60_iso(
RESET, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_MODE_PLAIN, RGB_MODE_BREATHE, RGB_MODE_RAINBOW, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS)
};

View file

@ -0,0 +1,49 @@
/*
Copyright 2022 Stefan Sundin "4pplet" <4pplet@protonmail.com>
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 QMK_KEYBOARD_H
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
// main layer// main layer
[0] = LAYOUT_60_iso(
KC_ESC, 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_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_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_LSFT, KC_NUBS, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_RSFT,
KC_LCTL, KC_LGUI, KC_LALT, KC_SPC, KC_RALT, KC_RGUI, MO(1), KC_RCTL),
// basic function layer
[1] = LAYOUT_60_iso(
RESET, 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_TRNS, KC_TRNS, KC_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, RGB_TOG, RGB_MOD, RGB_HUI, RGB_SAI, RGB_VAI, RGB_SPI, RGB_MODE_PLAIN, RGB_MODE_BREATHE, RGB_MODE_RAINBOW, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS),
[2] = LAYOUT_60_iso(
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_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, 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),
[3] = LAYOUT_60_iso(
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_UP, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS, KC_TRNS,
KC_TRNS, KC_LEFT, KC_DOWN, KC_RIGHT, 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)
};

View file

@ -0,0 +1,17 @@
# Perk60 ISO Rev A
* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
* Hardware Supported: Perk60 ISO Rev A
Make example for this keyboard (after setting up your build environment):
make 4pplet/perk60_iso/rev_a:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
How to enter bootloader (DFU):
* Press and hold the button on the keyboard (the small one on the same side as the MCU) for more than 1 second. The keyboard will then enter bootloader (DFU) mode and it's ready to flash the firmware.
* Note: If holding the button a shorter time, the keyboard will just reset. If you want to exit bootloader mode without flashing a firmware, dissconnect the keyboard from your PC and reconnect it.
Alternative option if the firmware is already pre-flashed:
* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. Bootmagic lite is enabled by default.

View file

@ -0,0 +1,79 @@
/*
Copyright 2022 Stefan Sundin "4pplet" <4pplet@protonmail.com>
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
/* USB Device descriptor parameter */
#define VENDOR_ID 0x4444
#define PRODUCT_ID 0x0009
#define DEVICE_VER 0x0001
#define MANUFACTURER 4pplet
#define PRODUCT Perk60 ISO Rev A
#define MATRIX_ROWS 10
#define MATRIX_COLS 7
#define MATRIX_COL_PINS { A1, B12, B14, A2, A0, A3, A4}
#define MATRIX_ROW_PINS { C14, C13, B5, B4, B8, A15, B3, B9, A5, A7}
#define DIODE_DIRECTION COL2ROW
/* 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
/* Set 0 if debouncing isn't needed */
#define DEBOUNCE 5
#define DRIVER_ADDR_1 0b1010000
#define DRIVER_COUNT 1
#define DRIVER_LED_TOTAL 62
#define ISSI_PWM_FREQUENCY 0b010
#define STM32_HSECLK 8000000
#define RGB_MATRIX_STARTUP_VAL 80
#define RGB_MATRIX_KEYPRESSES
// RGB Matrix Animation modes. Explicitly enabled
// For full list of effects, see:
// https://docs.qmk.fm/#/feature_rgb_matrix?id=rgb-matrix-effects
#define ENABLE_RGB_MATRIX_ALPHAS_MODS
#define ENABLE_RGB_MATRIX_GRADIENT_UP_DOWN
#define ENABLE_RGB_MATRIX_GRADIENT_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_BREATHING
#define ENABLE_RGB_MATRIX_CYCLE_ALL
#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT
#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN
#define ENABLE_RGB_MATRIX_RAINBOW_MOVING_CHEVRON
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN_DUAL
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL
#define ENABLE_RGB_MATRIX_CYCLE_SPIRAL
#define ENABLE_RGB_MATRIX_DUAL_BEACON
#define ENABLE_RGB_MATRIX_RAINBOW_BEACON
#define ENABLE_RGB_MATRIX_RAINBOW_PINWHEELS
#define ENABLE_RGB_MATRIX_RAINDROPS
#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS
// enabled only of RGB_MATRIX_KEYPRESSES or RGB_MATRIX_KEYRELEASES is defined
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_WIDE
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_CROSS
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_NEXUS
#define ENABLE_RGB_MATRIX_SPLASH
#define ENABLE_RGB_MATRIX_SOLID_SPLASH

View file

@ -0,0 +1,25 @@
/* Copyright 2020 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
#define HAL_USE_PWM FALSE
#define HAL_USE_SPI FALSE
#include_next <halconf.h>

View file

@ -35,3 +35,6 @@
#define STM32_PLLQ_VALUE 7 #define STM32_PLLQ_VALUE 7
#define STM32_PPRE1 STM32_PPRE1_DIV2 #define STM32_PPRE1 STM32_PPRE1_DIV2
#define STM32_PPRE2 STM32_PPRE2_DIV1 #define STM32_PPRE2 STM32_PPRE2_DIV1
#undef STM32_I2C_USE_I2C1
#define STM32_I2C_USE_I2C1 TRUE

View file

@ -0,0 +1,17 @@
# Perk60 ISO Rev A
* Keyboard Maintainer: [4pplet](https://github.com/4pplet)
* Hardware Supported: Perk60 ISO Rev A
Make example for this keyboard (after setting up your build environment):
make 4pplet/perk60_iso/rev_a:default
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs).
How to enter bootloader (DFU):
* Press and hold the button on the keyboard (the small one on the same side as the MCU) for more than 1 second. The keyboard will then enter bootloader (DFU) mode and it's ready to flash the firmware.
* Note: If holding the button a shorter time, the keyboard will just reset. If you want to exit bootloader mode without flashing a firmware, dissconnect the keyboard from your PC and reconnect it.
Alternative option if the firmware is already pre-flashed:
* Unplug your keyboard, hold down the Spacebar and B at the same time, plug in your keyboard and wait a second before releasing the keys. Bootmagic lite is enabled by default.

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