Compare commits

..

22 commits

Author SHA1 Message Date
Peter Johanson
6b4d591c37 fix(bt): Fix compilation failure for clearing bonds.
Some checks failed
BLE Tests / collect-tests (push) Has been cancelled
Docs Checks / lint (push) Has been cancelled
Docs Checks / typecheck (push) Has been cancelled
pre-commit / pre-commit (push) Has been cancelled
Tests / collect-tests (push) Has been cancelled
BLE Tests / run-tests (push) Has been cancelled
Tests / run-tests (push) Has been cancelled
* Refactor broke the build when clearing bonds on start.
2024-09-09 11:26:53 -06:00
Nicolas Munnich
1c48f64730
fix(docs): Fix broken anchor in Studio setup (#2465) 2024-09-07 09:26:24 -07:00
Nicolas Munnich
f0319fde94
docs(feat): Added a page on shift registers (#2452)
Added a page on shift registers
---------

Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
2024-09-07 13:19:01 +02:00
Pete Johanson
d52bb04090 Revert "feat: Split physical layout selection sync."
This reverts commit 03b5b38bc4.
2024-09-07 00:22:01 -06:00
Grazfather
58207fdb2c
fix(docs): Mention display-name property in layer docs (#2460) 2024-09-06 20:03:23 -07:00
Alexander Krikun
cddc92108c fix(boards): add sleep pinctrl node for nice!60
Add spi3_sleep pinctrl node to fix nice!60 builds with
both RGB underglow and sleep enabled.
2024-09-06 13:04:22 -06:00
honorless
a2f32cc12c refactor(shield): tidbit
* Implement alternative matrix-transform.

* Add missing wakeup-source attribute.

* Revise README to provide more appropriate information.

* Remove unnecessary files (partially-functional shield).
2024-09-06 13:02:15 -06:00
Robert U
2a137bb675
fix: Support west test when invoked as module 2024-09-06 14:56:40 -04:00
dependabot[bot]
ba6f21fd2b chore(deps): bump tj-actions/changed-files from 44 to 45
Bumps [tj-actions/changed-files](https://github.com/tj-actions/changed-files) from 44 to 45.
- [Release notes](https://github.com/tj-actions/changed-files/releases)
- [Changelog](https://github.com/tj-actions/changed-files/blob/main/HISTORY.md)
- [Commits](https://github.com/tj-actions/changed-files/compare/v44...v45)

---
updated-dependencies:
- dependency-name: tj-actions/changed-files
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-06 12:51:29 -06:00
ReFil
91447ac55c
fix: Correct max brightness in backlight metadata
The set brightness function in the backlighting code has a max of 100, as does the zephyr led-pwm driver https://github.com/zephyrproject-rtos/zephyr/blob/main/drivers/led/led_pwm.c

The range for the set brightness function should reflect this max
2024-09-06 14:36:08 -04:00
honorless
eaa8989f37 style: update commented-out obsolete keycodes 2024-09-06 12:22:54 -06:00
honorless
e0ec2ff84d refactor: update obsolete keycodes 2024-09-06 12:22:54 -06:00
Peter Johanson
03b5b38bc4 feat: Split physical layout selection sync.
* Ensure the split peripherals have the same selected physical
  layout on connection and change.
2024-09-06 12:20:45 -06:00
Peter Johanson
3975d2fdaf feat: Add studio related documentation.
* Document setting up studio for a new keyboard definition.
* Document how to enable ZMK Studio for a build, adding reserved layers,
  and controlling which behaviors are built into a studio firmware.
* Document `&studio_unlock` behavior.
* Document studio configuration options.

Co-authored-by: Cem Aksoylar <caksoylar@users.noreply.github.com>
2024-09-05 12:22:08 -06:00
Peter Johanson
5176fbea6a fix: Locking fix for RPC subsystem. 2024-09-05 12:22:08 -06:00
Peter Johanson
782695f4a9 fix: Fixes for CRC16 local IDs. 2024-09-05 12:22:08 -06:00
Peter Johanson
e0339a2a57 feat: Add shared layout .dtsi files to promote reuse.
* Add Corne and Ferris shared layouts, and update the respective
  shields to use them.
* Add a sample Hummingbird physical layout for testing posix xiao.
* Add Sofle physical layout as an additional reference.
2024-09-05 12:22:08 -06:00
Peter Johanson
b84436e611 feat: Add posix_pro_micro and posix_seeed_xiao shields
* Make it easier to test native builds of our shields by adding
  `posix_pro_micro` and `posix_seeed_xiao` so you can build posix
  target of, e.g. `corne_left` for testing ZMK Studio.
2024-09-05 12:22:08 -06:00
Peter Johanson
fd28eab179 feat: Add the ability to keep/omit behaviors for a given build.
* Use defines to keep either all behaviors with omits, or selective behaviors with
  explicit kept behavior, before including `behavior.dtsi` in keymaps.
* Default ZMK_BEHAVIORS_KEEP_ALL when building with the studio RPC
  endpoint snippet.
2024-09-05 12:22:08 -06:00
Peter Johanson
d77e400eb9 feat(boards): Add posix MiniVan studio tester
* New shield to easily test studio using the `native_posix_64` board.
2024-09-05 12:22:08 -06:00
Peter Johanson
c8c19598a7 feat(keymap): Add binding get/set, layer movement
* Add keymap API for getting/setting a bindings
  in keymap layers.
* Add layer move support via intemediary ordering array.
* Add settings storage for keymap changes.
2024-09-05 12:22:08 -06:00
dependabot[bot]
0f972f1cc3 chore(deps): bump web-tree-sitter from 0.20.8 to 0.23.0 in /docs
Bumps [web-tree-sitter](https://github.com/tree-sitter/tree-sitter) from 0.20.8 to 0.23.0.
- [Release notes](https://github.com/tree-sitter/tree-sitter/releases)
- [Changelog](https://github.com/tree-sitter/tree-sitter/blob/master/CHANGELOG.md)
- [Commits](https://github.com/tree-sitter/tree-sitter/compare/v0.20.8...v0.23.0)

---
updated-dependencies:
- dependency-name: web-tree-sitter
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-01 22:57:37 -07:00
116 changed files with 3223 additions and 597 deletions

View file

@ -430,7 +430,7 @@ jobs:
uses: actions/checkout@v4 uses: actions/checkout@v4
with: with:
persist-credentials: false persist-credentials: false
- uses: tj-actions/changed-files@v44 - uses: tj-actions/changed-files@v45
id: changed-files id: changed-files
with: with:
json: true json: true

View file

@ -258,6 +258,26 @@ rsource "src/split/Kconfig"
#Basic Keyboard Setup #Basic Keyboard Setup
endmenu endmenu
menu "Keymaps"
config ZMK_KEYMAP_LAYER_REORDERING
bool "Layer Reordering Support"
config ZMK_KEYMAP_SETTINGS_STORAGE
bool "Settings Save/Load"
depends on SETTINGS
depends on ZMK_BEHAVIOR_LOCAL_IDS
if ZMK_KEYMAP_SETTINGS_STORAGE
config ZMK_KEYMAP_LAYER_NAME_MAX_LEN
int "Max Layer Name Length"
default 20
endif
endmenu # Keymaps
rsource "src/studio/Kconfig" rsource "src/studio/Kconfig"
menu "Display/LED Options" menu "Display/LED Options"

View file

@ -4,6 +4,8 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#undef ZMK_BEHAVIORS_KEEP_ALL
#include <behaviors.dtsi> #include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>

View file

@ -31,7 +31,7 @@
#ifdef ANSI #ifdef ANSI
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |
@ -94,7 +94,7 @@
#elif defined(ISO) #elif defined(ISO)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER |
// | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | | | Z | X | C | V | B | N | M | , | . | / | SHIFT |
@ -122,7 +122,7 @@
#elif defined(ALL_1U) #elif defined(ALL_1U)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 |
@ -150,7 +150,7 @@
#else #else
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP| DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC| DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | 1 |

View file

@ -8,7 +8,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |

View file

@ -29,7 +29,7 @@
#ifdef ANSI #ifdef ANSI
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |
@ -65,7 +65,7 @@
#elif defined(ISO) #elif defined(ISO)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER |
// | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT |
@ -101,7 +101,7 @@
#elif defined(ALL_1U) #elif defined(ALL_1U)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 | // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 |
@ -118,7 +118,7 @@
}; };
raise { raise {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL | // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BSPC | DEL |
// | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG | // | TAB | Q | W | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG |
// | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT | // | CAPS | A | S | D | BRI | BRD | H | J | K | L | HOME| PGUP| BOOT |
// | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 | // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 |
@ -136,7 +136,7 @@
#elif defined(HHKB) #elif defined(HHKB)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |

View file

@ -29,7 +29,7 @@
#ifdef ANSI #ifdef ANSI
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP|
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN|
@ -37,7 +37,7 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN
@ -65,7 +65,7 @@
#elif defined(ISO) #elif defined(ISO)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP|
// |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN|
@ -73,7 +73,7 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP
&kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN
@ -101,7 +101,7 @@
#elif defined(ALL_1U) #elif defined(ALL_1U)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL | HOME|
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP|
// |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN|
@ -136,7 +136,7 @@
#elif defined(HHKB) #elif defined(HHKB)
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME| // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | HOME|
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | END |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP| // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | PGUP|
@ -144,7 +144,7 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp HOME
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp END
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp PG_UP

View file

@ -27,7 +27,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END |
// |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | INS |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP|
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN|
@ -35,7 +35,7 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bindings = < bindings = <
&kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp BSLH &kp INS
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp RET &kp PG_UP
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN
@ -66,7 +66,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END | // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN|HOME| END |
// |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | DEL | // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | | INS |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER | PGUP|
// |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN| // |SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT | UP | PGDN|
@ -74,7 +74,7 @@
// ------------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------------
bindings = < bindings = <
&kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END &kp ESC &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp PSCRN &kp HOME &kp END
&kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BKSP &kp DEL &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp EQUAL &kp BSPC &kp DEL
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &kp RBKT &kp INS
&kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP &kp CLCK &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp NON_US_HASH &kp RET &kp PG_UP
&kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN &kp LSHFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &kp PG_DN
@ -105,7 +105,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------------------
// | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS | // | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F9 | F9 | F10 | F11 | F12 |PSCRN| P_B | INS |
// |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL | HOME| // |GRAVE| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BSPC | DEL | HOME|
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | END |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP| // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | PGUP|
// |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN| // |SHIFT|NONE | Z | X | C | V | B | N | M | , | . | / |SHIFT|NONE | UP | PGDN|

View file

@ -23,7 +23,7 @@
default_layer { default_layer {
display-name = "QWERTY"; display-name = "QWERTY";
// -------------------------------------------------------------------------------- // --------------------------------------------------------------------------------
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC |
// | GUI | LWR | SPC | | ENT | RSE | ALT | // | GUI | LWR | SPC | | ENT | RSE | ALT |
@ -38,7 +38,7 @@
lower_layer { lower_layer {
display-name = "NUMBER"; display-name = "NUMBER";
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC |
// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
// | SHFT | | | | | | | | | | | | | // | SHFT | | | | | | | | | | | | |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |
@ -53,7 +53,7 @@
raise_layer { raise_layer {
display-name = "SYMBOL"; display-name = "SYMBOL";
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC |
// | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | CTRL | | | | | | | - | = | [ | ] | \ | ` |
// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |

View file

@ -7,7 +7,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL | // | SHIFT | Z | X | C | V | B | N | M | , | . | SHIFT(/) | ^ | DEL |

View file

@ -10,6 +10,12 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/cuddlykeyboards/ferris.dtsi>
&cuddlykeyboards_ferris_layout {
transform = <&transform>;
};
/ { / {
model = "Ferris rev0.2"; model = "Ferris rev0.2";
compatible = "ferris,rev02", "st,stm32f072"; compatible = "ferris,rev02", "st,stm32f072";
@ -18,7 +24,6 @@
zephyr,sram = &sram0; zephyr,sram = &sram0;
zephyr,flash = &flash0; zephyr,flash = &flash0;
zmk,kscan = &kscan; zmk,kscan = &kscan;
zmk,matrix-transform = &transform;
/* TODO: Enable once we support the IC for underglow /* TODO: Enable once we support the IC for underglow
zmk,underglow = &led_strip; zmk,underglow = &led_strip;
*/ */
@ -114,6 +119,9 @@ zephyr_udc0: &usb {
pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>; pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>;
pinctrl-names = "default"; pinctrl-names = "default";
// Overridden to lower RAM usage.
num-bidir-endpoints = <4>;
}; };
&clk_hsi { &clk_hsi {

View file

@ -4,6 +4,8 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#undef ZMK_BEHAVIORS_KEEP_ALL
#include <behaviors.dtsi> #include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h> #include <dt-bindings/zmk/bt.h>
@ -33,16 +35,16 @@
default_layer { default_layer {
bindings = < bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm LALT L &hm LGUI QUOT &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp H &hm RSHFT J &hm RCTRL K &hm LALT L &hm LGUI SQT
&kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH
&lt NAV_L TAB &kp ENTER &lt NUM_L SPACE &lt SYM_L BKSP &lt NAV_L TAB &kp ENTER &lt NUM_L SPACE &lt SYM_L BSPC
>; >;
}; };
nav_layer { nav_layer {
bindings = < bindings = <
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp UARW &kp RARW &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT
&trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END
&trans &trans &kp ESC &kp DEL &trans &trans &kp ESC &kp DEL
>; >;

View file

@ -9,4 +9,11 @@
psels = <NRF_PSEL(SPIM_MOSI, 0, 27)>; psels = <NRF_PSEL(SPIM_MOSI, 0, 27)>;
}; };
}; };
spi3_sleep: spi3_sleep {
group1 {
psels = <NRF_PSEL(SPIM_MOSI, 0, 27)>;
low-power-enable;
};
};
}; };

View file

@ -110,7 +110,8 @@ RC(4,0) RC(4,1) RC(4,2) RC(4,5) R
compatible = "nordic,nrf-spim"; compatible = "nordic,nrf-spim";
pinctrl-0 = <&spi3_default>; pinctrl-0 = <&spi3_default>;
pinctrl-names = "default"; pinctrl-1 = <&spi3_sleep>;
pinctrl-names = "default", "sleep";
status = "okay"; status = "okay";
led_strip: ws2812@0 { led_strip: ws2812@0 {

View file

@ -15,7 +15,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | "|" |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |

View file

@ -21,12 +21,12 @@
// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC |
// | ESC | A | S | D | F | G | H | J | K | L | ; | ' | // | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET |
// | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | // | | LCTRL | LALT | LGUI | LOWR | SPACE | RAIS | LEFT | DOWN | UP | RIGHT |
bindings = < bindings = <
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC
&kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET
&trans &kp LCTL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp LCTRL &kp LALT &kp LGUI &mo 1 &trans &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT
>; >;
sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>; sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
}; };

View file

@ -1,4 +1,4 @@
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/kscan_mock.h> #include <dt-bindings/zmk/kscan_mock.h>
@ -8,7 +8,7 @@
zmk,kscan = &kscan; zmk,kscan = &kscan;
}; };
kscan: kscan { kscan: native_posix_64_kscan_mock {
compatible = "zmk,kscan-mock"; compatible = "zmk,kscan-mock";
rows = <2>; rows = <2>;

View file

@ -20,7 +20,7 @@
// | TAB | Q | W | E | R | T | Y | U | I | O | P | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | \ |
// | SHIFT | A | S | D | F | G | H | J | K | L | ; | ' | // | SHIFT | A | S | D | F | G | H | J | K | L | ; | ' |
// | CTRL | Z | X | C | V | B | N | M | , | . | / | ENTER | // | CTRL | Z | X | C | V | B | N | M | , | . | / | ENTER |
// |ADJUST | LCTL | LALT | LGUI | LOWR | SPACE| SPACE | RAIS | LARW | DARW | UARW | RARW | // |ADJUST | LCTL | LALT | LGUI | LOWR | SPACE| SPACE | RAIS | LEFT | DOWN | UARW | RARW |
bindings = < bindings = <

View file

@ -6,11 +6,21 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/foostan/corne.dtsi>
&foostan_corne_6col_layout {
transform = <&default_transform>;
};
&foostan_corne_5col_layout {
transform = <&five_column_transform>;
};
/ { / {
chosen { chosen {
zephyr,display = &oled; zephyr,display = &oled;
zmk,kscan = &kscan0; zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform; zmk,physical-layout = &foostan_corne_6col_layout;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {
@ -36,7 +46,7 @@ RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(2,6) RC(2,7) RC(2,8) RC(2,9)
// | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 | // | SW2 | SW3 | SW4 | SW5 | SW6 | | SW6 | SW5 | SW4 | SW3 | SW2 |
// | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 | // | SW8 | SW9 | SW10 | SW11 | SW12 | | SW12 | SW11 | SW10 | SW9 | SW8 |
// | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 | // | SW14 | SW15 | SW16 | SW17 | SW18 | | SW18 | SW17 | SW16 | SW15 | SW14 |
// | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 | // | SW19 | SW20 | SW21 | | SW21 | SW20 | SW19 |
map = < map = <
RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10)
RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10)

View file

@ -14,7 +14,7 @@
default_layer { default_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC |
// | GUI | LWR | SPC | | ENT | RSE | ALT | // | GUI | LWR | SPC | | ENT | RSE | ALT |
@ -27,7 +27,7 @@
}; };
lower_layer { lower_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC |
// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
// | SHFT | | | | | | | | | | | | | // | SHFT | | | | | | | | | | | | |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |
@ -41,7 +41,7 @@
raise_layer { raise_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC |
// | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | CTRL | | | | | | | - | = | [ | ] | \ | ` |
// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |

View file

@ -5,12 +5,15 @@
*/ */
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/cuddlykeyboards/ferris.dtsi>
&cuddlykeyboards_ferris_layout {
transform = <&default_transform>;
};
/ { / {
chosen { chosen {
zmk,kscan = &kscan0; zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {

View file

@ -56,7 +56,7 @@
&kp INS &kp N1 &kp N2 &kp N3 &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON &kp INS &kp N1 &kp N2 &kp N3 &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &kp COLON
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │ //│ DELETE │ 4 │ 5 │ 6 │ │ │ LEFT │ DOWN │ UP │ RIGHT │ ; │
&kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LARW &kp DARW &kp UARW &kp RARW &kp SEMI &kp DEL &kp N4 &kp N5 &kp N6 &trans &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp SEMI
//├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤ //├──────────┼──────────┼──────────┼──────────┼──────────┤ ├──────────┼──────────┼──────────┼──────────┼──────────┤
//│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │ //│ CAPS │ 7 │ 8 │ 9 │ 0 │ │ │ │ │ │ │
&caps_word &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans &caps_word &kp N7 &kp N8 &kp N9 &kp N0 &trans &trans &trans &trans &trans

View file

@ -17,12 +17,12 @@
// | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC | // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC |
// | ESC | A | S | D | F | G | H | J | K | L | ; | ' | // | ESC | A | S | D | F | G | H | J | K | L | ; | ' |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | RET |
// | | LCTL | LALT | LGUI | LOWR | SPACE | RAIS | LARW | DARW | UARW | RARW | // | | LCTRL | LALT | LGUI | LOWR | SPACE | RAIS | LEFT | DOWN | UP | RIGHT |
bindings = < bindings = <
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSPC
&kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp SLASH &kp RET
&trans &kp LCTL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &trans &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT
>; >;
sensor-bindings = <&inc_dec_kp PG_UP PG_DN>; sensor-bindings = <&inc_dec_kp PG_UP PG_DN>;

View file

@ -14,7 +14,7 @@
compatible = "zmk,keymap"; compatible = "zmk,keymap";
// ---------------------------------------------- ---------------------------------------------- // ---------------------------------------------- ----------------------------------------------
// | ESC | Q | W | E | R | T | | Y | U | I | O | P | | BKSP | // | ESC | Q | W | E | R | T | | Y | U | I | O | P | | BSPC |
// | TAB | A | S | D | F | G | | H | J | K | L | ' | ENTER | // | TAB | A | S | D | F | G | | H | J | K | L | ' | ENTER |
// | SHIFT | Z | X | C | V | B | | N | M | , | . | / | RSHFT | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | RSHFT |
// | LCTRL | LALT| LGUI | SPACE | | SPACE/L1 | L2 | RGUI | RALT |RCTRL| // | LCTRL | LALT| LGUI | SPACE | | SPACE/L1 | L2 | RGUI | RALT |RCTRL|

View file

@ -58,17 +58,17 @@
default_layer { default_layer {
bindings = < bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp H &kp U &kp I &kp O &kp P &kp Q &kp W &kp E &kp R &kp T &kp H &kp U &kp I &kp O &kp P
&hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI QUOT &hm LGUI A &hm LALT S &hm LCTRL D &hm LSHFT F &kp G &kp N &hm RSHFT J &hm RCTRL K &hm LALT L &hm RGUI SQT
&kp X &kp C &kp V &kp M &kp COMMA &kp DOT &kp X &kp C &kp V &kp M &kp COMMA &kp DOT
&lt NAV_L TAB &kp RET &lt NUM_L SPACE &lt SYM_L BKSP &lt NAV_L TAB &kp RET &lt NUM_L SPACE &lt SYM_L BSPC
>; >;
}; };
nav_layer { nav_layer {
display-name = "Nav"; display-name = "Nav";
bindings = < bindings = <
&trans &trans &trans &trans &trans &trans &kp HOME &kp UARW &kp PG_UP &trans &trans &trans &trans &trans &trans &trans &kp HOME &kp UP &kp PG_UP &trans
&trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp RARW &trans &trans &trans &trans &trans &trans &trans &kp LEFT &kp DOWN &kp RIGHT &trans
&trans &trans &trans &kp END &trans &kp PG_DN &trans &trans &trans &kp END &trans &kp PG_DN
&trans &trans &kp ESC &kp DEL &trans &trans &kp ESC &kp DEL
>; >;

View file

@ -6,12 +6,11 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <physical_layouts.dtsi>
/ { / {
chosen { chosen {
zmk,kscan = &kscan0; zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform;
/delete-property/ zephyr,console;
/delete-property/ zephyr,shell-uart;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {
@ -51,7 +50,45 @@
; ;
}; };
};
&xiao_spi { status = "disabled"; }; layout_0: layout_0 {
&xiao_serial { status = "disabled"; }; compatible = "zmk,physical-layout";
display-name = "Default";
transform = <&default_transform>;
keys // w h x y rot rx ry
= <&key_physical_attrs 100 100 0 75 0 0 0>
, <&key_physical_attrs 100 100 100 25 0 0 0>
, <&key_physical_attrs 100 100 200 0 0 0 0>
, <&key_physical_attrs 100 100 300 25 0 0 0>
, <&key_physical_attrs 100 100 400 75 0 0 0>
, <&key_physical_attrs 100 100 600 75 0 0 0>
, <&key_physical_attrs 100 100 700 25 0 0 0>
, <&key_physical_attrs 100 100 800 0 0 0 0>
, <&key_physical_attrs 100 100 900 25 0 0 0>
, <&key_physical_attrs 100 100 1000 75 0 0 0>
, <&key_physical_attrs 100 100 0 175 0 0 0>
, <&key_physical_attrs 100 100 100 125 0 0 0>
, <&key_physical_attrs 100 100 200 100 0 0 0>
, <&key_physical_attrs 100 100 300 125 0 0 0>
, <&key_physical_attrs 100 100 400 175 0 0 0>
, <&key_physical_attrs 100 100 600 175 0 0 0>
, <&key_physical_attrs 100 100 700 125 0 0 0>
, <&key_physical_attrs 100 100 800 100 0 0 0>
, <&key_physical_attrs 100 100 900 125 0 0 0>
, <&key_physical_attrs 100 100 1000 175 0 0 0>
, <&key_physical_attrs 100 100 100 225 0 0 0>
, <&key_physical_attrs 100 100 200 200 0 0 0>
, <&key_physical_attrs 100 100 300 225 0 0 0>
, <&key_physical_attrs 100 100 700 225 0 0 0>
, <&key_physical_attrs 100 100 800 200 0 0 0>
, <&key_physical_attrs 100 100 900 225 0 0 0>
, <&key_physical_attrs 100 100 325 350 0 0 0>
, <&key_physical_attrs 100 100 425 375 0 0 0>
, <&key_physical_attrs 100 100 575 375 0 0 0>
, <&key_physical_attrs 100 100 675 350 0 0 0>
;
};
};

View file

@ -25,7 +25,7 @@
// | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] | // | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'| // | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'|
// | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT | // | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT |
// | RSE | SPC | LWR | | LWR | BKSP | RSE | // | RSE | SPC | LWR | | LWR | BSPC | RSE |
bindings = < bindings = <
&kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT &kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT

View file

@ -22,7 +22,7 @@
// | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] | // | GUI | ~ | Q | W | E | R | T | | Y | U | I | O | P | [ | GUI/] |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'| // | CTRL | A | S | D | F | G | | H | J | K | L | ; |CTRL/'|
// | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT | // | LALT | Z | X | C | V | B | | N | M | , | . | / | RALT |
// | RSE | SPC | LWR | | LWR | BKSP | RSE | // | RSE | SPC | LWR | | LWR | BSPC | RSE |
bindings = < bindings = <
&kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT &kp LWIN &kp GRAVE &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp LBKT &mt RWIN RBKT
&kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT &kp LCTRL &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &mt RCTRL SQT

View file

@ -28,7 +28,7 @@
display-name = " QWERTY"; display-name = " QWERTY";
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAVE
&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp LGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
&kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &kp DEL &kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &kp DEL
@ -64,4 +64,4 @@
}; };
}; };
}; };

View file

@ -40,7 +40,7 @@
display-name = " QWERTY"; display-name = " QWERTY";
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSLH
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAV &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp GRAVE
&kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp CAPS &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp LGUI &kp RGUI &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
&kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &kp DEL &kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &kp DEL
@ -76,4 +76,4 @@ RGBOFF RGBEFF RGBHUD RGBSAD RGBBRD &trans &trans &tr
}; };
}; };
}; };

View file

@ -77,7 +77,7 @@
bindings = < bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI
&mt LSFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSFT FSLH &mt LSHFT Z &kp X &kp C &kp V &kp B &mo QC_N &kp RGUI &kp N &kp M &kp COMMA &kp DOT &mt RSHFT FSLH
&kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &mo QC_B &kp LALT &kp LCTRL &lt 1 RET &lt 2 MINUS &lt 2 EQUAL &lt 1 SPACE &kp BSPC &mo QC_B
>; >;
@ -88,7 +88,7 @@
display-name = " Lower"; display-name = " Lower";
bindings = < bindings = <
&kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
&trans &trans &trans &trans &trans &trans &trans &trans &trans &kp QUOT &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp SQT
&kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT &kp LSHFT &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &kp RSHFT
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
>; >;
@ -101,7 +101,7 @@
bindings = < bindings = <
&kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH &kp TAB &trans &trans &trans &trans &kp PG_UP &kp HOME &kp UP &kp END &kp BSLH
&kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE &kp CAPS &trans &trans &trans &trans &kp PG_DN &kp LEFT &kp DOWN &kp RIGHT &kp GRAVE
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSFT TILDE &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &mt RSHFT TILDE
&trans &trans &trans &trans &trans &trans &kp DEL &trans &trans &trans &trans &trans &trans &trans &kp DEL &trans
>; >;

View file

@ -14,7 +14,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------------ // ------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BSPC |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ | // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER | // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
// | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |

View file

@ -28,7 +28,7 @@
nav_layer { nav_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL | // |BTCLR| | ESC | ~ | | | TAB | HOME | UP | END | DEL |
// | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BKSP | // | BT1 | GUI | ALT | CTRL | NUM | | / | LEFT | DOWN | RGT | BSPC |
// | BT2 | | | | | | \ | ENT | | | | // | BT2 | | | | | | \ | ENT | | | |
// | | | | | | | | // | | | | | | | |
bindings = < bindings = <

View file

@ -0,0 +1,9 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_MINIVAN_STUDIO_TESTER
config ZMK_KEYBOARD_NAME
default "MiniVan Tester"
endif

View file

@ -0,0 +1,9 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_MINIVAN_STUDIO_TESTER
def_bool $(shields_list_contains,minivan_studio_tester)
select ZMK_STUDIO
select UART_NATIVE_POSIX_PORT_1_ENABLE
select CBPRINTF_LIBC_SUBSTS
select ZMK_STUDIO_TRANSPORT_UART

View file

@ -0,0 +1 @@
CONFIG_ZMK_STUDIO_LOCKING=n

View file

@ -0,0 +1,61 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#define ZMK_BEHAVIORS_KEEP_ALL
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#define NAV_L 1
#define NUM_L 2
#define MED_L 3
#define FUN_L 4
/ {
keymap {
compatible = "zmk,keymap";
base_layer {
display-name = "Base";
bindings = <
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BKSP
&gresc &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp RET
&kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp QUOT
&kp LGUI &kp LALT &mo NAV_L &kp LEFT_SHIFT &kp SPACE &mo NUM_L &kp LALT &kp RCTL
>;
};
nav_layer {
display-name = "Nav";
bindings = <
&trans &trans &trans &trans &trans &trans &trans &kp GRAVE &kp TILDE &trans &trans &kp DEL
&trans &trans &trans &trans &trans &trans &trans &kp LARW &kp DARW &kp UARW &kp RARW &trans
&trans &trans &trans &trans &trans &trans &trans &kp HOME &kp PG_DN &kp PG_UP &kp END &trans
&trans &trans &trans &trans &trans &trans &trans &trans
>;
};
num_layer {
display-name = "Num";
bindings = <
&trans &trans &kp N7 &kp N8 &kp N9 &kp RBKT &trans &trans &trans &trans &trans &trans
&trans &kp MINUS &kp N4 &kp N5 &kp N6 &kp EQUAL &trans &trans &trans &trans &trans &trans
&kp PLUS &kp N1 &kp N2 &kp N3 &kp N0 &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &kp ESC &trans &trans
>;
};
med_layer {
display-name = "Sym";
bindings = <
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans
>;
};
};
};

View file

@ -0,0 +1,335 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix_transform.h>
#include <physical_layouts.dtsi>
&kscan {
/delete-property/ exit-after;
events = <>;
};
&uart1 { status = "okay"; };
/ {
chosen {
zmk,physical-layout = &standard_layout;
zmk,studio-rpc-uart = &uart1;
};
standard_transform: standard_transform {
compatible = "zmk,matrix-transform";
rows = <4>;
columns = <12>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0)
RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0)
RC(6,0) RC(6,1) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,0)
>;
};
arrows_transform: arrows_transform {
compatible = "zmk,matrix-transform";
rows = <4>;
columns = <12>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0)
RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0)
RC(6,0) RC(6,1) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,1) RC(7,0)
>;
};
southpaw_transform: southpaw_transform {
compatible = "zmk,matrix-transform";
rows = <4>;
columns = <12>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0)
RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0)
RC(6,0) RC(6,1) RC(6,2) RC(6,3) RC(6,4) RC(6,5) RC(7,3) RC(7,2) RC(7,0)
>;
};
jetvan_transform: jetvan_transform {
compatible = "zmk,matrix-transform";
rows = <4>;
columns = <12>;
map = <
RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(1,5) RC(1,4) RC(1,3) RC(1,2) RC(1,1) RC(1,0)
RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(3,5) RC(3,4) RC(3,3) RC(3,2) RC(3,1) RC(3,0)
RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(5,5) RC(5,4) RC(5,3) RC(5,2) RC(5,1) RC(5,0)
RC(6,0) RC(6,1) RC(6,2) RC(6,4) RC(7,3) RC(7,2) RC(7,0)
>;
};
standard_layout: standard_layout {
compatible = "zmk,physical-layout";
display-name = "Standard";
transform = <&standard_transform>;
kscan = <&kscan>;
keys
= <&key_physical_attrs 100 100 000 000 0 0 0>
, <&key_physical_attrs 100 100 100 000 0 0 0>
, <&key_physical_attrs 100 100 200 000 0 0 0>
, <&key_physical_attrs 100 100 300 000 0 0 0>
, <&key_physical_attrs 100 100 400 000 0 0 0>
, <&key_physical_attrs 100 100 500 000 0 0 0>
, <&key_physical_attrs 100 100 600 000 0 0 0>
, <&key_physical_attrs 100 100 700 000 0 0 0>
, <&key_physical_attrs 100 100 800 000 0 0 0>
, <&key_physical_attrs 100 100 900 000 0 0 0>
, <&key_physical_attrs 100 100 1000 000 0 0 0>
, <&key_physical_attrs 175 100 1100 000 0 0 0>
, <&key_physical_attrs 125 100 000 100 0 0 0>
, <&key_physical_attrs 100 100 125 100 0 0 0>
, <&key_physical_attrs 100 100 225 100 0 0 0>
, <&key_physical_attrs 100 100 325 100 0 0 0>
, <&key_physical_attrs 100 100 425 100 0 0 0>
, <&key_physical_attrs 100 100 525 100 0 0 0>
, <&key_physical_attrs 100 100 625 100 0 0 0>
, <&key_physical_attrs 100 100 725 100 0 0 0>
, <&key_physical_attrs 100 100 825 100 0 0 0>
, <&key_physical_attrs 100 100 925 100 0 0 0>
, <&key_physical_attrs 100 100 1025 100 0 0 0>
, <&key_physical_attrs 150 100 1125 100 0 0 0>
, <&key_physical_attrs 175 100 000 200 0 0 0>
, <&key_physical_attrs 100 100 175 200 0 0 0>
, <&key_physical_attrs 100 100 275 200 0 0 0>
, <&key_physical_attrs 100 100 375 200 0 0 0>
, <&key_physical_attrs 100 100 475 200 0 0 0>
, <&key_physical_attrs 100 100 575 200 0 0 0>
, <&key_physical_attrs 100 100 675 200 0 0 0>
, <&key_physical_attrs 100 100 775 200 0 0 0>
, <&key_physical_attrs 100 100 875 200 0 0 0>
, <&key_physical_attrs 100 100 975 200 0 0 0>
, <&key_physical_attrs 100 100 1075 200 0 0 0>
, <&key_physical_attrs 100 100 1175 200 0 0 0>
, <&key_physical_attrs 125 100 000 300 0 0 0>
, <&key_physical_attrs 150 100 125 300 0 0 0>
, <&key_physical_attrs 125 100 275 300 0 0 0>
, <&key_physical_attrs 225 100 400 300 0 0 0>
, <&key_physical_attrs 200 100 625 300 0 0 0>
, <&key_physical_attrs 125 100 825 300 0 0 0>
, <&key_physical_attrs 150 100 950 300 0 0 0>
, <&key_physical_attrs 175 100 1100 300 0 0 0>
;
};
southpaw_layout: southpaw_layout {
compatible = "zmk,physical-layout";
display-name = "Southpaw";
transform = <&southpaw_transform>;
kscan = <&kscan>;
keys
= <&key_physical_attrs 100 100 000 000 0 0 0>
, <&key_physical_attrs 100 100 100 000 0 0 0>
, <&key_physical_attrs 100 100 200 000 0 0 0>
, <&key_physical_attrs 100 100 300 000 0 0 0>
, <&key_physical_attrs 100 100 400 000 0 0 0>
, <&key_physical_attrs 100 100 500 000 0 0 0>
, <&key_physical_attrs 100 100 600 000 0 0 0>
, <&key_physical_attrs 100 100 700 000 0 0 0>
, <&key_physical_attrs 100 100 800 000 0 0 0>
, <&key_physical_attrs 100 100 900 000 0 0 0>
, <&key_physical_attrs 100 100 1000 000 0 0 0>
, <&key_physical_attrs 175 100 1100 000 0 0 0>
, <&key_physical_attrs 125 100 000 100 0 0 0>
, <&key_physical_attrs 100 100 125 100 0 0 0>
, <&key_physical_attrs 100 100 225 100 0 0 0>
, <&key_physical_attrs 100 100 325 100 0 0 0>
, <&key_physical_attrs 100 100 425 100 0 0 0>
, <&key_physical_attrs 100 100 525 100 0 0 0>
, <&key_physical_attrs 100 100 625 100 0 0 0>
, <&key_physical_attrs 100 100 725 100 0 0 0>
, <&key_physical_attrs 100 100 825 100 0 0 0>
, <&key_physical_attrs 100 100 925 100 0 0 0>
, <&key_physical_attrs 100 100 1025 100 0 0 0>
, <&key_physical_attrs 150 100 1125 100 0 0 0>
, <&key_physical_attrs 175 100 000 200 0 0 0>
, <&key_physical_attrs 100 100 175 200 0 0 0>
, <&key_physical_attrs 100 100 275 200 0 0 0>
, <&key_physical_attrs 100 100 375 200 0 0 0>
, <&key_physical_attrs 100 100 475 200 0 0 0>
, <&key_physical_attrs 100 100 575 200 0 0 0>
, <&key_physical_attrs 100 100 675 200 0 0 0>
, <&key_physical_attrs 100 100 775 200 0 0 0>
, <&key_physical_attrs 100 100 875 200 0 0 0>
, <&key_physical_attrs 100 100 975 200 0 0 0>
, <&key_physical_attrs 100 100 1075 200 0 0 0>
, <&key_physical_attrs 100 100 1175 200 0 0 0>
, <&key_physical_attrs 100 100 000 300 0 0 0>
, <&key_physical_attrs 100 100 100 300 0 0 0>
, <&key_physical_attrs 100 100 200 300 0 0 0>
, <&key_physical_attrs 100 100 300 300 0 0 0>
, <&key_physical_attrs 225 100 400 300 0 0 0>
, <&key_physical_attrs 200 100 625 300 0 0 0>
, <&key_physical_attrs 125 100 825 300 0 0 0>
, <&key_physical_attrs 150 100 950 300 0 0 0>
, <&key_physical_attrs 175 100 1100 300 0 0 0>
;
};
arrows_layout: arrows_layout {
compatible = "zmk,physical-layout";
display-name = "Arrows";
transform = <&arrows_transform>;
kscan = <&kscan>;
keys
= <&key_physical_attrs 100 100 000 000 0 0 0>
, <&key_physical_attrs 100 100 100 000 0 0 0>
, <&key_physical_attrs 100 100 200 000 0 0 0>
, <&key_physical_attrs 100 100 300 000 0 0 0>
, <&key_physical_attrs 100 100 400 000 0 0 0>
, <&key_physical_attrs 100 100 500 000 0 0 0>
, <&key_physical_attrs 100 100 600 000 0 0 0>
, <&key_physical_attrs 100 100 700 000 0 0 0>
, <&key_physical_attrs 100 100 800 000 0 0 0>
, <&key_physical_attrs 100 100 900 000 0 0 0>
, <&key_physical_attrs 100 100 1000 000 0 0 0>
, <&key_physical_attrs 175 100 1100 000 0 0 0>
, <&key_physical_attrs 125 100 000 100 0 0 0>
, <&key_physical_attrs 100 100 125 100 0 0 0>
, <&key_physical_attrs 100 100 225 100 0 0 0>
, <&key_physical_attrs 100 100 325 100 0 0 0>
, <&key_physical_attrs 100 100 425 100 0 0 0>
, <&key_physical_attrs 100 100 525 100 0 0 0>
, <&key_physical_attrs 100 100 625 100 0 0 0>
, <&key_physical_attrs 100 100 725 100 0 0 0>
, <&key_physical_attrs 100 100 825 100 0 0 0>
, <&key_physical_attrs 100 100 925 100 0 0 0>
, <&key_physical_attrs 100 100 1025 100 0 0 0>
, <&key_physical_attrs 150 100 1125 100 0 0 0>
, <&key_physical_attrs 175 100 000 200 0 0 0>
, <&key_physical_attrs 100 100 175 200 0 0 0>
, <&key_physical_attrs 100 100 275 200 0 0 0>
, <&key_physical_attrs 100 100 375 200 0 0 0>
, <&key_physical_attrs 100 100 475 200 0 0 0>
, <&key_physical_attrs 100 100 575 200 0 0 0>
, <&key_physical_attrs 100 100 675 200 0 0 0>
, <&key_physical_attrs 100 100 775 200 0 0 0>
, <&key_physical_attrs 100 100 875 200 0 0 0>
, <&key_physical_attrs 100 100 975 200 0 0 0>
, <&key_physical_attrs 100 100 1075 200 0 0 0>
, <&key_physical_attrs 100 100 1175 200 0 0 0>
, <&key_physical_attrs 125 100 000 300 0 0 0>
, <&key_physical_attrs 150 100 125 300 0 0 0>
, <&key_physical_attrs 125 100 275 300 0 0 0>
, <&key_physical_attrs 225 100 400 300 0 0 0>
, <&key_physical_attrs 200 100 625 300 0 0 0>
, <&key_physical_attrs 150 100 825 300 0 0 0>
, <&key_physical_attrs 100 100 975 300 0 0 0>
, <&key_physical_attrs 100 100 1075 300 0 0 0>
, <&key_physical_attrs 100 100 1175 300 0 0 0>
;
};
jetvan_layout: jetvan_layout {
compatible = "zmk,physical-layout";
display-name = "JetVan";
transform = <&jetvan_transform>;
kscan = <&kscan>;
keys
= <&key_physical_attrs 100 100 000 000 0 0 0>
, <&key_physical_attrs 100 100 100 000 0 0 0>
, <&key_physical_attrs 100 100 200 000 0 0 0>
, <&key_physical_attrs 100 100 300 000 0 0 0>
, <&key_physical_attrs 100 100 400 000 0 0 0>
, <&key_physical_attrs 100 100 500 000 0 0 0>
, <&key_physical_attrs 100 100 600 000 0 0 0>
, <&key_physical_attrs 100 100 700 000 0 0 0>
, <&key_physical_attrs 100 100 800 000 0 0 0>
, <&key_physical_attrs 100 100 900 000 0 0 0>
, <&key_physical_attrs 100 100 1000 000 0 0 0>
, <&key_physical_attrs 175 100 1100 000 0 0 0>
, <&key_physical_attrs 125 100 000 100 0 0 0>
, <&key_physical_attrs 100 100 125 100 0 0 0>
, <&key_physical_attrs 100 100 225 100 0 0 0>
, <&key_physical_attrs 100 100 325 100 0 0 0>
, <&key_physical_attrs 100 100 425 100 0 0 0>
, <&key_physical_attrs 100 100 525 100 0 0 0>
, <&key_physical_attrs 100 100 625 100 0 0 0>
, <&key_physical_attrs 100 100 725 100 0 0 0>
, <&key_physical_attrs 100 100 825 100 0 0 0>
, <&key_physical_attrs 100 100 925 100 0 0 0>
, <&key_physical_attrs 100 100 1025 100 0 0 0>
, <&key_physical_attrs 150 100 1125 100 0 0 0>
, <&key_physical_attrs 175 100 000 200 0 0 0>
, <&key_physical_attrs 100 100 175 200 0 0 0>
, <&key_physical_attrs 100 100 275 200 0 0 0>
, <&key_physical_attrs 100 100 375 200 0 0 0>
, <&key_physical_attrs 100 100 475 200 0 0 0>
, <&key_physical_attrs 100 100 575 200 0 0 0>
, <&key_physical_attrs 100 100 675 200 0 0 0>
, <&key_physical_attrs 100 100 775 200 0 0 0>
, <&key_physical_attrs 100 100 875 200 0 0 0>
, <&key_physical_attrs 100 100 975 200 0 0 0>
, <&key_physical_attrs 100 100 1075 200 0 0 0>
, <&key_physical_attrs 100 100 1175 200 0 0 0>
, <&key_physical_attrs 125 100 000 300 0 0 0>
, <&key_physical_attrs 100 100 125 300 0 0 0>
, <&key_physical_attrs 125 100 225 300 0 0 0>
, <&key_physical_attrs 625 100 350 300 0 0 0>
, <&key_physical_attrs 100 100 975 300 0 0 0>
, <&key_physical_attrs 100 100 1075 300 0 0 0>
, <&key_physical_attrs 100 100 1175 300 0 0 0>
;
};
pos_map {
compatible = "zmk,physical-layout-position-map";
std {
physical-layout = <&standard_layout>;
positions
= < 36 37 38 39 40 41 42 43 44 >;
};
arrows {
physical-layout = <&arrows_layout>;
positions
= < 36 37 38 39 40 42 43 44 41>;
};
southpaw {
physical-layout = <&southpaw_layout>;
positions
= < 36 37 39 40 41 42 43 44 38>;
};
jetvan {
physical-layout = <&jetvan_layout>;
positions
= < 36 37 38 43 39 40 41 42 44>;
};
};
};

View file

@ -20,7 +20,7 @@
// | TAB | Q | W | E | R | T |-------|-------| Y | U | I | O | P | \ | // | TAB | Q | W | E | R | T |-------|-------| Y | U | I | O | P | \ |
// | SHIFT | A | S | D | F | G |-------|-------| H | J | K | L | ; | ' | // | SHIFT | A | S | D | F | G |-------|-------| H | J | K | L | ; | ' |
// | CTRL | Z | X | C | V | B |-------|-------| N | M | , | . | / | ENTER | // | CTRL | Z | X | C | V | B |-------|-------| N | M | , | . | / | ENTER |
// |-------|ADJUST| LCTL | LALT | LGUI | LOWR | SPACE | SPACE | RAIS | LARW | DARW | UARW | RARW |-------| // |-------|ADJUST| LCTL | LALT | LGUI | LOWR | SPACE | SPACE | RAIS | LEFT | DOWN | UARW | RARW |-------|
bindings = < bindings = <

View file

@ -0,0 +1,9 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_POSIX_PRO_MICRO
config ZMK_STUDIO
select UART_NATIVE_POSIX_PORT_1_ENABLE
endif

View file

@ -0,0 +1,5 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_POSIX_PRO_MICRO
def_bool $(shields_list_contains,posix_pro_micro)

View file

@ -0,0 +1,51 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
/*
* Copyright (c) 2020 Pete Johanson
*
* SPDX-License-Identifier: MIT
*/
/delete-node/ &kscan;
&uart1 { status = "okay"; };
/ {
chosen {
zmk,studio-rpc-uart = &uart1;
};
pro_micro: connector {
compatible = "arduino-pro-micro";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map
= <0 0 &gpio0 0 0> /* D0 */
, <1 0 &gpio0 1 0> /* D1 */
, <2 0 &gpio0 2 0> /* D2 */
, <3 0 &gpio0 3 0> /* D3 */
, <4 0 &gpio0 4 0> /* D4/A6 */
, <5 0 &gpio0 5 0> /* D5 */
, <6 0 &gpio0 6 0> /* D6/A7 */
, <7 0 &gpio0 7 0> /* D7 */
, <8 0 &gpio0 8 0> /* D8/A8 */
, <9 0 &gpio0 9 0> /* D9/A9 */
, <10 0 &gpio0 10 0> /* D10/A10 */
, <16 0 &gpio0 11 0> /* D16 */
, <14 0 &gpio0 12 0> /* D14 */
, <15 0 &gpio0 13 0> /* D15 */
, <18 0 &gpio0 14 0> /* D18/A0 */
, <19 0 &gpio0 15 0> /* D19/A1 */
, <20 0 &gpio0 16 0> /* D20/A2 */
, <21 0 &gpio0 17 0> /* D21/A3 */
;
};
};
pro_micro_i2c: &i2c0 {};
pro_micro_spi: &spi0 {};
pro_micro_serial: &uart0 {};

View file

@ -0,0 +1,9 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
if SHIELD_POSIX_SEEED_XIAO
config ZMK_STUDIO
select UART_NATIVE_POSIX_PORT_1_ENABLE
endif

View file

@ -0,0 +1,5 @@
# Copyright (c) 2024 The ZMK Contributors
# SPDX-License-Identifier: MIT
config SHIELD_POSIX_SEEED_XIAO
def_bool $(shields_list_contains,posix_seeed_xiao)

View file

@ -0,0 +1,39 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
/delete-node/ &kscan;
&uart1 { status = "okay"; };
/ {
chosen {
zmk,studio-rpc-uart = &uart1;
};
xiao_d: connector {
compatible = "seeed,xiao-gpio";
#gpio-cells = <2>;
gpio-map-mask = <0xffffffff 0xffffffc0>;
gpio-map-pass-thru = <0 0x3f>;
gpio-map
= <0 0 &gpio0 0 0> /* D0 */
, <1 0 &gpio0 1 0> /* D1 */
, <2 0 &gpio0 2 0> /* D2 */
, <3 0 &gpio0 3 0> /* D3 */
, <4 0 &gpio0 4 0> /* D4 */
, <5 0 &gpio0 5 0> /* D5 */
, <6 0 &gpio0 6 0> /* D6 */
, <7 0 &gpio0 7 0> /* D7 */
, <8 0 &gpio0 8 0> /* D8 */
, <9 0 &gpio0 9 0> /* D9 */
, <10 0 &gpio0 10 0> /* D10 */
;
};
};
xiao_i2c: &i2c0 {};
xiao_spi: &spi0 {};
xiao_serial: &uart0 {};

View file

@ -16,7 +16,7 @@
default_layer { default_layer {
// -------------------------------------------------------------------------------------------------------------------------------- // --------------------------------------------------------------------------------------------------------------------------------
// | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | BKSP | // | ESC | 1 | 2 | 3 | 4 | 5 | --- | 6 | 7 | 8 | 9 | 0 | BSPC |
// | TAB | Q | W | E | R | T | ( | --- | ) | Y | U | I | O | P | - | // | TAB | Q | W | E | R | T | ( | --- | ) | Y | U | I | O | P | - |
// | CTRL | A | S | D | F | G | [ | --- | ] | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | [ | --- | ] | H | J | K | L | ; | ' |
// | SHIFT | Z | X | C | V | B | PG_UP | PG_DOWN | --- | HOME | END | N | M | , | . | / | SHFT(RET) | // | SHIFT | Z | X | C | V | B | PG_UP | PG_DOWN | --- | HOME | END | N | M | , | . | / | SHFT(RET) |

View file

@ -15,7 +15,7 @@
default_layer { default_layer {
// ------------------------------------------------------------------------------------- // -------------------------------------------------------------------------------------
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHFT | Z | X | C | V | B | | N | M | , | . | / | SHFT(RET) | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | SHFT(RET) |
// | ALT | LWR | SPC | RSE | ALT | // | ALT | LWR | SPC | RSE | ALT |
@ -46,7 +46,7 @@
// | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL | // | | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | DEL |
// | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 | // | | - | = | [ | ] | \ | | F1 | F2 | F3 | F4 | F5 | F6 |
// | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 | // | | ESC | GUI | ALT | CAPS| " | | F7 | F8 | F9 | F10 | F11 | F12 |
// | | ADJ | BKSP | | | // | | ADJ | BSPC | | |
bindings = < bindings = <
&trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL &trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL
&trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &trans &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6

View file

@ -24,7 +24,7 @@
default_layer { default_layer {
// ---------------------------------------------------------------------------------------- // ----------------------------------------------------------------------------------------
// | | | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | DEL | // | | | ESC | F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | DEL |
// | TAB | Q | W | E | R | T | Y | U | I | O | P | BKSP | // | TAB | Q | W | E | R | T | Y | U | I | O | P | BSPC |
// | CAPS | A | S | D | F | G | H | J | K | L | ; | RET | // | CAPS | A | S | D | F | G | H | J | K | L | ; | RET |
// | SHFT | Z | X | C | V | B | N | M | , | . | SHFT(/) | // | SHFT | Z | X | C | V | B | N | M | , | . | SHFT(/) |
// | CTRL | GUI | ALT | LOWER(SPACE) | RAISE(SPACE)| ALT | GUI | CTRL(\) | // | CTRL | GUI | ALT | LOWER(SPACE) | RAISE(SPACE)| ALT | GUI | CTRL(\) |

View file

@ -5,12 +5,16 @@
*/ */
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/josefadamcik/sofle.dtsi>
&josefadamcik_sofle_layout {
transform = <&default_transform>;
};
/ { / {
chosen { chosen {
zephyr,display = &oled; zephyr,display = &oled;
zmk,kscan = &kscan0; zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {

View file

@ -6,11 +6,20 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/foostan/corne.dtsi>
&foostan_corne_6col_layout {
transform = <&default_transform>;
};
&foostan_corne_5col_layout {
transform = <&five_column_transform>;
};
/ { / {
chosen { chosen {
zephyr,display = &oled; zephyr,display = &oled;
zmk,matrix-transform = &default_transform;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {

View file

@ -14,7 +14,7 @@
default_layer { default_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | BKSP | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | BSPC |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC | // | SHFT | Z | X | C | V | B | | N | M | , | . | / | ESC |
// | GUI | LWR | SPC | | ENT | RSE | ALT | // | GUI | LWR | SPC | | ENT | RSE | ALT |
@ -27,7 +27,7 @@
}; };
lower_layer { lower_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSP | // | TAB | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BSPC |
// | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | | // | BTCLR| BT1 | BT2 | BT3 | BT4 | BT5 | | LFT | DWN | UP | RGT | | |
// | SHFT | | | | | | | | | | | | | // | SHFT | | | | | | | | | | | | |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |
@ -41,7 +41,7 @@
raise_layer { raise_layer {
// ----------------------------------------------------------------------------------------- // -----------------------------------------------------------------------------------------
// | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BKSP | // | TAB | ! | @ | # | $ | % | | ^ | & | * | ( | ) | BSPC |
// | CTRL | | | | | | | - | = | [ | ] | \ | ` | // | CTRL | | | | | | | - | = | [ | ] | \ | ` |
// | SHFT | | | | | | | _ | + | { | } | "|" | ~ | // | SHFT | | | | | | | _ | + | { | } | "|" | ~ |
// | GUI | | SPC | | ENT | | ALT | // | GUI | | SPC | | ENT | | ALT |

View file

@ -6,11 +6,16 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
#include <layouts/josefadamcik/sofle.dtsi>
&josefadamcik_sofle_layout {
transform = <&default_transform>;
};
/ { / {
chosen { chosen {
zephyr,display = &oled; zephyr,display = &oled;
zmk,matrix-transform = &default_transform;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {

View file

@ -6,11 +6,15 @@
#include <dt-bindings/zmk/matrix_transform.h> #include <dt-bindings/zmk/matrix_transform.h>
/ { #include <layouts/cuddlykeyboards/ferris.dtsi>
&cuddlykeyboards_ferris_layout {
transform = <&default_transform>;
};
/ {
chosen { chosen {
zephyr,display = &oled; zephyr,display = &oled;
zmk,matrix-transform = &default_transform;
}; };
default_transform: keymap_transform_0 { default_transform: keymap_transform_0 {

View file

@ -65,16 +65,16 @@
default_layer { default_layer {
bindings = < bindings = <
&kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P
&kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp QUOT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SQT
&mt LSFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp CMMA &kp DOT &mt LSFT RET &mt LSHFT Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &mt LSHFT RET
&mo 1 &kp LCTL &kp SPC &mo 2 &mo 1 &kp LCTRL &kp SPACE &mo 2
>; >;
}; };
left_layer { left_layer {
bindings = < bindings = <
&kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &kp NUM_6 &kp NUM_7 &kp NUM_8 &kp NUM_9 &kp NUM_0 &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0
&kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQL &kp LBKT &kp RBKT &kp DEL &kp TAB &kp LC(S) &kp DQT &kp PIPE2 &kp HASH &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp DEL
&kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL &kp ESC &kp TILDE &kp NON_US_BSLH &kp NON_US_HASH &kp TILDE2 &kp MINUS &kp GRAVE &kp LBKT &kp RBKT &kp DEL
&mo 1 &kp LGUI &kp RGUI &mo 2 &mo 1 &kp LGUI &kp RGUI &mo 2
>; >;
@ -82,16 +82,16 @@
right_layer { right_layer {
bindings = < bindings = <
&kp BANG &kp ATSN &kp HASH &kp DLLR &kp PRCT &kp CRRT &kp AMPS &kp KMLT &kp LPRN &kp RPRN &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp KP_MULTIPLY &kp LPAR &kp RPAR
&kp HASH &kp QMARK &kp FSLH &kp COLN &kp SCLN &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BKSP &kp HASH &kp QMARK &kp FSLH &kp COLON &kp SEMI &kp MINUS &kp KP_EQUAL &kp LBRC &kp RBRC &kp BSPC
&kp LSFT &kp KPLS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT &kp LSHFT &kp KP_PLUS &kp LBKT &kp RBKT &kp BSLH &kp UNDER &kp LEFT &kp DOWN &kp UP &kp RIGHT
&mo 3 &kp LCTL &kp SPC &mo 2 &mo 3 &kp LCTRL &kp SPACE &mo 2
>; >;
}; };
tri_layer { tri_layer {
bindings = < bindings = <
&kp NUM_1 &kp NUM_2 &kp NUM_3 &kp NUM_4 &kp NUM_5 &trans &trans &trans &trans &trans &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &trans &trans &trans &trans &trans
&kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &trans &kp PG_UP &kp K_VOL_UP &kp K_MUTE &trans
&bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans &bt BT_CLR &bt BT_NXT &bt BT_PRV &kp F6 &kp F7 &trans &kp PG_DN &kp K_VOL_DN &trans &trans
&trans &trans &trans &trans &trans &trans &trans &trans

View file

@ -18,7 +18,7 @@
// | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ |
// | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' | // | CTRL | A | S | D | F | G | | H | J | K | L | ; | ' |
// | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT | // | SHIFT | Z | X | C | V | B | | N | M | , | . | / | SHIFT |
// | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BKSP| | RET | SPC | LBKT | RBKT | LBKT | HOME | END | // | LCTL | LGUI | LALT | GRAV | | EQL | DEL | BSPC| | RET | SPC | LBKT | RBKT | LBKT | HOME | END |
bindings = < bindings = <
&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp MINUS
&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp BSLH

View file

@ -1,41 +1,6 @@
# Building ZMK for the Tidbit # TIDBIT Compatibility Notes
Some general notes/commands for building standard tidbit layouts from the assembly documentation. - The top-left and top-right encoders share the same pins. Install only one, and enable/include EITHER `encoder_1` OR `encoder_1_top_row` in your keymap; not both.
- `encoder_3` cannot be used at the same time as the OLED and/or HT16K33 modules, as it is wired to the same pins.
## Standard "Non Dense" Build - While the HT16K33 hardware is supported by Zephyr, functionality may not have been implemented in ZMK for it.
- `encoder_4` cannot be used at the same time as the TRRS jack, as it is wired to the same pins.
```
west build -p -d build/tidbit/default --board nice_nano -- -DSHIELD=tidbit
```
## Dense "19 keys" Build
```
west build -p -d build/tidbit/19_key --board nice_nano -- -DSHIELD=tidbit_19key
```
## LED Notes
If you built your tidbit without the LEDs _and_ are using a nice!nano board, you'll need to change the following in your local tidbit config or add them to the end of the file.
```
CONFIG_ZMK_RGB_UNDERGLOW=n
CONFIG_WS2812_STRIP=n
```
## Encoder Notes
If you built your tidbit without encoders, you'll need to change the following in your local tidbit config or add them to the end of the file.
```
CONFIG_EC11=n
CONFIG_EC11_TRIGGER_GLOBAL_THREAD=n
```
## OLED Builds
If using an OLED screen, you'll need to change the following in your local tidbit config or add them to the end of the file.
```
CONFIG_ZMK_DISPLAY=y
```

View file

@ -1,4 +0,0 @@
# Enable underglow
CONFIG_ZMK_RGB_UNDERGLOW=y
# Use the STRIP config specific to the LEDs you're using
CONFIG_WS2812_STRIP=y

View file

@ -5,7 +5,11 @@
CONFIG_EC11=y CONFIG_EC11=y
CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
# Enable underglow # Uncomment to enable underglow
#CONFIG_ZMK_RGB_UNDERGLOW=y #CONFIG_ZMK_RGB_UNDERGLOW=y
# Use the STRIP config specific to the LEDs you're using # Use the STRIP config specific to the LEDs you're using
#CONFIG_WS2812_STRIP=y #CONFIG_WS2812_STRIP=y
# Uncomment to enable the display
# Note that an I2C OLED cannot be used at the same time as encoder 3.
#CONFIG_ZMK_DISPLAY=y

View file

@ -1,111 +0,0 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/matrix_transform.h>
/ {
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
diode-direction = "row2col";
row-gpios
= <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
col-gpios
= <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <4>;
rows = <5>;
map = <
RC(0,1) RC(0,2) RC(0,3)
RC(1,0) RC(1,1) RC(1,2) RC(1,3)
RC(2,0) RC(2,1) RC(2,2) RC(2,3)
RC(3,0) RC(3,1) RC(3,2) RC(3,3)
RC(4,0) RC(4,1) RC(4,2) RC(4,3)
>;
};
encoder_1_top_row: encoder_1_top_row {
compatible = "alps,ec11";
a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_1: encoder_1 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_2: encoder_2 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_3: encoder_3 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_4: encoder_4 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
chosen {
zephyr,display = &oled;
zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform;
};
};
&pro_micro_i2c {
status = "okay";
oled: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>;
width = <128>;
height = <32>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <31>;
segment-remap;
com-invdir;
com-sequential;
inversion-on;
prechargep = <0x22>;
};
};

View file

@ -6,20 +6,40 @@
#include <behaviors.dtsi> #include <behaviors.dtsi>
#include <dt-bindings/zmk/bt.h> #include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/outputs.h>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/outputs.h>
&encoder_1_top_row {
/* Enable ONLY ONE of the &encoder_1 nodes. They are wired to the same pins.*/
/*
&encoder_1 {
status = "okay";
};
&encoder_1_top_left {
status = "okay";
};
*/
/*
&encoder_2 {
status = "okay"; status = "okay";
}; };
/ { &encoder_3 {
sensors: sensors { status = "okay";
compatible = "zmk,keymap-sensors"; };
sensors = <&encoder_1_top_row>; */
triggers-per-rotation = <20>;
};
&encoder_4 {
status = "okay";
};
/* Add any encoder(s) you have enabled to the sensors node, separated by spaces. */
&sensors {
sensors = <&encoder_4>;
};
/ {
keymap { keymap {
compatible = "zmk,keymap"; compatible = "zmk,keymap";
@ -27,9 +47,9 @@
bindings = < bindings = <
&kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS &kp KP_NUMLOCK &kp KP_ASTERISK &kp KP_MINUS
&kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS &kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_PLUS
&kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &none &kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_SLASH
&kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &lt 1 KP_ENTER &kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &lt 1 KP_ENTER
&none &kp KP_NUMBER_0 &kp KP_DOT &none &kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER
>; >;
sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>; sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>;
@ -37,10 +57,10 @@
func_layer { func_layer {
bindings = < bindings = <
&none &sys_reset &bootloader &none &sys_reset &bootloader
&out OUT_TOG &out OUT_USB &out OUT_BLE &none &out OUT_TOG &out OUT_USB &out OUT_BLE &none
&bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR &bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR
&bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &tog 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &trans
&kp C_MUTE &none &none &none &kp C_MUTE &none &none &none
>; >;

View file

@ -4,4 +4,127 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include "tidbit.dtsi" #include <dt-bindings/zmk/matrix_transform.h>
/ {
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
diode-direction = "row2col";
wakeup-source;
row-gpios
= <&pro_micro 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
col-gpios
= <&pro_micro 21 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 20 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 19 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
, <&pro_micro 18 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
;
};
default_transform: keymap_transform_0 {
compatible = "zmk,matrix-transform";
columns = <4>;
rows = <5>;
map = <
RC(0,1) RC(0,2) RC(0,3)
RC(1,0) RC(1,1) RC(1,2) RC(1,3)
RC(2,0) RC(2,1) RC(2,2) RC(2,3)
RC(3,0) RC(3,1) RC(3,2) RC(3,3)
RC(4,0) RC(4,1) RC(4,2) RC(4,3)
>;
};
numpad_transform: keymap_transform_1 {
compatible = "zmk,matrix-transform";
columns = <4>;
rows = <5>;
map = <
RC(0,1) RC(0,2) RC(0,3)
RC(1,0) RC(1,1) RC(1,2) RC(1,3)
RC(2,0) RC(2,1) RC(2,2)
RC(3,0) RC(3,1) RC(3,2) RC(3,3)
RC(4,0) RC(4,1) RC(4,2)
>;
};
encoder_1_top_row: encoder_1_top_row {
compatible = "alps,ec11";
a-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_1: encoder_1 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 16 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_2: encoder_2 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_3: encoder_3 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 3 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
encoder_4: encoder_4 {
compatible = "alps,ec11";
a-gpios = <&pro_micro 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
b-gpios = <&pro_micro 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>;
steps = <80>;
status = "disabled";
};
sensors: sensors {
compatible = "zmk,keymap-sensors";
triggers-per-rotation = <20>;
};
chosen {
zephyr,display = &oled;
zmk,kscan = &kscan0;
zmk,matrix-transform = &default_transform;
};
};
&pro_micro_i2c {
status = "okay";
oled: ssd1306@3c {
compatible = "solomon,ssd1306fb";
reg = <0x3c>;
width = <128>;
height = <32>;
segment-offset = <0>;
page-offset = <0>;
display-offset = <0>;
multiplex-ratio = <31>;
segment-remap;
com-invdir;
com-sequential;
inversion-on;
prechargep = <0x22>;
};
};

View file

@ -1,11 +0,0 @@
# Copyright (c) 2020 The ZMK Contributors
# SPDX-License-Identifier: MIT
# Enable Encoders
CONFIG_EC11=y
CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y
# Enable underglow
#CONFIG_ZMK_RGB_UNDERGLOW=y
# Use the STRIP config specific to the LEDs you're using
#CONFIG_WS2812_STRIP=y

View file

@ -1,50 +0,0 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "tidbit.dtsi"
#include <behaviors.dtsi>
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/outputs.h>
&encoder_4 {
status = "okay";
};
/ {
sensors: sensors {
compatible = "zmk,keymap-sensors";
sensors = <&encoder_4>;
};
keymap {
compatible = "zmk,keymap";
default_layer {
bindings = <
&tog 1 &kp KP_NUMLOCK &kp KP_SLASH
&kp KP_NUMBER_7 &kp KP_NUMBER_8 &kp KP_NUMBER_9 &kp KP_ASTERISK
&kp KP_NUMBER_4 &kp KP_NUMBER_5 &kp KP_NUMBER_6 &kp KP_MINUS
&kp KP_NUMBER_1 &kp KP_NUMBER_2 &kp KP_NUMBER_3 &kp KP_PLUS
&kp C_MUTE &kp KP_NUMBER_0 &kp KP_DOT &kp KP_ENTER
>;
sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>;
};
func_layer {
bindings = <
&tog 0 &sys_reset &bootloader
&out OUT_TOG &out OUT_USB &out OUT_BLE &none
&bt BT_SEL 0 &bt BT_PRV &bt BT_NXT &bt BT_CLR
&bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &none
&kp C_MUTE &none &none &none
>;
sensor-bindings = <&inc_dec_kp C_VOLUME_UP C_VOLUME_DOWN>;
};
};
};

View file

@ -1,8 +0,0 @@
/*
* Copyright (c) 2020 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include "tidbit.dtsi"
#include "tidbit_19key.keymap"

View file

@ -4,10 +4,15 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
#if ZMK_BEHAVIOR_OMIT(BL)
/omit-if-no-ref/
#endif
// Behavior can be invoked on peripherals, so name must be <= 8 characters. // Behavior can be invoked on peripherals, so name must be <= 8 characters.
/omit-if-no-ref/ bl: bcklight { bl: bcklight {
compatible = "zmk,behavior-backlight"; compatible = "zmk,behavior-backlight";
#binding-cells = <2>; #binding-cells = <2>;
display-name = "Backlight"; display-name = "Backlight";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ bt: bluetooth { #if ZMK_BEHAVIOR_OMIT(BT)
/omit-if-no-ref/
#endif
bt: bluetooth {
compatible = "zmk,behavior-bluetooth"; compatible = "zmk,behavior-bluetooth";
#binding-cells = <2>; #binding-cells = <2>;
display-name = "Bluetooth"; display-name = "Bluetooth";

View file

@ -4,11 +4,15 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ caps_word: caps_word { #if ZMK_BEHAVIOR_OMIT(CAPS_WORD)
/omit-if-no-ref/
#endif
caps_word: caps_word {
compatible = "zmk,behavior-caps-word"; compatible = "zmk,behavior-caps-word";
#binding-cells = <0>; #binding-cells = <0>;
continue-list = <UNDERSCORE BACKSPACE DELETE>; continue-list = <UNDERSCORE BACKSPACE DELETE>;

View file

@ -4,11 +4,16 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ gresc: grave_escape { #if ZMK_BEHAVIOR_OMIT(GRESC)
/omit-if-no-ref/
#endif
gresc: grave_escape {
compatible = "zmk,behavior-mod-morph"; compatible = "zmk,behavior-mod-morph";
#binding-cells = <0>; #binding-cells = <0>;
bindings = <&kp ESC>, <&kp GRAVE>; bindings = <&kp ESC>, <&kp GRAVE>;

View file

@ -4,10 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/* DEPRECATED: `cp` will be removed in the future */ #if ZMK_BEHAVIOR_OMIT(KP)
/omit-if-no-ref/ cp: kp: key_press { /omit-if-no-ref/
#endif
kp: key_press {
compatible = "zmk,behavior-key-press"; compatible = "zmk,behavior-key-press";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Key Press"; display-name = "Key Press";

View file

@ -4,11 +4,15 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
#include <dt-bindings/zmk/keys.h> #include <dt-bindings/zmk/keys.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ key_repeat: key_repeat { #if ZMK_BEHAVIOR_OMIT(KEY_REPEAT)
/omit-if-no-ref/
#endif
key_repeat: key_repeat {
compatible = "zmk,behavior-key-repeat"; compatible = "zmk,behavior-key-repeat";
#binding-cells = <0>; #binding-cells = <0>;
usage-pages = <HID_USAGE_KEY>; usage-pages = <HID_USAGE_KEY>;

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ kt: key_toggle { #if ZMK_BEHAVIOR_OMIT(KT)
/omit-if-no-ref/
#endif
kt: key_toggle {
compatible = "zmk,behavior-key-toggle"; compatible = "zmk,behavior-key-toggle";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Key Toggle"; display-name = "Key Toggle";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ lt: layer_tap { #if ZMK_BEHAVIOR_OMIT(LT)
/omit-if-no-ref/
#endif
lt: layer_tap {
compatible = "zmk,behavior-hold-tap"; compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>; #binding-cells = <2>;
flavor = "tap-preferred"; flavor = "tap-preferred";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ mt: mod_tap { #if ZMK_BEHAVIOR_OMIT(MT)
/omit-if-no-ref/
#endif
mt: mod_tap {
compatible = "zmk,behavior-hold-tap"; compatible = "zmk,behavior-hold-tap";
#binding-cells = <2>; #binding-cells = <2>;
flavor = "hold-preferred"; flavor = "hold-preferred";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ mo: momentary_layer { #if ZMK_BEHAVIOR_OMIT(MO)
/omit-if-no-ref/
#endif
mo: momentary_layer {
compatible = "zmk,behavior-momentary-layer"; compatible = "zmk,behavior-momentary-layer";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Momentary Layer"; display-name = "Momentary Layer";

View file

@ -1,6 +1,17 @@
/*
* Copyright (c) 2023 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ mkp: mouse_key_press { #if ZMK_BEHAVIOR_OMIT(MKP)
/omit-if-no-ref/
#endif
mkp: mouse_key_press {
compatible = "zmk,behavior-mouse-key-press"; compatible = "zmk,behavior-mouse-key-press";
#binding-cells = <1>; #binding-cells = <1>;
}; };

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ none: none { #if ZMK_BEHAVIOR_OMIT(NONE)
/omit-if-no-ref/
#endif
none: none {
compatible = "zmk,behavior-none"; compatible = "zmk,behavior-none";
#binding-cells = <0>; #binding-cells = <0>;
display-name = "None"; display-name = "None";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ out: outputs { #if ZMK_BEHAVIOR_OMIT(OUT)
/omit-if-no-ref/
#endif
out: outputs {
compatible = "zmk,behavior-outputs"; compatible = "zmk,behavior-outputs";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Output Selection"; display-name = "Output Selection";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ soft_off: z_so_off { #if ZMK_BEHAVIOR_OMIT(SOFT_OFF)
/omit-if-no-ref/
#endif
soft_off: z_so_off {
compatible = "zmk,behavior-soft-off"; compatible = "zmk,behavior-soft-off";
#binding-cells = <0>; #binding-cells = <0>;
split-peripheral-off-on-press; split-peripheral-off-on-press;

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ sk: sticky_key { #if ZMK_BEHAVIOR_OMIT(SK)
/omit-if-no-ref/
#endif
sk: sticky_key {
compatible = "zmk,behavior-sticky-key"; compatible = "zmk,behavior-sticky-key";
#binding-cells = <1>; #binding-cells = <1>;
release-after-ms = <1000>; release-after-ms = <1000>;
@ -14,7 +19,10 @@
ignore-modifiers; ignore-modifiers;
display-name = "Sticky Key"; display-name = "Sticky Key";
}; };
/omit-if-no-ref/ sl: sticky_layer { #if ZMK_BEHAVIOR_OMIT(STICKY_LAYER)
/omit-if-no-ref/
#endif
sl: sticky_layer {
compatible = "zmk,behavior-sticky-key"; compatible = "zmk,behavior-sticky-key";
#binding-cells = <1>; #binding-cells = <1>;
release-after-ms = <1000>; release-after-ms = <1000>;

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ to: to_layer { #if ZMK_BEHAVIOR_OMIT(TO)
/omit-if-no-ref/
#endif
to: to_layer {
compatible = "zmk,behavior-to-layer"; compatible = "zmk,behavior-to-layer";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "To Layer"; display-name = "To Layer";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ tog: toggle_layer { #if ZMK_BEHAVIOR_OMIT(TOG)
/omit-if-no-ref/
#endif
tog: toggle_layer {
compatible = "zmk,behavior-toggle-layer"; compatible = "zmk,behavior-toggle-layer";
#binding-cells = <1>; #binding-cells = <1>;
display-name = "Toggle Layer"; display-name = "Toggle Layer";

View file

@ -4,9 +4,14 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <dt-bindings/zmk/behaviors.h>
/ { / {
behaviors { behaviors {
/omit-if-no-ref/ trans: transparent { #if ZMK_BEHAVIOR_OMIT(TRANS)
/omit-if-no-ref/
#endif
trans: transparent {
compatible = "zmk,behavior-transparent"; compatible = "zmk,behavior-transparent";
#binding-cells = <0>; #binding-cells = <0>;
display-name = "Transparent"; display-name = "Transparent";

View file

@ -0,0 +1,45 @@
#include <physical_layouts.dtsi>
/ {
cuddlykeyboards_ferris_layout: cuddlykeyboards_ferris_layout {
compatible = "zmk,physical-layout";
display-name = "Default";
keys // w h x y rot rx ry
= <&key_physical_attrs 100 100 0 95 0 0 0>
, <&key_physical_attrs 100 100 100 32 0 0 0>
, <&key_physical_attrs 100 100 200 0 0 0 0>
, <&key_physical_attrs 100 100 300 28 0 0 0>
, <&key_physical_attrs 100 100 400 42 0 0 0>
, <&key_physical_attrs 100 100 700 42 0 0 0>
, <&key_physical_attrs 100 100 800 28 0 0 0>
, <&key_physical_attrs 100 100 900 0 0 0 0>
, <&key_physical_attrs 100 100 1000 32 0 0 0>
, <&key_physical_attrs 100 100 1100 95 0 0 0>
, <&key_physical_attrs 100 100 0 195 0 0 0>
, <&key_physical_attrs 100 100 100 132 0 0 0>
, <&key_physical_attrs 100 100 200 100 0 0 0>
, <&key_physical_attrs 100 100 300 129 0 0 0>
, <&key_physical_attrs 100 100 400 142 0 0 0>
, <&key_physical_attrs 100 100 700 142 0 0 0>
, <&key_physical_attrs 100 100 800 129 0 0 0>
, <&key_physical_attrs 100 100 900 100 0 0 0>
, <&key_physical_attrs 100 100 1000 132 0 0 0>
, <&key_physical_attrs 100 100 1100 195 0 0 0>
, <&key_physical_attrs 100 100 0 295 0 0 0>
, <&key_physical_attrs 100 100 100 231 0 0 0>
, <&key_physical_attrs 100 100 200 200 0 0 0>
, <&key_physical_attrs 100 100 300 229 0 0 0>
, <&key_physical_attrs 100 100 400 242 0 0 0>
, <&key_physical_attrs 100 100 700 242 0 0 0>
, <&key_physical_attrs 100 100 800 229 0 0 0>
, <&key_physical_attrs 100 100 900 200 0 0 0>
, <&key_physical_attrs 100 100 1000 231 0 0 0>
, <&key_physical_attrs 100 100 1100 295 0 0 0>
, <&key_physical_attrs 100 100 330 355 1500 430 455>
, <&key_physical_attrs 100 100 430 355 3000 430 455>
, <&key_physical_attrs 100 100 670 355 (-3000) 770 455>
, <&key_physical_attrs 100 100 770 355 (-1500) 770 455>
;
};
};

View file

@ -0,0 +1,121 @@
#include <physical_layouts.dtsi>
/ {
foostan_corne_6col_layout: foostan_corne_6col_layout {
compatible = "zmk,physical-layout";
display-name = "6-column";
keys // w h x y rot rx ry
= <&key_physical_attrs 100 100 0 37 0 0 0>
, <&key_physical_attrs 100 100 100 37 0 0 0>
, <&key_physical_attrs 100 100 200 12 0 0 0>
, <&key_physical_attrs 100 100 300 0 0 0 0>
, <&key_physical_attrs 100 100 400 12 0 0 0>
, <&key_physical_attrs 100 100 500 24 0 0 0>
, <&key_physical_attrs 100 100 800 24 0 0 0>
, <&key_physical_attrs 100 100 900 12 0 0 0>
, <&key_physical_attrs 100 100 1000 0 0 0 0>
, <&key_physical_attrs 100 100 1100 12 0 0 0>
, <&key_physical_attrs 100 100 1200 37 0 0 0>
, <&key_physical_attrs 100 100 1300 37 0 0 0>
, <&key_physical_attrs 100 100 0 137 0 0 0>
, <&key_physical_attrs 100 100 100 137 0 0 0>
, <&key_physical_attrs 100 100 200 112 0 0 0>
, <&key_physical_attrs 100 100 300 100 0 0 0>
, <&key_physical_attrs 100 100 400 112 0 0 0>
, <&key_physical_attrs 100 100 500 124 0 0 0>
, <&key_physical_attrs 100 100 800 124 0 0 0>
, <&key_physical_attrs 100 100 900 112 0 0 0>
, <&key_physical_attrs 100 100 1000 100 0 0 0>
, <&key_physical_attrs 100 100 1100 112 0 0 0>
, <&key_physical_attrs 100 100 1200 137 0 0 0>
, <&key_physical_attrs 100 100 1300 137 0 0 0>
, <&key_physical_attrs 100 100 0 237 0 0 0>
, <&key_physical_attrs 100 100 100 237 0 0 0>
, <&key_physical_attrs 100 100 200 212 0 0 0>
, <&key_physical_attrs 100 100 300 200 0 0 0>
, <&key_physical_attrs 100 100 400 212 0 0 0>
, <&key_physical_attrs 100 100 500 224 0 0 0>
, <&key_physical_attrs 100 100 800 224 0 0 0>
, <&key_physical_attrs 100 100 900 212 0 0 0>
, <&key_physical_attrs 100 100 1000 200 0 0 0>
, <&key_physical_attrs 100 100 1100 212 0 0 0>
, <&key_physical_attrs 100 100 1200 237 0 0 0>
, <&key_physical_attrs 100 100 1300 237 0 0 0>
, <&key_physical_attrs 100 100 350 312 0 0 0>
, <&key_physical_attrs 100 100 450 312 1200 450 412>
, <&key_physical_attrs 100 150 548 283 2400 548 433>
, <&key_physical_attrs 100 150 752 283 (-2400) 852 433>
, <&key_physical_attrs 100 100 850 312 (-1200) 950 412>
, <&key_physical_attrs 100 100 950 312 0 0 0>
;
};
foostan_corne_5col_layout: foostan_corne_5col_layout {
compatible = "zmk,physical-layout";
display-name = "5-column";
keys // w h x y rot rx ry
= <&key_physical_attrs 100 100 0 37 0 0 0>
, <&key_physical_attrs 100 100 100 12 0 0 0>
, <&key_physical_attrs 100 100 200 0 0 0 0>
, <&key_physical_attrs 100 100 300 12 0 0 0>
, <&key_physical_attrs 100 100 400 24 0 0 0>
, <&key_physical_attrs 100 100 700 24 0 0 0>
, <&key_physical_attrs 100 100 800 12 0 0 0>
, <&key_physical_attrs 100 100 900 0 0 0 0>
, <&key_physical_attrs 100 100 1000 12 0 0 0>
, <&key_physical_attrs 100 100 1100 37 0 0 0>
, <&key_physical_attrs 100 100 0 137 0 0 0>
, <&key_physical_attrs 100 100 100 112 0 0 0>
, <&key_physical_attrs 100 100 200 100 0 0 0>
, <&key_physical_attrs 100 100 300 112 0 0 0>
, <&key_physical_attrs 100 100 400 124 0 0 0>
, <&key_physical_attrs 100 100 700 124 0 0 0>
, <&key_physical_attrs 100 100 800 112 0 0 0>
, <&key_physical_attrs 100 100 900 100 0 0 0>
, <&key_physical_attrs 100 100 1000 112 0 0 0>
, <&key_physical_attrs 100 100 1100 137 0 0 0>
, <&key_physical_attrs 100 100 0 237 0 0 0>
, <&key_physical_attrs 100 100 100 212 0 0 0>
, <&key_physical_attrs 100 100 200 200 0 0 0>
, <&key_physical_attrs 100 100 300 212 0 0 0>
, <&key_physical_attrs 100 100 400 224 0 0 0>
, <&key_physical_attrs 100 100 700 224 0 0 0>
, <&key_physical_attrs 100 100 800 212 0 0 0>
, <&key_physical_attrs 100 100 900 200 0 0 0>
, <&key_physical_attrs 100 100 1000 212 0 0 0>
, <&key_physical_attrs 100 100 1100 237 0 0 0>
, <&key_physical_attrs 100 100 250 312 0 0 0>
, <&key_physical_attrs 100 100 350 312 1200 350 412>
, <&key_physical_attrs 100 150 448 283 2400 448 433>
, <&key_physical_attrs 100 150 652 283 (-2400) 752 433>
, <&key_physical_attrs 100 100 750 312 (-1200) 850 412>
, <&key_physical_attrs 100 100 850 312 0 0 0>
;
};
foostan_corne_position_map {
compatible = "zmk,physical-layout-position-map";
complete;
twelve {
physical-layout = <&foostan_corne_6col_layout>;
positions
= < 0 1 2 3 4 5 6 7 8 9 10 11>
, <12 13 14 15 16 17 18 19 20 21 22 23>
, <24 25 26 27 28 29 30 31 32 33 34 35>
, < 36 37 38 39 40 41 >;
};
ten {
physical-layout = <&foostan_corne_5col_layout>;
positions
= <36 0 1 2 3 4 5 6 7 8 9 37>
, <38 10 11 12 13 14 15 16 17 18 19 39>
, <40 20 21 22 23 24 25 26 27 28 29 41>
, < 30 31 32 33 34 35 >;
};
};
};

View file

@ -0,0 +1,71 @@
#include <physical_layouts.dtsi>
/ {
josefadamcik_sofle_layout: josefadamcik_sofle_layout {
compatible = "zmk,physical-layout";
display-name = "Sofle";
keys // w h x y rot rx ry
= <&key_physical_attrs 100 100 0 37 0 0 0>
, <&key_physical_attrs 100 100 100 37 0 0 0>
, <&key_physical_attrs 100 100 200 12 0 0 0>
, <&key_physical_attrs 100 100 300 0 0 0 0>
, <&key_physical_attrs 100 100 400 12 0 0 0>
, <&key_physical_attrs 100 100 500 24 0 0 0>
, <&key_physical_attrs 100 100 900 24 0 0 0>
, <&key_physical_attrs 100 100 1000 12 0 0 0>
, <&key_physical_attrs 100 100 1100 0 0 0 0>
, <&key_physical_attrs 100 100 1200 12 0 0 0>
, <&key_physical_attrs 100 100 1300 37 0 0 0>
, <&key_physical_attrs 100 100 1400 37 0 0 0>
, <&key_physical_attrs 100 100 0 137 0 0 0>
, <&key_physical_attrs 100 100 100 137 0 0 0>
, <&key_physical_attrs 100 100 200 112 0 0 0>
, <&key_physical_attrs 100 100 300 100 0 0 0>
, <&key_physical_attrs 100 100 400 112 0 0 0>
, <&key_physical_attrs 100 100 500 124 0 0 0>
, <&key_physical_attrs 100 100 900 124 0 0 0>
, <&key_physical_attrs 100 100 1000 112 0 0 0>
, <&key_physical_attrs 100 100 1100 100 0 0 0>
, <&key_physical_attrs 100 100 1200 112 0 0 0>
, <&key_physical_attrs 100 100 1300 137 0 0 0>
, <&key_physical_attrs 100 100 1400 137 0 0 0>
, <&key_physical_attrs 100 100 0 237 0 0 0>
, <&key_physical_attrs 100 100 100 237 0 0 0>
, <&key_physical_attrs 100 100 200 212 0 0 0>
, <&key_physical_attrs 100 100 300 200 0 0 0>
, <&key_physical_attrs 100 100 400 212 0 0 0>
, <&key_physical_attrs 100 100 500 224 0 0 0>
, <&key_physical_attrs 100 100 900 224 0 0 0>
, <&key_physical_attrs 100 100 1000 212 0 0 0>
, <&key_physical_attrs 100 100 1100 200 0 0 0>
, <&key_physical_attrs 100 100 1200 212 0 0 0>
, <&key_physical_attrs 100 100 1300 237 0 0 0>
, <&key_physical_attrs 100 100 1400 237 0 0 0>
, <&key_physical_attrs 100 100 0 337 0 0 0>
, <&key_physical_attrs 100 100 100 337 0 0 0>
, <&key_physical_attrs 100 100 200 312 0 0 0>
, <&key_physical_attrs 100 100 300 300 0 0 0>
, <&key_physical_attrs 100 100 400 312 0 0 0>
, <&key_physical_attrs 100 100 500 324 0 0 0>
, <&key_physical_attrs 100 100 600 274 0 0 0>
, <&key_physical_attrs 100 100 800 274 0 0 0>
, <&key_physical_attrs 100 100 900 324 0 0 0>
, <&key_physical_attrs 100 100 1000 312 0 0 0>
, <&key_physical_attrs 100 100 1100 300 0 0 0>
, <&key_physical_attrs 100 100 1200 312 0 0 0>
, <&key_physical_attrs 100 100 1300 337 0 0 0>
, <&key_physical_attrs 100 100 1400 337 0 0 0>
, <&key_physical_attrs 100 100 175 437 0 0 0>
, <&key_physical_attrs 100 100 275 412 0 0 0>
, <&key_physical_attrs 100 100 375 412 0 0 0>
, <&key_physical_attrs 100 100 490 412 1200 490 412>
, <&key_physical_attrs 100 150 600 383 2400 600 433>
, <&key_physical_attrs 100 150 800 383 (-2400) 900 433>
, <&key_physical_attrs 100 100 910 412 (-1200) 1010 412>
, <&key_physical_attrs 100 100 1025 412 0 0 0>
, <&key_physical_attrs 100 100 1125 412 0 0 0>
, <&key_physical_attrs 100 100 1225 437 0 0 0>
;
};
};

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#define ZMK_BEHAVIOR_OMIT(_name) \
!(defined(ZMK_BEHAVIORS_KEEP_##_name) || \
(defined(ZMK_BEHAVIORS_KEEP_ALL) && !defined(ZMK_BEHAVIORS_OMIT_##_name)))

View file

@ -0,0 +1,9 @@
/*
* Copyright (c) 2024 The ZMK Contributors
*
* SPDX-License-Identifier: MIT
*/
#include <zephyr/linker/linker-defs.h>
ITERABLE_SECTION_ROM(zmk_rpc_subsystem_settings_reset, 4)

View file

@ -12,17 +12,63 @@
#define ZMK_KEYMAP_LAYERS_LEN \ #define ZMK_KEYMAP_LAYERS_LEN \
(DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0) (DT_FOREACH_CHILD(DT_INST(0, zmk_keymap), ZMK_LAYER_CHILD_LEN_PLUS_ONE) 0)
/**
* @brief A layer ID is a stable identifier to refer to a layer, regardless of ordering.
*/
typedef uint8_t zmk_keymap_layer_id_t;
/**
* @brief A way to return/reference a missing or invalid layer ID
*/
#define ZMK_KEYMAP_LAYER_ID_INVAL UINT8_MAX
/**
* @brief A layer index is a identifier to refer layer at a particular position in the order.
*/
typedef uint8_t zmk_keymap_layer_index_t;
typedef uint32_t zmk_keymap_layers_state_t; typedef uint32_t zmk_keymap_layers_state_t;
uint8_t zmk_keymap_layer_default(void); zmk_keymap_layer_id_t zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t layer_index);
zmk_keymap_layer_id_t zmk_keymap_layer_default(void);
zmk_keymap_layers_state_t zmk_keymap_layer_state(void); zmk_keymap_layers_state_t zmk_keymap_layer_state(void);
bool zmk_keymap_layer_active(uint8_t layer); bool zmk_keymap_layer_active(zmk_keymap_layer_id_t layer);
uint8_t zmk_keymap_highest_layer_active(void); zmk_keymap_layer_id_t zmk_keymap_highest_layer_active(void);
int zmk_keymap_layer_activate(uint8_t layer); int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer);
int zmk_keymap_layer_deactivate(uint8_t layer); int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer);
int zmk_keymap_layer_toggle(uint8_t layer); int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer);
int zmk_keymap_layer_to(uint8_t layer); int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer);
const char *zmk_keymap_layer_name(uint8_t layer); const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer);
const struct zmk_behavior_binding *zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer,
uint8_t binding_idx);
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer, uint8_t binding_idx,
const struct zmk_behavior_binding binding);
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
int zmk_keymap_add_layer(void);
int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index);
int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index);
int zmk_keymap_move_layer(zmk_keymap_layer_index_t start_idx, zmk_keymap_layer_index_t dest_idx);
int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size);
#endif
/**
* @brief Check if there are any unsaved keymap changes.
*
* @retval 0 if there are no changes.
* @retval 1 if there are changes.
*/
int zmk_keymap_check_unsaved_changes(void);
int zmk_keymap_save_changes(void);
int zmk_keymap_discard_changes(void);
int zmk_keymap_reset_settings(void);
int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pressed, int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pressed,
int64_t timestamp); int64_t timestamp);

View file

@ -40,4 +40,5 @@ int zmk_physical_layouts_check_unsaved_selection(void);
int zmk_physical_layouts_save_selected(void); int zmk_physical_layouts_save_selected(void);
int zmk_physical_layouts_revert_selected(void); int zmk_physical_layouts_revert_selected(void);
int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, uint32_t *map); int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, size_t map_size,
uint32_t map[map_size]);

View file

@ -56,6 +56,12 @@ struct zmk_rpc_subsystem_handler {
enum zmk_studio_rpc_handler_security security; enum zmk_studio_rpc_handler_security security;
}; };
typedef int (*zmk_rpc_subsystem_settings_reset_func)(void);
struct zmk_rpc_subsystem_settings_reset {
zmk_rpc_subsystem_settings_reset_func callback;
};
/** /**
* @brief Generate a "meta" subsystem response indicating an "empty" response to an RPC request. * @brief Generate a "meta" subsystem response indicating an "empty" response to an RPC request.
*/ */
@ -103,6 +109,14 @@ struct zmk_rpc_subsystem_handler {
.security = _security, \ .security = _security, \
}; };
#define ZMK_RPC_SUBSYSTEM_SETTINGS_RESET(prefix, _callback) \
STRUCT_SECTION_ITERABLE(zmk_rpc_subsystem_settings_reset, _##prefix##_settings_reset) = { \
.callback = _callback, \
};
#define ZMK_RPC_SUBSYSTEM_SETTINGS_RESET_FOREACH(_var) \
STRUCT_SECTION_FOREACH(zmk_rpc_subsystem_settings_reset, _var)
/** /**
* @brief Create a zmk_studio_Notification struct for the given subsystem and type, including * @brief Create a zmk_studio_Notification struct for the given subsystem and type, including
initialization of the inner fields. initialization of the inner fields.

View file

@ -2,11 +2,11 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
"""Test runner for ZMK.""" """Test runner for ZMK."""
import os
import subprocess import subprocess
from pathlib import Path
from west.commands import WestCommand
from west import log # use this for user output from west import log # use this for user output
from west.commands import WestCommand
class Test(WestCommand): class Test(WestCommand):
@ -17,6 +17,8 @@ class Test(WestCommand):
description="Run the ZMK testsuite.", description="Run the ZMK testsuite.",
) )
self.appdir = Path(__file__).resolve().parents[2]
def do_add_parser(self, parser_adder): def do_add_parser(self, parser_adder):
parser = parser_adder.add_parser( parser = parser_adder.add_parser(
self.name, self.name,
@ -34,8 +36,7 @@ class Test(WestCommand):
def do_run(self, args, unknown_args): def do_run(self, args, unknown_args):
# the run-test script assumes the app directory is the current dir. # the run-test script assumes the app directory is the current dir.
os.chdir(f"{self.topdir}/app")
completed_process = subprocess.run( completed_process = subprocess.run(
[f"{self.topdir}/app/run-test.sh", args.test_path] ["./run-test.sh", args.test_path], cwd=self.appdir
) )
exit(completed_process.returncode) exit(completed_process.returncode)

View file

@ -3,5 +3,6 @@
name: studio-rpc-usb-uart name: studio-rpc-usb-uart
append: append:
DTS_EXTRA_CPPFLAGS: -DZMK_BEHAVIORS_KEEP_ALL
EXTRA_DTC_OVERLAY_FILE: studio-rpc-usb-uart.overlay EXTRA_DTC_OVERLAY_FILE: studio-rpc-usb-uart.overlay
EXTRA_CONF_FILE: studio-rpc-usb-uart.conf EXTRA_CONF_FILE: studio-rpc-usb-uart.conf

View file

@ -68,7 +68,7 @@ static const struct behavior_parameter_value_metadata one_arg_p2_values[] = {
.range = .range =
{ {
.min = 0, .min = 0,
.max = 255, .max = 100,
}, },
}, },
}; };

View file

@ -659,7 +659,7 @@ static int zmk_ble_complete_startup(void) {
char setting_name[15]; char setting_name[15];
sprintf(setting_name, "ble/profiles/%d", i); sprintf(setting_name, "ble/profiles/%d", i);
err = settings_delete(setting_name); int err = settings_delete(setting_name);
if (err) { if (err) {
LOG_ERR("Failed to delete setting: %d", err); LOG_ERR("Failed to delete setting: %d", err);
} }

View file

@ -6,10 +6,12 @@
#include <drivers/behavior.h> #include <drivers/behavior.h>
#include <zephyr/sys/util.h> #include <zephyr/sys/util.h>
#include <zephyr/settings/settings.h>
#include <zephyr/bluetooth/bluetooth.h> #include <zephyr/bluetooth/bluetooth.h>
#include <zephyr/logging/log.h> #include <zephyr/logging/log.h>
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/stdlib.h>
#include <zmk/behavior.h> #include <zmk/behavior.h>
#include <zmk/keymap.h> #include <zmk/keymap.h>
#include <zmk/matrix.h> #include <zmk/matrix.h>
@ -27,7 +29,7 @@ LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#include <zmk/events/sensor_event.h> #include <zmk/events/sensor_event.h>
static zmk_keymap_layers_state_t _zmk_keymap_layer_state = 0; static zmk_keymap_layers_state_t _zmk_keymap_layer_state = 0;
static uint8_t _zmk_keymap_layer_default = 0; static zmk_keymap_layer_id_t _zmk_keymap_layer_default = 0;
#define DT_DRV_COMPAT zmk_keymap #define DT_DRV_COMPAT zmk_keymap
@ -38,7 +40,11 @@ static uint8_t _zmk_keymap_layer_default = 0;
#endif #endif
#define TRANSFORMED_LAYER(node) \ #define TRANSFORMED_LAYER(node) \
{ LISTIFY(DT_PROP_LEN(node, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), node) } { \
COND_CODE_1( \
DT_NODE_HAS_PROP(node, bindings), \
(LISTIFY(DT_PROP_LEN(node, bindings), ZMK_KEYMAP_EXTRACT_BINDING, (, ), node)), ()) \
}
#if ZMK_KEYMAP_HAS_SENSORS #if ZMK_KEYMAP_HAS_SENSORS
#define _TRANSFORM_SENSOR_ENTRY(idx, layer) \ #define _TRANSFORM_SENSOR_ENTRY(idx, layer) \
@ -58,7 +64,7 @@ static uint8_t _zmk_keymap_layer_default = 0;
#endif /* ZMK_KEYMAP_HAS_SENSORS */ #endif /* ZMK_KEYMAP_HAS_SENSORS */
#define LAYER_NAME(node) DT_PROP_OR(node, display_name, DT_PROP_OR(node, label, NULL)) #define LAYER_NAME(node) DT_PROP_OR(node, display_name, DT_PROP_OR(node, label, ""))
// State // State
@ -67,12 +73,36 @@ static uint8_t _zmk_keymap_layer_default = 0;
// still send the release event to the behavior in that layer also. // still send the release event to the behavior in that layer also.
static uint32_t zmk_keymap_active_behavior_layer[ZMK_KEYMAP_LEN]; static uint32_t zmk_keymap_active_behavior_layer[ZMK_KEYMAP_LEN];
static struct zmk_behavior_binding zmk_keymap[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { #if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))};
static uint8_t keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN];
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
#define KEYMAP_VAR(_name, _opts) \
static _opts struct zmk_behavior_binding _name[ZMK_KEYMAP_LAYERS_LEN][ZMK_KEYMAP_LEN] = { \
COND_CODE_1(IS_ENABLED(CONFIG_ZMK_STUDIO), \
(DT_INST_FOREACH_CHILD_SEP(0, TRANSFORMED_LAYER, (, ))), \
(DT_INST_FOREACH_CHILD_STATUS_OKAY_SEP(0, TRANSFORMED_LAYER, (, ))))};
KEYMAP_VAR(zmk_keymap, )
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
KEYMAP_VAR(zmk_stock_keymap, const)
static char zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN][CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN] = {
DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))};
static uint32_t changed_layer_names = 0;
#else
static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = { static const char *zmk_keymap_layer_names[ZMK_KEYMAP_LAYERS_LEN] = {
DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))}; DT_INST_FOREACH_CHILD_SEP(0, LAYER_NAME, (, ))};
#endif
#if ZMK_KEYMAP_HAS_SENSORS #if ZMK_KEYMAP_HAS_SENSORS
static struct zmk_behavior_binding static struct zmk_behavior_binding
@ -81,23 +111,50 @@ static struct zmk_behavior_binding
#endif /* ZMK_KEYMAP_HAS_SENSORS */ #endif /* ZMK_KEYMAP_HAS_SENSORS */
static inline int set_layer_state(uint8_t layer, bool state) { #define ASSERT_LAYER_VAL(_layer, _fail_ret) \
if ((_layer) >= ZMK_KEYMAP_LAYERS_LEN) { \
return (_fail_ret); \
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
uint8_t map_layer_id_to_index(zmk_keymap_layer_id_t layer_id) {
for (uint8_t i = 0; i < ZMK_KEYMAP_LAYERS_LEN; i++) {
if (keymap_layer_orders[i] == layer_id) {
return i;
}
}
return ZMK_KEYMAP_LAYER_ID_INVAL;
}
#define LAYER_INDEX_TO_ID(_layer) keymap_layer_orders[_layer]
#define LAYER_ID_TO_INDEX(_layer) map_layer_id_to_index(_layer)
#else
#define LAYER_INDEX_TO_ID(_layer) _layer
#define LAYER_ID_TO_INDEX(_layer) _layer
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
static inline int set_layer_state(zmk_keymap_layer_id_t layer_id, bool state) {
int ret = 0; int ret = 0;
if (layer >= ZMK_KEYMAP_LAYERS_LEN) { if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) {
return -EINVAL; return -EINVAL;
} }
// Default layer should *always* remain active // Default layer should *always* remain active
if (layer == _zmk_keymap_layer_default && !state) { if (layer_id == _zmk_keymap_layer_default && !state) {
return 0; return 0;
} }
zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state; zmk_keymap_layers_state_t old_state = _zmk_keymap_layer_state;
WRITE_BIT(_zmk_keymap_layer_state, layer, state); WRITE_BIT(_zmk_keymap_layer_state, layer_id, state);
// Don't send state changes unless there was an actual change // Don't send state changes unless there was an actual change
if (old_state != _zmk_keymap_layer_state) { if (old_state != _zmk_keymap_layer_state) {
LOG_DBG("layer_changed: layer %d state %d", layer, state); LOG_DBG("layer_changed: layer %d state %d", layer_id, state);
ret = raise_layer_state_changed(layer, state); ret = raise_layer_state_changed(layer_id, state);
if (ret < 0) { if (ret < 0) {
LOG_WRN("Failed to raise layer state changed (%d)", ret); LOG_WRN("Failed to raise layer state changed (%d)", ret);
} }
@ -106,21 +163,28 @@ static inline int set_layer_state(uint8_t layer, bool state) {
return ret; return ret;
} }
uint8_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_default; } zmk_keymap_layer_id_t zmk_keymap_layer_index_to_id(zmk_keymap_layer_index_t layer_index) {
ASSERT_LAYER_VAL(layer_index, UINT8_MAX);
return LAYER_INDEX_TO_ID(layer_index);
}
zmk_keymap_layer_id_t zmk_keymap_layer_default(void) { return _zmk_keymap_layer_default; }
zmk_keymap_layers_state_t zmk_keymap_layer_state(void) { return _zmk_keymap_layer_state; } zmk_keymap_layers_state_t zmk_keymap_layer_state(void) { return _zmk_keymap_layer_state; }
bool zmk_keymap_layer_active_with_state(uint8_t layer, zmk_keymap_layers_state_t state_to_test) { bool zmk_keymap_layer_active_with_state(zmk_keymap_layer_id_t layer,
zmk_keymap_layers_state_t state_to_test) {
// The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody // The default layer is assumed to be ALWAYS ACTIVE so we include an || here to ensure nobody
// breaks up that assumption by accident // breaks up that assumption by accident
return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default; return (state_to_test & (BIT(layer))) == (BIT(layer)) || layer == _zmk_keymap_layer_default;
}; };
bool zmk_keymap_layer_active(uint8_t layer) { bool zmk_keymap_layer_active(zmk_keymap_layer_id_t layer) {
return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state); return zmk_keymap_layer_active_with_state(layer, _zmk_keymap_layer_state);
}; };
uint8_t zmk_keymap_highest_layer_active(void) { zmk_keymap_layer_id_t zmk_keymap_highest_layer_active(void) {
for (uint8_t layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer > 0; layer--) { for (uint8_t layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer > 0; layer--) {
if (zmk_keymap_layer_active(layer)) { if (zmk_keymap_layer_active(layer)) {
return layer; return layer;
@ -129,11 +193,13 @@ uint8_t zmk_keymap_highest_layer_active(void) {
return zmk_keymap_layer_default(); return zmk_keymap_layer_default();
} }
int zmk_keymap_layer_activate(uint8_t layer) { return set_layer_state(layer, true); }; int zmk_keymap_layer_activate(zmk_keymap_layer_id_t layer) { return set_layer_state(layer, true); };
int zmk_keymap_layer_deactivate(uint8_t layer) { return set_layer_state(layer, false); }; int zmk_keymap_layer_deactivate(zmk_keymap_layer_id_t layer) {
return set_layer_state(layer, false);
};
int zmk_keymap_layer_toggle(uint8_t layer) { int zmk_keymap_layer_toggle(zmk_keymap_layer_id_t layer) {
if (zmk_keymap_layer_active(layer)) { if (zmk_keymap_layer_active(layer)) {
return zmk_keymap_layer_deactivate(layer); return zmk_keymap_layer_deactivate(layer);
} }
@ -141,7 +207,7 @@ int zmk_keymap_layer_toggle(uint8_t layer) {
return zmk_keymap_layer_activate(layer); return zmk_keymap_layer_activate(layer);
}; };
int zmk_keymap_layer_to(uint8_t layer) { int zmk_keymap_layer_to(zmk_keymap_layer_id_t layer) {
for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) { for (int i = ZMK_KEYMAP_LAYERS_LEN - 1; i >= 0; i--) {
zmk_keymap_layer_deactivate(i); zmk_keymap_layer_deactivate(i);
} }
@ -151,18 +217,365 @@ int zmk_keymap_layer_to(uint8_t layer) {
return 0; return 0;
} }
bool is_active_layer(uint8_t layer, zmk_keymap_layers_state_t layer_state) { const char *zmk_keymap_layer_name(zmk_keymap_layer_id_t layer_id) {
return (layer_state & BIT(layer)) == BIT(layer) || layer == _zmk_keymap_layer_default; ASSERT_LAYER_VAL(layer_id, NULL)
return zmk_keymap_layer_names[layer_id];
} }
const char *zmk_keymap_layer_name(uint8_t layer) { const struct zmk_behavior_binding *
if (layer >= ZMK_KEYMAP_LAYERS_LEN) { zmk_keymap_get_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx) {
if (binding_idx >= ZMK_KEYMAP_LEN) {
return NULL; return NULL;
} }
return zmk_keymap_layer_names[layer]; ASSERT_LAYER_VAL(layer_id, NULL)
return &zmk_keymap[layer_id][binding_idx];
} }
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
#define PENDING_ARRAY_SIZE DIV_ROUND_UP(ZMK_KEYMAP_LEN, 8)
static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE];
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
int zmk_keymap_set_layer_binding_at_idx(zmk_keymap_layer_id_t layer_id, uint8_t binding_idx,
struct zmk_behavior_binding binding) {
if (binding_idx >= ZMK_KEYMAP_LEN) {
return -EINVAL;
}
ASSERT_LAYER_VAL(layer_id, -EINVAL)
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
uint8_t *pending = zmk_keymap_layer_pending_changes[layer_id];
WRITE_BIT(pending[binding_idx / 8], binding_idx % 8, 1);
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
// TODO: Need a mutex to protect access to the keymap data?
memcpy(&zmk_keymap[layer_id][binding_idx], &binding, sizeof(binding));
return 0;
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
static uint8_t settings_layer_orders[ZMK_KEYMAP_LAYERS_LEN];
#endif
int zmk_keymap_move_layer(zmk_keymap_layer_index_t start_idx, zmk_keymap_layer_index_t dest_idx) {
ASSERT_LAYER_VAL(start_idx, -EINVAL)
ASSERT_LAYER_VAL(dest_idx, -EINVAL)
if (start_idx == dest_idx) {
return 0;
} else if (dest_idx > start_idx) {
uint8_t val = keymap_layer_orders[start_idx];
for (int i = start_idx; i < dest_idx; i++) {
keymap_layer_orders[i] = keymap_layer_orders[i + 1];
}
keymap_layer_orders[dest_idx] = val;
} else {
uint8_t val = keymap_layer_orders[start_idx];
for (int i = start_idx; i > dest_idx; i--) {
keymap_layer_orders[i] = keymap_layer_orders[i - 1];
}
keymap_layer_orders[dest_idx] = val;
}
return 0;
}
int zmk_keymap_add_layer(void) {
uint32_t seen_layer_ids = 0;
LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order");
for (int index = 0; index < ZMK_KEYMAP_LAYERS_LEN; index++) {
zmk_keymap_layer_id_t id = LAYER_INDEX_TO_ID(index);
if (id != ZMK_KEYMAP_LAYER_ID_INVAL) {
WRITE_BIT(seen_layer_ids, id, 1);
continue;
}
for (int candidate_id = 0; candidate_id < ZMK_KEYMAP_LAYERS_LEN; candidate_id++) {
if (!(seen_layer_ids & BIT(candidate_id))) {
keymap_layer_orders[index] = candidate_id;
return index;
}
}
}
return -ENOSPC;
}
int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index) {
ASSERT_LAYER_VAL(index, -EINVAL);
if (keymap_layer_orders[index] == ZMK_KEYMAP_LAYER_ID_INVAL) {
return -EINVAL;
}
LOG_DBG("Removing layer index %d which is ID %d", index, keymap_layer_orders[index]);
LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order");
while (index < ZMK_KEYMAP_LAYERS_LEN - 1) {
keymap_layer_orders[index] = keymap_layer_orders[index + 1];
index++;
}
keymap_layer_orders[ZMK_KEYMAP_LAYERS_LEN - 1] = ZMK_KEYMAP_LAYER_ID_INVAL;
LOG_HEXDUMP_DBG(keymap_layer_orders, ZMK_KEYMAP_LAYERS_LEN, "Order");
return 0;
}
int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index) {
ASSERT_LAYER_VAL(at_index, -EINVAL);
ASSERT_LAYER_VAL(id, -ENODEV);
for (zmk_keymap_layer_index_t index = ZMK_KEYMAP_LAYERS_LEN - 1; index > at_index; index--) {
keymap_layer_orders[index] = keymap_layer_orders[index - 1];
}
keymap_layer_orders[at_index] = id;
return 0;
}
int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size) {
ASSERT_LAYER_VAL(id, -EINVAL);
if (size >= CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN) {
return -ENOSPC;
}
strlcpy(zmk_keymap_layer_names[id], name, CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN);
// Ensure we properly null terminate our name if we previously had a longer one.
if (size < CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN - 1) {
zmk_keymap_layer_names[id][size] = 0;
}
WRITE_BIT(changed_layer_names, id, 1);
return 0;
}
#else
int zmk_keymap_move_layer(zmk_keymap_layer_index_t layer, zmk_keymap_layer_index_t dest) {
return -ENOTSUP;
}
int zmk_keymap_add_layer(void) { return -ENOTSUP; }
int zmk_keymap_remove_layer(zmk_keymap_layer_index_t index) { return -ENOTSUP; }
int zmk_keymap_restore_layer(zmk_keymap_layer_id_t id, zmk_keymap_layer_index_t at_index) {
return -ENOTSUP;
}
int zmk_keymap_set_layer_name(zmk_keymap_layer_id_t id, const char *name, size_t size) {
return -ENOTSUP;
}
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
#define PENDING_ARRAY_SIZE DIV_ROUND_UP(ZMK_KEYMAP_LEN, 8)
static uint8_t zmk_keymap_layer_pending_changes[ZMK_KEYMAP_LAYERS_LEN][PENDING_ARRAY_SIZE];
struct zmk_behavior_binding_setting {
zmk_behavior_local_id_t behavior_local_id;
uint32_t param1;
uint32_t param2;
} __packed;
int zmk_keymap_check_unsaved_changes(void) {
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
uint8_t *pending = zmk_keymap_layer_pending_changes[l];
for (int kp = 0; kp < ZMK_KEYMAP_LEN; kp++) {
if (pending[kp / 8] & BIT(kp % 8)) {
return 1;
}
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
if (settings_layer_orders[l] != keymap_layer_orders[l]) {
return 1;
}
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
}
return 0;
}
#define LAYER_ORDER_SETTINGS_KEY "keymap/layer_order"
#define LAYER_NAME_SETTINGS_KEY "keymap/l_n/%d"
#define LAYER_BINDING_SETTINGS_KEY "keymap/l/%d/%d"
static void save_bindings(void) {
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
uint8_t *pending = zmk_keymap_layer_pending_changes[l];
for (int kp = 0; kp < ZMK_KEYMAP_LEN; kp++) {
if (pending[kp / 8] & BIT(kp % 8)) {
LOG_DBG("Pending save for layer %d at key position %d", l, kp);
struct zmk_behavior_binding *binding = &zmk_keymap[l][kp];
struct zmk_behavior_binding_setting binding_setting = {
.behavior_local_id = zmk_behavior_get_local_id(binding->behavior_dev),
.param1 = binding->param1,
.param2 = binding->param2,
};
// We can skip any trailing zero params, regardless of the behavior
// and if those params are meaningful.
size_t len = sizeof(binding_setting);
if (binding_setting.param2 == 0) {
len -= 4;
if (binding_setting.param1 == 0) {
len -= 4;
}
}
char setting_name[20];
sprintf(setting_name, LAYER_BINDING_SETTINGS_KEY, l, kp);
settings_save_one(setting_name, &binding_setting, len);
}
}
*pending = 0;
}
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
static void save_layer_orders(void) {
settings_save_one(LAYER_ORDER_SETTINGS_KEY, keymap_layer_orders,
ARRAY_SIZE(keymap_layer_orders));
memcpy(settings_layer_orders, keymap_layer_orders, ARRAY_SIZE(keymap_layer_orders));
}
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
static void save_layer_names(void) {
for (int id = 0; id < ZMK_KEYMAP_LAYERS_LEN; id++) {
if (changed_layer_names & BIT(id)) {
char setting_name[14];
sprintf(setting_name, LAYER_NAME_SETTINGS_KEY, id);
settings_save_one(setting_name, zmk_keymap_layer_names[id],
strlen(zmk_keymap_layer_names[id]));
}
}
changed_layer_names = 0;
}
int zmk_keymap_save_changes(void) {
save_bindings();
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
save_layer_orders();
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
save_layer_names();
return 0;
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
#define KEYMAP_LAYER_ORDER_INIT(n) \
keymap_layer_orders[i] = i; \
settings_layer_orders[i] = i; \
i++;
static void load_stock_keymap_layer_ordering() {
int i = 0;
DT_INST_FOREACH_CHILD_STATUS_OKAY(0, KEYMAP_LAYER_ORDER_INIT)
while (i < ZMK_KEYMAP_LAYERS_LEN) {
keymap_layer_orders[i] = ZMK_KEYMAP_LAYER_ID_INVAL;
i++;
}
}
#endif
static void reload_from_stock_keymap(void) {
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
for (int k = 0; k < ZMK_KEYMAP_LEN; k++) {
zmk_keymap[l][k] = zmk_stock_keymap[l][k];
}
}
}
int zmk_keymap_discard_changes(void) {
load_stock_keymap_layer_ordering();
reload_from_stock_keymap();
int ret = settings_load_subtree("keymap");
if (ret >= 0) {
changed_layer_names = 0;
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
memset(zmk_keymap_layer_pending_changes[l], 0, PENDING_ARRAY_SIZE);
}
}
return ret;
}
int zmk_keymap_reset_settings(void) {
settings_delete(LAYER_ORDER_SETTINGS_KEY);
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
char layer_name_setting_name[14];
sprintf(layer_name_setting_name, LAYER_NAME_SETTINGS_KEY, l);
settings_delete(layer_name_setting_name);
for (int k = 0; k < ZMK_KEYMAP_LEN; k++) {
if (memcmp(&zmk_keymap[l][k], &zmk_stock_keymap[l][k],
sizeof(struct zmk_behavior_binding_setting)) == 0) {
continue;
}
char setting_name[20];
sprintf(setting_name, LAYER_BINDING_SETTINGS_KEY, l, k);
settings_delete(setting_name);
}
}
load_stock_keymap_layer_ordering();
reload_from_stock_keymap();
return 0;
}
#else
int zmk_keymap_save_changes(void) { return -ENOTSUP; }
int zmk_keymap_discard_changes(void) { return -ENOTSUP; }
int zmk_keymap_reset_settings(void) { return -ENOTSUP; }
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
int invoke_locally(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event, int invoke_locally(struct zmk_behavior_binding *binding, struct zmk_behavior_binding_event event,
bool pressed) { bool pressed) {
if (pressed) { if (pressed) {
@ -172,24 +585,28 @@ int invoke_locally(struct zmk_behavior_binding *binding, struct zmk_behavior_bin
} }
} }
int zmk_keymap_apply_position_state(uint8_t source, int layer, uint32_t position, bool pressed, int zmk_keymap_apply_position_state(uint8_t source, zmk_keymap_layer_id_t layer_id,
int64_t timestamp) { uint32_t position, bool pressed, int64_t timestamp) {
// We want to make a copy of this, since it may be converted from // We want to make a copy of this, since it may be converted from
// relative to absolute before being invoked // relative to absolute before being invoked
struct zmk_behavior_binding binding = zmk_keymap[layer][position];
ASSERT_LAYER_VAL(layer_id, -EINVAL);
struct zmk_behavior_binding binding = zmk_keymap[layer_id][position];
const struct device *behavior; const struct device *behavior;
struct zmk_behavior_binding_event event = { struct zmk_behavior_binding_event event = {
.layer = layer, .layer = layer_id,
.position = position, .position = position,
.timestamp = timestamp, .timestamp = timestamp,
}; };
LOG_DBG("layer: %d position: %d, binding name: %s", layer, position, binding.behavior_dev); LOG_DBG("layer_id: %d position: %d, binding name: %s", layer_id, position,
binding.behavior_dev);
behavior = zmk_behavior_get_binding(binding.behavior_dev); behavior = zmk_behavior_get_binding(binding.behavior_dev);
if (!behavior) { if (!behavior) {
LOG_WRN("No behavior assigned to %d on layer %d", position, layer); LOG_WRN("No behavior assigned to %d on layer %d", position, layer_id);
return 1; return 1;
} }
@ -236,9 +653,19 @@ int zmk_keymap_position_state_changed(uint8_t source, uint32_t position, bool pr
if (pressed) { if (pressed) {
zmk_keymap_active_behavior_layer[position] = _zmk_keymap_layer_state; zmk_keymap_active_behavior_layer[position] = _zmk_keymap_layer_state;
} }
for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= _zmk_keymap_layer_default; layer--) {
if (zmk_keymap_layer_active_with_state(layer, zmk_keymap_active_behavior_layer[position])) { // We use int here to be sure we don't loop layer_idx back to UINT8_MAX
int ret = zmk_keymap_apply_position_state(source, layer, position, pressed, timestamp); for (int layer_idx = ZMK_KEYMAP_LAYERS_LEN - 1;
layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default); layer_idx--) {
zmk_keymap_layer_id_t layer_id = LAYER_INDEX_TO_ID(layer_idx);
if (layer_id == ZMK_KEYMAP_LAYER_ID_INVAL) {
continue;
}
if (zmk_keymap_layer_active_with_state(layer_id,
zmk_keymap_active_behavior_layer[position])) {
int ret =
zmk_keymap_apply_position_state(source, layer_id, position, pressed, timestamp);
if (ret > 0) { if (ret > 0) {
LOG_DBG("behavior processing to continue to next layer"); LOG_DBG("behavior processing to continue to next layer");
continue; continue;
@ -260,20 +687,26 @@ int zmk_keymap_sensor_event(uint8_t sensor_index,
size_t channel_data_size, int64_t timestamp) { size_t channel_data_size, int64_t timestamp) {
bool opaque_response = false; bool opaque_response = false;
for (int layer = ZMK_KEYMAP_LAYERS_LEN - 1; layer >= 0; layer--) { for (int layer_idx = ZMK_KEYMAP_LAYERS_LEN - 1; layer_idx >= 0; layer_idx--) {
struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer][sensor_index]; uint8_t layer_id = LAYER_INDEX_TO_ID(layer_idx);
LOG_DBG("layer: %d sensor_index: %d, binding name: %s", layer, sensor_index, if (layer_id >= ZMK_KEYMAP_LAYERS_LEN) {
binding->behavior_dev); continue;
}
struct zmk_behavior_binding *binding = &zmk_sensor_keymap[layer_id][sensor_index];
LOG_DBG("layer idx: %d, layer id: %d sensor_index: %d, binding name: %s", layer_idx,
layer_id, sensor_index, binding->behavior_dev);
const struct device *behavior = zmk_behavior_get_binding(binding->behavior_dev); const struct device *behavior = zmk_behavior_get_binding(binding->behavior_dev);
if (!behavior) { if (!behavior) {
LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer); LOG_DBG("No behavior assigned to %d on layer %d", sensor_index, layer_id);
continue; continue;
} }
struct zmk_behavior_binding_event event = { struct zmk_behavior_binding_event event = {
.layer = layer, .layer = layer_id,
.position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index), .position = ZMK_VIRTUAL_KEY_POSITION_SENSOR(sensor_index),
.timestamp = timestamp, .timestamp = timestamp,
}; };
@ -290,8 +723,8 @@ int zmk_keymap_sensor_event(uint8_t sensor_index,
} }
enum behavior_sensor_binding_process_mode mode = enum behavior_sensor_binding_process_mode mode =
(!opaque_response && layer >= _zmk_keymap_layer_default && (!opaque_response && layer_idx >= LAYER_ID_TO_INDEX(_zmk_keymap_layer_default) &&
zmk_keymap_layer_active(layer)) zmk_keymap_layer_active(layer_id))
? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER ? BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_TRIGGER
: BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD; : BEHAVIOR_SENSOR_BINDING_PROCESS_MODE_DISCARD;
@ -335,3 +768,140 @@ ZMK_SUBSCRIPTION(keymap, zmk_position_state_changed);
#if ZMK_KEYMAP_HAS_SENSORS #if ZMK_KEYMAP_HAS_SENSORS
ZMK_SUBSCRIPTION(keymap, zmk_sensor_event); ZMK_SUBSCRIPTION(keymap, zmk_sensor_event);
#endif /* ZMK_KEYMAP_HAS_SENSORS */ #endif /* ZMK_KEYMAP_HAS_SENSORS */
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
static int keymap_handle_set(const char *name, size_t len, settings_read_cb read_cb, void *cb_arg) {
const char *next;
LOG_DBG("Setting Keymap setting %s", name);
if (settings_name_steq(name, "l_n", &next) && next) {
char *endptr;
zmk_keymap_layer_id_t layer = strtoul(next, &endptr, 10);
if (*endptr != '\0') {
LOG_WRN("Invalid layer number: %s with endptr %s", next, endptr);
return -EINVAL;
}
if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
LOG_WRN("Found layer name for invalid layer ID %d", layer);
}
int err = read_cb(cb_arg, zmk_keymap_layer_names[layer],
MIN(len, CONFIG_ZMK_KEYMAP_LAYER_NAME_MAX_LEN - 1));
if (err <= 0) {
LOG_ERR("Failed to handle keymap layer name from settings (err %d)", err);
return err;
}
} else if (settings_name_steq(name, "l", &next) && next) {
char *endptr;
uint8_t layer = strtoul(next, &endptr, 10);
if (*endptr != '/') {
LOG_WRN("Invalid layer number: %s with endptr %s", next, endptr);
return -EINVAL;
}
uint8_t key_position = strtoul(endptr + 1, &endptr, 10);
if (*endptr != '\0') {
LOG_WRN("Invalid key_position number: %s with endptr %s", next, endptr);
return -EINVAL;
}
if (len > sizeof(struct zmk_behavior_binding_setting)) {
LOG_ERR("Too large binding setting size (got %d expected %d)", len,
sizeof(struct zmk_behavior_binding_setting));
return -EINVAL;
}
if (layer >= ZMK_KEYMAP_LAYERS_LEN) {
LOG_WRN("Layer %d is larger than max of %d", layer, ZMK_KEYMAP_LAYERS_LEN);
return -EINVAL;
}
if (key_position >= ZMK_KEYMAP_LEN) {
LOG_WRN("Key position %d is larger than max of %d", key_position, ZMK_KEYMAP_LEN);
return -EINVAL;
}
struct zmk_behavior_binding_setting binding_setting = {0};
int err = read_cb(cb_arg, &binding_setting, len);
if (err <= 0) {
LOG_ERR("Failed to handle keymap binding from settings (err %d)", err);
return err;
}
const char *name =
zmk_behavior_find_behavior_name_from_local_id(binding_setting.behavior_local_id);
if (!name) {
LOG_WRN("Loaded device %d from settings but no device found by that local ID",
binding_setting.behavior_local_id);
}
zmk_keymap[layer][key_position] = (struct zmk_behavior_binding) {
#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS)
.local_id = binding_setting.behavior_local_id,
#endif
.behavior_dev = name, .param1 = binding_setting.param1,
.param2 = binding_setting.param2,
};
}
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
else if (settings_name_steq(name, "layer_order", &next) && !next) {
int err =
read_cb(cb_arg, settings_layer_orders, MIN(len, ARRAY_SIZE(settings_layer_orders)));
if (err <= 0) {
LOG_ERR("Failed to handle keymap layer orders from settings (err %d)", err);
return err;
}
LOG_HEXDUMP_DBG(settings_layer_orders, ARRAY_SIZE(settings_layer_orders),
"Settings Layer Order");
memcpy(keymap_layer_orders, settings_layer_orders,
MIN(len, ARRAY_SIZE(settings_layer_orders)));
}
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
return 0;
};
static int keymap_handle_commit(void) {
#if IS_ENABLED(CONFIG_ZMK_BEHAVIOR_LOCAL_IDS_IN_BINDINGS)
for (int l = 0; l < ZMK_KEYMAP_LAYERS_LEN; l++) {
for (int p = 0; p < ZMK_KEYMAP_LEN; p++) {
struct zmk_behavior_binding *binding = &zmk_keymap[l][p];
if (binding->local_id > 0 && !binding->behavior_dev) {
binding->behavior_dev =
zmk_behavior_find_behavior_name_from_local_id(binding->local_id);
if (!binding->behavior_dev) {
LOG_ERR("Failed to finding device for local ID %d after settings load",
binding->local_id);
}
}
}
}
#endif
return 0;
}
SETTINGS_STATIC_HANDLER_DEFINE(keymap, "keymap", NULL, keymap_handle_set, keymap_handle_commit,
NULL);
#endif // IS_ENABLED(CONFIG_ZMK_KEYMAP_SETTINGS_STORAGE)
int keymap_init(void) {
#if IS_ENABLED(CONFIG_ZMK_KEYMAP_LAYER_REORDERING)
load_stock_keymap_layer_ordering();
#endif
return 0;
}
SYS_INIT(keymap_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);

View file

@ -72,9 +72,17 @@ struct position_map_entry {
const uint32_t positions[ZMK_POS_MAP_LEN]; const uint32_t positions[ZMK_POS_MAP_LEN];
}; };
#define ZMK_POS_MAP_LEN_CHECK(node_id) \
BUILD_ASSERT(ZMK_POS_MAP_LEN == DT_PROP_LEN(node_id, positions), \
"Position maps must all have the same number of entries")
DT_FOREACH_CHILD_SEP(DT_INST(0, POS_MAP_COMPAT), ZMK_POS_MAP_LEN_CHECK, (;));
#define ZMK_POS_MAP_ENTRY(node_id) \ #define ZMK_POS_MAP_ENTRY(node_id) \
{ \ { \
.layout = &_CONCAT(_zmk_physical_layout_, DT_PHANDLE(node_id, physical_layout)), \ .layout = COND_CODE_1( \
DT_HAS_COMPAT_STATUS_OKAY(DT_PHANDLE(node_id, physical_layout)), \
(&_CONCAT(_zmk_physical_layout_, DT_PHANDLE(node_id, physical_layout))), (NULL)), \
.positions = DT_PROP(node_id, positions), \ .positions = DT_PROP(node_id, positions), \
} }
@ -275,13 +283,15 @@ int zmk_physical_layouts_save_selected(void) {
int zmk_physical_layouts_revert_selected(void) { return zmk_physical_layouts_select_initial(); } int zmk_physical_layouts_revert_selected(void) { return zmk_physical_layouts_select_initial(); }
int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, uint32_t *map) { int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, size_t map_size,
uint32_t map[map_size]) {
if (source >= ARRAY_SIZE(layouts) || dest >= ARRAY_SIZE(layouts)) { if (source >= ARRAY_SIZE(layouts) || dest >= ARRAY_SIZE(layouts)) {
return -EINVAL; return -EINVAL;
} }
const struct zmk_physical_layout *src_layout = layouts[source]; const struct zmk_physical_layout *src_layout = layouts[source];
const struct zmk_physical_layout *dest_layout = layouts[dest]; const struct zmk_physical_layout *dest_layout = layouts[dest];
int max_kp = dest_layout->keys_len;
#if HAVE_POS_MAP #if HAVE_POS_MAP
const struct position_map_entry *src_pos_map = NULL; const struct position_map_entry *src_pos_map = NULL;
@ -296,11 +306,24 @@ int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, uint32_t
dest_pos_map = &positions_maps[pm]; dest_pos_map = &positions_maps[pm];
} }
} }
// Maps can place items "off the end" of other layouts so they are
// preserved but not visible, so adjust our max here if that is being used.
if (src_pos_map && dest_pos_map) {
for (int mp = 0; mp < ZMK_POS_MAP_LEN; mp++) {
max_kp =
MAX(max_kp, MAX(src_pos_map->positions[mp] + 1, dest_pos_map->positions[mp] + 1));
}
}
#endif #endif
memset(map, UINT32_MAX, dest_layout->keys_len); if (map_size < max_kp) {
return -EINVAL;
}
for (int b = 0; b < dest_layout->keys_len; b++) { memset(map, UINT32_MAX, map_size);
for (int b = 0; b < max_kp; b++) {
bool found = false; bool found = false;
#if HAVE_POS_MAP #if HAVE_POS_MAP
@ -329,13 +352,9 @@ int zmk_physical_layouts_get_position_map(uint8_t source, uint8_t dest, uint32_t
} }
} }
#endif #endif
if (!found || map[b] >= src_layout->keys_len) {
map[b] = UINT32_MAX;
}
} }
return dest_layout->keys_len; return max_kp;
} }
#if IS_ENABLED(CONFIG_SETTINGS) #if IS_ENABLED(CONFIG_SETTINGS)

View file

@ -3,6 +3,7 @@
zephyr_linker_sources(DATA_SECTIONS ../../include/linker/zmk-rpc-subsystems.ld) zephyr_linker_sources(DATA_SECTIONS ../../include/linker/zmk-rpc-subsystems.ld)
zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-subsystem-handlers.ld) zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-subsystem-handlers.ld)
zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-subsystem-settings-reset.ld)
zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-event-mappers.ld) zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-event-mappers.ld)
zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-transport.ld) zephyr_linker_sources(SECTIONS ../../include/linker/zmk-rpc-transport.ld)
@ -11,5 +12,6 @@ target_sources(app PRIVATE rpc.c)
target_sources(app PRIVATE core.c) target_sources(app PRIVATE core.c)
target_sources(app PRIVATE behavior_subsystem.c) target_sources(app PRIVATE behavior_subsystem.c)
target_sources(app PRIVATE core_subsystem.c) target_sources(app PRIVATE core_subsystem.c)
target_sources(app PRIVATE keymap_subsystem.c)
target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_UART app PRIVATE uart_rpc_transport.c) target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_UART app PRIVATE uart_rpc_transport.c)
target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_BLE app PRIVATE gatt_rpc_transport.c) target_sources_ifdef(CONFIG_ZMK_STUDIO_TRANSPORT_BLE app PRIVATE gatt_rpc_transport.c)

View file

@ -41,6 +41,8 @@ menuconfig ZMK_STUDIO_RPC
select ZMK_BEHAVIOR_METADATA select ZMK_BEHAVIOR_METADATA
select ZMK_BEHAVIOR_LOCAL_IDS select ZMK_BEHAVIOR_LOCAL_IDS
select RING_BUFFER select RING_BUFFER
select ZMK_KEYMAP_SETTINGS_STORAGE
select ZMK_KEYMAP_LAYER_REORDERING
help help
Add firmware support for studio RPC protocol Add firmware support for studio RPC protocol

View file

@ -61,8 +61,21 @@ zmk_studio_Response get_lock_state(const zmk_studio_Request *req) {
return CORE_RESPONSE(get_lock_state, resp); return CORE_RESPONSE(get_lock_state, resp);
} }
zmk_studio_Response reset_settings(const zmk_studio_Request *req) {
ZMK_RPC_SUBSYSTEM_SETTINGS_RESET_FOREACH(sub) {
int ret = sub->callback();
if (ret < 0) {
LOG_ERR("Failed to reset settings: %d", ret);
return CORE_RESPONSE(reset_settings, false);
}
}
return CORE_RESPONSE(reset_settings, true);
}
ZMK_RPC_SUBSYSTEM_HANDLER(core, get_device_info, ZMK_STUDIO_RPC_HANDLER_UNSECURED); ZMK_RPC_SUBSYSTEM_HANDLER(core, get_device_info, ZMK_STUDIO_RPC_HANDLER_UNSECURED);
ZMK_RPC_SUBSYSTEM_HANDLER(core, get_lock_state, ZMK_STUDIO_RPC_HANDLER_UNSECURED); ZMK_RPC_SUBSYSTEM_HANDLER(core, get_lock_state, ZMK_STUDIO_RPC_HANDLER_UNSECURED);
ZMK_RPC_SUBSYSTEM_HANDLER(core, reset_settings, ZMK_STUDIO_RPC_HANDLER_SECURED);
static int core_event_mapper(const zmk_event_t *eh, zmk_studio_Notification *n) { static int core_event_mapper(const zmk_event_t *eh, zmk_studio_Notification *n) {
struct zmk_studio_core_lock_state_changed *lock_ev = as_zmk_studio_core_lock_state_changed(eh); struct zmk_studio_core_lock_state_changed *lock_ev = as_zmk_studio_core_lock_state_changed(eh);

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