Compare commits

..

32 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
Nicolas Munnich
266227b580
refactor(docs): Refactor the development section (#2438) 2024-09-01 21:54:19 -07:00
Cem Aksoylar
aae4feeda8 chore(deps): npm update on docs 2024-09-01 21:37:47 -07:00
Cem Aksoylar
b74cd39ab5 chore(blog): Use truncate markers 2024-09-01 00:15:23 -07:00
Cem Aksoylar
0120156002 refactor(blog): Use global authors 2024-09-01 00:15:23 -07:00
Cem Aksoylar
745b960593 fix(docs): Fix broken anchors 2024-09-01 00:13:46 -07:00
dependabot[bot]
882226e261 chore(deps-dev): bump webpack from 5.89.0 to 5.94.0 in /docs
Bumps [webpack](https://github.com/webpack/webpack) from 5.89.0 to 5.94.0.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.89.0...v5.94.0)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-31 17:13:32 -07:00
dependabot[bot]
d74896d780 chore(deps): bump micromatch from 4.0.5 to 4.0.8 in /docs
Bumps [micromatch](https://github.com/micromatch/micromatch) from 4.0.5 to 4.0.8.
- [Release notes](https://github.com/micromatch/micromatch/releases)
- [Changelog](https://github.com/micromatch/micromatch/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/micromatch/compare/4.0.5...4.0.8)

---
updated-dependencies:
- dependency-name: micromatch
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-31 17:06:43 -07:00
Mike Szczys
f019524600 fix(display): widgets: increase buffer size for symbols
Increase buffer size used for placing LVGL symbols on displays. This
prevents array overflow warnings as discussed in #2444.

Also convert one sprintf to snprintf to ensure the buffers are always
null terminated and never overflow.

Signed-off-by: Mike Szczys <szczys@hotmail.com>
2024-08-28 00:35:28 -06:00
Anant Thazhemadam
6946ca8b07
fix(docs): minor corrections and fix typo (#2443)
* docs(faq): minor corrections

* docs: fix typo - `s/Alterative/Alternative`

* docs(faq): use Lily58 as an example instead of Corne with revision

Co-authored-by: Nicolas Munnich <98408764+Nick-Munnich@users.noreply.github.com>

---------

Co-authored-by: Nicolas Munnich <98408764+Nick-Munnich@users.noreply.github.com>
2024-08-27 16:23:15 +02:00
William Brockhus
b866ec031f
fix(docs): Fixing wording in the split keyboards feature page (#2440) 2024-08-25 09:31:21 +02:00
163 changed files with 8127 additions and 3604 deletions

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

@ -24,13 +24,13 @@ struct layer_status_state {
static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) { static void set_layer_symbol(lv_obj_t *label, struct layer_status_state state) {
if (state.label == NULL) { if (state.label == NULL) {
char text[7] = {}; char text[8] = {};
sprintf(text, LV_SYMBOL_KEYBOARD " %i", state.index); snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %i", state.index);
lv_label_set_text(label, text); lv_label_set_text(label, text);
} else { } else {
char text[13] = {}; char text[14] = {};
snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %s", state.label); snprintf(text, sizeof(text), LV_SYMBOL_KEYBOARD " %s", state.label);
@ -64,4 +64,4 @@ int zmk_widget_layer_status_init(struct zmk_widget_layer_status *widget, lv_obj_
lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) { lv_obj_t *zmk_widget_layer_status_obj(struct zmk_widget_layer_status *widget) {
return widget->obj; return widget->obj;
} }

View file

@ -35,7 +35,7 @@ static struct output_status_state get_state(const zmk_event_t *_eh) {
} }
static void set_status_symbol(lv_obj_t *label, struct output_status_state state) { static void set_status_symbol(lv_obj_t *label, struct output_status_state state) {
char text[10] = {}; char text[20] = {};
switch (state.selected_endpoint.transport) { switch (state.selected_endpoint.transport) {
case ZMK_TRANSPORT_USB: case ZMK_TRANSPORT_USB:

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

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