From 3b8244e4662c4f01f049c0d6ee1e2fa1c2de3779 Mon Sep 17 00:00:00 2001 From: Brandon Xie <30637265+xiushak@users.noreply.github.com> Date: Sun, 3 Oct 2021 23:23:54 -0400 Subject: [PATCH 1/5] feat(shields): Add Naked60BMP shield --- app/boards/shields/naked60/Kconfig.defconfig | 9 ++ app/boards/shields/naked60/Kconfig.shield | 5 + app/boards/shields/naked60/naked60.conf | 0 app/boards/shields/naked60/naked60.keymap | 99 ++++++++++++++++++++ app/boards/shields/naked60/naked60.overlay | 40 ++++++++ app/boards/shields/naked60/naked60.zmk.yml | 8 ++ 6 files changed, 161 insertions(+) create mode 100644 app/boards/shields/naked60/Kconfig.defconfig create mode 100644 app/boards/shields/naked60/Kconfig.shield create mode 100644 app/boards/shields/naked60/naked60.conf create mode 100644 app/boards/shields/naked60/naked60.keymap create mode 100644 app/boards/shields/naked60/naked60.overlay create mode 100644 app/boards/shields/naked60/naked60.zmk.yml diff --git a/app/boards/shields/naked60/Kconfig.defconfig b/app/boards/shields/naked60/Kconfig.defconfig new file mode 100644 index 00000000..ff5978bc --- /dev/null +++ b/app/boards/shields/naked60/Kconfig.defconfig @@ -0,0 +1,9 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_NAKED60 + +config ZMK_KEYBOARD_NAME + default "Naked60BMP" + +endif \ No newline at end of file diff --git a/app/boards/shields/naked60/Kconfig.shield b/app/boards/shields/naked60/Kconfig.shield new file mode 100644 index 00000000..61053686 --- /dev/null +++ b/app/boards/shields/naked60/Kconfig.shield @@ -0,0 +1,5 @@ +# Copyright (c) 2020 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_NAKED60 + def_bool $(shields_list_contains,naked60) diff --git a/app/boards/shields/naked60/naked60.conf b/app/boards/shields/naked60/naked60.conf new file mode 100644 index 00000000..e69de29b diff --git a/app/boards/shields/naked60/naked60.keymap b/app/boards/shields/naked60/naked60.keymap new file mode 100644 index 00000000..d380a599 --- /dev/null +++ b/app/boards/shields/naked60/naked60.keymap @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include + + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // ---------------------------------------------------------------------------------------------------------- + // | ESC | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | BSPC | + // | TAB | Q | W | E | R | T |-------|-------| Y | U | I | O | P | \ | + // | SHIFT | A | S | D | F | G |-------|-------| H | J | K | L | ; | ' | + // | CTRL | Z | X | C | V | B |-------|-------| N | M | , | . | / | ENTER | + // |-------|ADJUST| LCTL | LALT | LGUI | LOWR | SPACE | SPACE | RAIS | LARW | DARW | UARW | RARW |-------| + + + bindings = < + &kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &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 BSLH + &kp LSHFT &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp LCTRL &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET + &mo 3 &kp LCTRL &kp LALT &kp LGUI &mo 1 &kp SPACE &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + }; + + lower { + // ---------------------------------------------------------------------------------------------------------- + // | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 | + // | ~ | ! | @ | # | $ | % |-------|-------| ^ | & | * | ( | ) | DEL | + // | | F1 | F2 | F3 | F4 | F5 |-------|-------| F6 | _ | + | { | } | | | + // | | F7 | F8 | F9 | F10 | F11 |-------|-------| F12 | LS(#) |LS(|) | | | | + // |-------| | | | | | | | | NEXT | Vol- | Vol+ | PLAY |-------| + bindings = < + &kp ESC &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 + &kp TILDE &kp EXCL &kp AT &kp HASH &kp DLLR &kp PRCNT &kp CARET &kp AMPS &kp ASTRK &kp LPAR &kp RPAR &kp DEL + &trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp UNDER &kp PLUS &kp LBRC &kp RBRC &kp PIPE + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp LS(NON_US_HASH) &kp LS(NON_US_BSLH) &trans &trans &trans + &trans &trans &trans &trans &trans &trans &trans &mo 3 &kp C_NEXT &kp C_VOL_DN &kp C_VOL_UP &kp C_PLAY_PAUSE + >; + }; + + raise { + // ---------------------------------------------------------------------------------------------------------- + // | ESC | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | F12 | + // | ~ | 1 | 2 | 3 | 4 | 5 |-------|-------| 6 | 7 | 8 | 9 | 0 | DEL | + // | DEL | F1 | F2 | F3 | F4 | F5 |-------|-------| F6 | - | = | [ | ] | \ | + // | | F7 | F8 | F9 | F10 | F11 |-------|-------| F12 | # | | | | | | + // |-------| | | | | | | | | | | | |-------| + bindings = < + &kp ESC &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 + &kp TILDE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp DEL + &kp DEL &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp MINUS &kp EQUAL &kp LBKT &kp RBKT &kp BSLH + &trans &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &kp NON_US_HASH &kp NON_US_BSLH &trans &trans &trans + &trans &trans &trans &trans &mo 3 &trans &trans &trans &trans &trans &trans &trans + >; + }; + + adjust { + // ---------------------------------------------------------------------------------------------------------- + // |tog(4)| F2 | F3 | F4 | F5 | F6 |------|------| F7 | F8 | F9 | F10 | F11 | F12 | + // | | NA | NA | NA | NA | NA |------|------| NA | NA | NA | NA | NA |LALT(PRTSN)| + // | | NA | NA | NA | NA | NA |------|------| NA | NA | NA | NA | NA | PRTSN | + // | | NA | NA | NA | NA | NA |------|------| NA | NA | NA | NA | NA |LCTRL(DEL) | + // |------| | | | | |BOOTLD|BOOTLD| | | | | |-----------| + bindings = < + &tog 4 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 + &trans &none &none &none &none &none &none &none &none &none &none &kp LA(PSCRN) + &trans &none &none &none &none &none &none &none &none &none &none &kp PSCRN + &trans &none &none &none &none &none &none &none &none &none &none &kp LC(DEL) + &trans &trans &trans &trans &trans &bootloader &bootloader &trans &trans &trans &trans &trans + >; + }; + + flock { + // ---------------------------------------------------------------------------------------------------------- + // |tog(4) | F2 | F3 | F4 | F5 | F6 |-------|-------| F7 | F8 | F9 | F10 | F11 | | + // |out tog|BT_SEL 0|BT_SEL 1|BT_SEL 2|BT_SEL 3|BT_SEL 4|-------|-------|BT_PRV|BT_NXT|BT_CLR| | | | + // | | | | | | |-------|-------| | | | | | | + // | | | | | | |-------|-------| | | | | | | + // |-------| | | | | | | | | | | | |------| + bindings = < + &tog 4 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &trans + &out OUT_TOG &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &bt BT_PRV &bt BT_NXT &bt BT_CLR &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 + >; + }; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/naked60/naked60.overlay b/app/boards/shields/naked60/naked60.overlay new file mode 100644 index 00000000..2260a4af --- /dev/null +++ b/app/boards/shields/naked60/naked60.overlay @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/ { + chosen { + zmk,kscan = &kscan0; + }; + + kscan0: kscan_0 { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + diode-direction = "col2row"; + + col-gpios + = <&pro_micro 21 GPIO_ACTIVE_HIGH> // col 0 + , <&pro_micro 20 GPIO_ACTIVE_HIGH> // col 1 + , <&pro_micro 19 GPIO_ACTIVE_HIGH> // col 2 + , <&pro_micro 18 GPIO_ACTIVE_HIGH> // col 3 + , <&pro_micro 15 GPIO_ACTIVE_HIGH> // col 4 + , <&pro_micro 14 GPIO_ACTIVE_HIGH> // col 5 + , <&pro_micro 16 GPIO_ACTIVE_HIGH> // col 6 + , <&pro_micro 6 GPIO_ACTIVE_HIGH> // col 7 + , <&pro_micro 7 GPIO_ACTIVE_HIGH> // col 8 + , <&pro_micro 8 GPIO_ACTIVE_HIGH> // col 9 + , <&pro_micro 9 GPIO_ACTIVE_HIGH> // col 10 + , <&pro_micro 1 GPIO_ACTIVE_HIGH> // col 11 + ; + + row-gpios + = <&pro_micro 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // row 0 + , <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // row 1 + , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // row 2 + , <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // row 3 + , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // row 4 + ; + }; +}; \ No newline at end of file diff --git a/app/boards/shields/naked60/naked60.zmk.yml b/app/boards/shields/naked60/naked60.zmk.yml new file mode 100644 index 00000000..932c2298 --- /dev/null +++ b/app/boards/shields/naked60/naked60.zmk.yml @@ -0,0 +1,8 @@ +file_format: "1" +id: naked60 +name: Naked60 +type: shield +url: https://salicylic-acid3.hatenablog.com/ +requires: [pro_micro] +features: + - keys From 19a7d686fbb7ed1bc53444f1536a1cc2c5bd2d8d Mon Sep 17 00:00:00 2001 From: Nick Winans Date: Sun, 3 Oct 2021 22:29:59 -0500 Subject: [PATCH 2/5] chore: Add board/shield checklist for new PRs. --- .github/pull_request_template.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/pull_request_template.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..c191ccca --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,11 @@ + +## Board/Shield Check-list + - [ ] This board/shield is tested working on real hardware + - [ ] Definitions follow the general style of other shields/boards upstream ([Reference](https://zmk.dev/docs/development/new-shield)) + - [ ] `.zmk.yml` metadata file added + - [ ] Proper Copyright + License headers added to applicable files + - [ ] General consistent formatting of DeviceTree files + - [ ] Keymaps do not use deprecated key defines (Check using the [upgrader tool](https://zmk.dev/docs/codes/keymap-upgrader)) + - [ ] `&pro_micro` used in favor of `&pro_micro_d/a` if applicable + - [ ] If split, no name added for the right/peripheral half + - [ ] `.conf` file has optional extra features commented out From 063b496c26316026e95cf7cdb0ba6c343b6c6efb Mon Sep 17 00:00:00 2001 From: Aleblazer <60912320+Aleblazer@users.noreply.github.com> Date: Sun, 3 Oct 2021 22:47:23 -0500 Subject: [PATCH 3/5] feat(boards): Add Zodiark shield --- app/boards/shields/zodiark/Kconfig.defconfig | 55 ++++++++++++ app/boards/shields/zodiark/Kconfig.shield | 8 ++ app/boards/shields/zodiark/zodiark.conf | 9 ++ app/boards/shields/zodiark/zodiark.dtsi | 86 +++++++++++++++++++ app/boards/shields/zodiark/zodiark.keymap | 69 +++++++++++++++ app/boards/shields/zodiark/zodiark.zmk.yml | 14 +++ .../shields/zodiark/zodiark_left.overlay | 23 +++++ .../shields/zodiark/zodiark_right.overlay | 27 ++++++ 8 files changed, 291 insertions(+) create mode 100644 app/boards/shields/zodiark/Kconfig.defconfig create mode 100644 app/boards/shields/zodiark/Kconfig.shield create mode 100644 app/boards/shields/zodiark/zodiark.conf create mode 100644 app/boards/shields/zodiark/zodiark.dtsi create mode 100644 app/boards/shields/zodiark/zodiark.keymap create mode 100644 app/boards/shields/zodiark/zodiark.zmk.yml create mode 100644 app/boards/shields/zodiark/zodiark_left.overlay create mode 100644 app/boards/shields/zodiark/zodiark_right.overlay diff --git a/app/boards/shields/zodiark/Kconfig.defconfig b/app/boards/shields/zodiark/Kconfig.defconfig new file mode 100644 index 00000000..cdad43f6 --- /dev/null +++ b/app/boards/shields/zodiark/Kconfig.defconfig @@ -0,0 +1,55 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if SHIELD_ZODIARK_LEFT + +config ZMK_KEYBOARD_NAME + default "Zodiark" + +config ZMK_SPLIT_BLE_ROLE_CENTRAL + default y + +endif + +if SHIELD_ZODIARK_LEFT || SHIELD_ZODIARK_RIGHT + +config ZMK_SPLIT + default y + +if ZMK_DISPLAY + +config I2C + default y + +config SSD1306 + default y + +config SSD1306_REVERSE_MODE + default y + +endif # ZMK_DISPLAY + +if LVGL + +config LVGL_HOR_RES_MAX + default 128 + +config LVGL_VER_RES_MAX + default 64 + +config LVGL_VDB_SIZE + default 64 + +config LVGL_DPI + default 148 + +config LVGL_BITS_PER_PIXEL + default 1 + +choice LVGL_COLOR_DEPTH + default LVGL_COLOR_DEPTH_1 +endchoice + +endif # LVGL + +endif diff --git a/app/boards/shields/zodiark/Kconfig.shield b/app/boards/shields/zodiark/Kconfig.shield new file mode 100644 index 00000000..25e23a14 --- /dev/null +++ b/app/boards/shields/zodiark/Kconfig.shield @@ -0,0 +1,8 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +config SHIELD_ZODIARK_LEFT + def_bool $(shields_list_contains,zodiark_left) + +config SHIELD_ZODIARK_RIGHT + def_bool $(shields_list_contains,zodiark_right) diff --git a/app/boards/shields/zodiark/zodiark.conf b/app/boards/shields/zodiark/zodiark.conf new file mode 100644 index 00000000..64784850 --- /dev/null +++ b/app/boards/shields/zodiark/zodiark.conf @@ -0,0 +1,9 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +# Uncomment the following line to enable the Zodiark OLED Display +# CONFIG_ZMK_DISPLAY=y + +# Uncomment these two lines to add support for encoders +# CONFIG_EC11=y +# CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y diff --git a/app/boards/shields/zodiark/zodiark.dtsi b/app/boards/shields/zodiark/zodiark.dtsi new file mode 100644 index 00000000..0adb7f67 --- /dev/null +++ b/app/boards/shields/zodiark/zodiark.dtsi @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <18>; + rows = <4>; +// | SW6 | SW5 | SW4 | SW3 | SW2 | SW1 | | SW1 | SW2 | SW3 | SW4 | SW5 | SW6 | +// | SW13 | SW12 | SW11 | SW10 | SW9 | SW8 | SW7 | | SW7 | SW8 | SW9 | SW10 | SW11 | SW12 | SW13 | +// | SW20 | SW19 | SW18 | SW17 | SW16 | SW15 | SW14 | | SW14 | SW15 | SW16 | SW17 | SW18 | SW19 | SW20 | +// | SW28 | SW27 | SW26 | SW25 | SW24 | SW23 | SW22 | SW21 | | SW21 | SW22 | SW23 | SW24 | SW25 | SW26 | SW27 | SW28 | +// | SW35 | SW34 | SW33 | SW32 | SW31 | SW30 | SW29 | | SW29 | SW30 | SW31 | SW32 | SW33 | SW34 | SW35 | + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5) RC(0,8) RC(0,9) RC(0,10) RC(0,11) RC(0,12) RC(0,13) +RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5) RC(0,6) RC(0,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11) RC(1,12) RC(1,13) +RC(2,0) RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5) RC(1,6) RC(1,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12) RC(2,13) +RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(2,6) RC(3,6) RC(3,7) RC(2,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11) RC(3,12) RC(3,13) +RC(4,0) RC(4,1) RC(4,2) RC(4,3) RC(4,4) RC(4,5) RC(4,6) RC(4,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + row-gpios + = <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + , <&pro_micro 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> + ; + }; + + left_encoder: encoder_left { + compatible = "alps,ec11"; + label = "LEFT_ENCODER"; + a-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + + right_encoder: encoder_right { + compatible = "alps,ec11"; + label = "RIGHT_ENCODER"; + a-gpios = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + b-gpios = <&pro_micro 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>; + resolution = <4>; + status = "disabled"; + }; + + sensors { + compatible = "zmk,keymap-sensors"; + sensors = <&left_encoder &right_encoder>; + }; +}; + +&pro_micro_i2c { + status = "okay"; + + ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <64>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/zodiark/zodiark.keymap b/app/boards/shields/zodiark/zodiark.keymap new file mode 100644 index 00000000..21fdef10 --- /dev/null +++ b/app/boards/shields/zodiark/zodiark.keymap @@ -0,0 +1,69 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { +// ------------------------------------------------------------------------------------------------------------ +// | ESC | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | BKSPC | +// | TAB | Q | W | E | R | T | [ | | ] | Y | U | I | O | P | \ | +// | CAPS | A | S | D | F | G | - | | = | H | J | K | L | ; | ' | +// | SHIFT | Z | X | C | V | B | ` | MUTE | | PRNT | DEL | N | M | , | . | / | ENTER | +// | CTRL | ALT | GUI | MENU | LOWER| SPACE | ENTER | | ENTER | SPACE | RAISE| LEFT | DOWN | UP | RIGHT | + bindings = < +&kp ESC &kp N1 &kp N2 &kp N3 &kp N4 &kp N5 &kp N6 &kp N7 &kp N8 &kp N9 &kp N0 &kp BSPC +&kp TAB &kp Q &kp W &kp E &kp R &kp T &kp LBKT &kp RBKT &kp Y &kp U &kp I &kp O &kp P &kp BSLH +&kp TAB &kp A &kp S &kp D &kp F &kp G &kp MINUS &kp EQUAL &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 GRAVE &kp C_MUTE &kp PSCRN &kp DEL &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RET +&kp LCTRL &kp LALT &kp LGUI &kp K_CMENU &mo 1 &kp SPACE &kp RET &kp RET &kp SPACE &mo 2 &kp LEFT &kp DOWN &kp UP &kp RIGHT + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + + lower_layer { +// ------------------------------------------------------------------------------------------------------------ +// | | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | F11 | +// | N.LC | 7 | 8 | 9 |PRTSC | SCRLK| | | | PAUSE| | 7 | 8 | 9 | F12 | +// | | 4 | 5 | 6 | INS | HOME | | | | PGUP| | 4 | 5 | 6 | | +// | | 1 | 2 | 3 | DEL | END | | | | | | PGDN| | 1 | 2 | 3 | | +// | | 0 | . | Enter| | | | | | | | 0 | . | Enter | | + bindings = < +&trans &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 +&kp KP_NUM &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp PSCRN &kp SLCK &trans &trans &kp PAUSE_BREAK &trans &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp F12 +&trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp INS &kp HOME &trans &trans &kp PG_UP &trans &kp KP_N4 &kp KP_N5 &kp KP_N6 &trans +&trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp DEL &kp END &trans &trans &trans &trans &kp PG_DN &trans &kp KP_N1 &kp KP_N2 &kp KP_N3 &trans +&trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + + raise_layer { +// ------------------------------------------------------------------------------------------------------------ +// |BTCLR | BT1 | BT2 | BT3 | BT4 | BT5 | | | | | | | RESET | +// | | | | | | | | | | | | | | |BLOADER| +// | | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | | | | | | +// | | | | | | | | | | | | | | | | + bindings = < +&bt BT_CLR &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &trans &trans &trans &trans &trans &reset +&trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &trans &bootloader +&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 + >; + + sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN &inc_dec_kp PG_UP PG_DN>; + }; + }; +}; diff --git a/app/boards/shields/zodiark/zodiark.zmk.yml b/app/boards/shields/zodiark/zodiark.zmk.yml new file mode 100644 index 00000000..fc685881 --- /dev/null +++ b/app/boards/shields/zodiark/zodiark.zmk.yml @@ -0,0 +1,14 @@ +file_format: "1" +id: zodiark +name: Zodiark +type: shield +url: https://www.splitlogic.xyz/buildguides/zodiark-build-guide +requires: [pro_micro] +exposes: [i2c_oled] +features: + - keys + - display + - encoder +siblings: + - zodiark_left + - zodiark_right diff --git a/app/boards/shields/zodiark/zodiark_left.overlay b/app/boards/shields/zodiark/zodiark_left.overlay new file mode 100644 index 00000000..fe55edc6 --- /dev/null +++ b/app/boards/shields/zodiark/zodiark_left.overlay @@ -0,0 +1,23 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "zodiark.dtsi" + +&kscan0 { + col-gpios + = <&pro_micro 2 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 10 GPIO_ACTIVE_HIGH> + ; +}; + +&left_encoder { + status = "okay"; +}; diff --git a/app/boards/shields/zodiark/zodiark_right.overlay b/app/boards/shields/zodiark/zodiark_right.overlay new file mode 100644 index 00000000..3405f59b --- /dev/null +++ b/app/boards/shields/zodiark/zodiark_right.overlay @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include "zodiark.dtsi" + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + col-gpios + = <&pro_micro 10 GPIO_ACTIVE_HIGH> + , <&pro_micro 16 GPIO_ACTIVE_HIGH> + , <&pro_micro 14 GPIO_ACTIVE_HIGH> + , <&pro_micro 15 GPIO_ACTIVE_HIGH> + , <&pro_micro 0 GPIO_ACTIVE_HIGH> + , <&pro_micro 1 GPIO_ACTIVE_HIGH> + , <&pro_micro 2 GPIO_ACTIVE_HIGH> + ; +}; + +&right_encoder { + status = "okay"; +}; From 91ba034896c3b1668b88286e18d8f38314ec39c3 Mon Sep 17 00:00:00 2001 From: Pete Johanson Date: Mon, 15 Mar 2021 00:40:09 -0400 Subject: [PATCH 4/5] feat(hid): Configurable NKRO HID report support. * Add Kconfig settings for NKRO or HKRO (boot compatible), HID report types for keyboard page. * Updated report storage and set/unset for each config. --- app/Kconfig | 40 +++++++++++++++++++++++++++++++++-- app/include/zmk/hid.h | 49 ++++++++++++++++++++++++++++++++++--------- app/src/hid.c | 44 ++++++++++++++++++++++++++++++++++---- 3 files changed, 117 insertions(+), 16 deletions(-) diff --git a/app/Kconfig b/app/Kconfig index f23930b4..629dfa70 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -25,7 +25,40 @@ config USB_DEVICE_PID config USB_DEVICE_MANUFACTURER default "ZMK Project" -menu "HID Output Types" +menu "HID" + +choice ZMK_HID_REPORT_TYPE + prompt "HID Report Type" + +config ZMK_HID_REPORT_TYPE_HKRO + bool "#-Key Roll Over (HKRO) HID Report" + help + Enable # key roll over for HID report. This selection is "boot keyboard" compatible + but limits the total number of possible keys to report as held to #. + +config ZMK_HID_REPORT_TYPE_NKRO + bool "Full N-Key Roll Over (NKRO) HID Report" + help + Enable full N-Key Roll Over for HID output. This selection will prevent the keyboard + from working with some BIOS/UEFI versions that only support "boot keyboard" support. + This option also prevents using some infrequently used higher range HID usages. + +endchoice + +if ZMK_HID_REPORT_TYPE_HKRO + +config ZMK_HID_KEYBOARD_REPORT_SIZE + int "# Keyboard Keys Reportable" + default 6 + + +endif + +config ZMK_HID_CONSUMER_REPORT_SIZE + int "# Consumer Keys Reportable" + default 6 + +menu "Output Types" config ZMK_USB bool "USB" @@ -92,7 +125,10 @@ config ZMK_BLE_PASSKEY_ENTRY #ZMK_BLE endif -#HID Output Types +#Output Types +endmenu + +# HID endmenu menu "Split Support" diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index 5aa004c2..be88c175 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -13,12 +13,10 @@ #include #include +#define ZMK_HID_KEYBOARD_NKRO_MAX_USAGE HID_USAGE_KEY_KEYPAD_EQUAL + #define COLLECTION_REPORT 0x03 -#define ZMK_HID_KEYBOARD_NKRO_SIZE 6 - -#define ZMK_HID_CONSUMER_NKRO_SIZE 6 - static const uint8_t zmk_hid_report_desc[] = { /* USAGE_PAGE (Generic Desktop) */ HID_GI_USAGE_PAGE, @@ -74,6 +72,30 @@ static const uint8_t zmk_hid_report_desc[] = { /* USAGE_PAGE (Keyboard/Keypad) */ HID_GI_USAGE_PAGE, HID_USAGE_KEY, + +#if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) + /* LOGICAL_MINIMUM (0) */ + HID_GI_LOGICAL_MIN(1), + 0x00, + /* LOGICAL_MAXIMUM (1) */ + HID_GI_LOGICAL_MAX(1), + 0x01, + /* USAGE_MINIMUM (Reserved) */ + HID_LI_USAGE_MIN(1), + 0x00, + /* USAGE_MAXIMUM (Keyboard Application) */ + HID_LI_USAGE_MAX(1), + ZMK_HID_KEYBOARD_NKRO_MAX_USAGE, + /* REPORT_SIZE (8) */ + HID_GI_REPORT_SIZE, + 0x01, + /* REPORT_COUNT (6) */ + HID_GI_REPORT_COUNT, + ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1, + /* INPUT (Data,Ary,Abs) */ + HID_MI_INPUT, + 0x02, +#elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) /* LOGICAL_MINIMUM (0) */ HID_GI_LOGICAL_MIN(1), 0x00, @@ -89,12 +111,15 @@ static const uint8_t zmk_hid_report_desc[] = { /* REPORT_SIZE (1) */ HID_GI_REPORT_SIZE, 0x08, - /* REPORT_COUNT (ZMK_HID_KEYBOARD_NKRO_SIZE) */ + /* REPORT_COUNT (CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE) */ HID_GI_REPORT_COUNT, - ZMK_HID_KEYBOARD_NKRO_SIZE, + CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE, /* INPUT (Data,Ary,Abs) */ HID_MI_INPUT, 0x00, +#else +#error "A proper HID report type must be selected" +#endif /* END_COLLECTION */ HID_MI_COLLECTION_END, @@ -130,9 +155,9 @@ static const uint8_t zmk_hid_report_desc[] = { /* REPORT_SIZE (16) */ HID_GI_REPORT_SIZE, 0x10, - /* REPORT_COUNT (ZMK_HID_CONSUMER_NKRO_SIZE) */ + /* REPORT_COUNT (CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE) */ HID_GI_REPORT_COUNT, - ZMK_HID_CONSUMER_NKRO_SIZE, + CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE, HID_MI_INPUT, 0x00, /* END COLLECTION */ @@ -149,7 +174,11 @@ static const uint8_t zmk_hid_report_desc[] = { struct zmk_hid_keyboard_report_body { zmk_mod_flags_t modifiers; uint8_t _reserved; - uint8_t keys[ZMK_HID_KEYBOARD_NKRO_SIZE]; +#if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) + uint8_t keys[(ZMK_HID_KEYBOARD_NKRO_MAX_USAGE + 1) / 8]; +#elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) + uint8_t keys[CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE]; +#endif } __packed; struct zmk_hid_keyboard_report { @@ -158,7 +187,7 @@ struct zmk_hid_keyboard_report { } __packed; struct zmk_hid_consumer_report_body { - uint16_t keys[ZMK_HID_CONSUMER_NKRO_SIZE]; + uint16_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE]; } __packed; struct zmk_hid_consumer_report { diff --git a/app/src/hid.c b/app/src/hid.c index 7ab080e5..756ed900 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -69,8 +69,30 @@ int zmk_hid_unregister_mods(zmk_mod_flags_t modifiers) { return 0; } +#if IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_NKRO) + +#define TOGGLE_KEYBOARD(code, val) WRITE_BIT(keyboard_report.body.keys[code / 8], code % 8, val) + +static inline int select_keyboard_usage(zmk_key_t usage) { + if (usage > ZMK_HID_KEYBOARD_NKRO_MAX_USAGE) { + return -EINVAL; + } + TOGGLE_KEYBOARD(usage, 1); + return 0; +} + +static inline int deselect_keyboard_usage(zmk_key_t usage) { + if (usage > ZMK_HID_KEYBOARD_NKRO_MAX_USAGE) { + return -EINVAL; + } + TOGGLE_KEYBOARD(usage, 0); + return 0; +} + +#elif IS_ENABLED(CONFIG_ZMK_HID_REPORT_TYPE_HKRO) + #define TOGGLE_KEYBOARD(match, val) \ - for (int idx = 0; idx < ZMK_HID_KEYBOARD_NKRO_SIZE; idx++) { \ + for (int idx = 0; idx < CONFIG_ZMK_HID_KEYBOARD_REPORT_SIZE; idx++) { \ if (keyboard_report.body.keys[idx] != match) { \ continue; \ } \ @@ -80,8 +102,22 @@ int zmk_hid_unregister_mods(zmk_mod_flags_t modifiers) { } \ } +static inline int select_keyboard_usage(zmk_key_t usage) { + TOGGLE_KEYBOARD(0U, usage); + return 0; +} + +static inline int deselect_keyboard_usage(zmk_key_t usage) { + TOGGLE_KEYBOARD(usage, 0U); + return 0; +} + +#else +#error "A proper HID report type must be selected" +#endif + #define TOGGLE_CONSUMER(match, val) \ - for (int idx = 0; idx < ZMK_HID_CONSUMER_NKRO_SIZE; idx++) { \ + for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { \ if (consumer_report.body.keys[idx] != match) { \ continue; \ } \ @@ -105,7 +141,7 @@ int zmk_hid_keyboard_press(zmk_key_t code) { if (code >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && code <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI) { return zmk_hid_register_mod(code - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL); } - TOGGLE_KEYBOARD(0U, code); + select_keyboard_usage(code); return 0; }; @@ -113,7 +149,7 @@ int zmk_hid_keyboard_release(zmk_key_t code) { if (code >= HID_USAGE_KEY_KEYBOARD_LEFTCONTROL && code <= HID_USAGE_KEY_KEYBOARD_RIGHT_GUI) { return zmk_hid_unregister_mod(code - HID_USAGE_KEY_KEYBOARD_LEFTCONTROL); } - TOGGLE_KEYBOARD(code, 0U); + deselect_keyboard_usage(code); return 0; }; From bc179b1030ccf9dd02818f77ecd9b5b9f14e85b7 Mon Sep 17 00:00:00 2001 From: Peter Johanson Date: Tue, 5 Oct 2021 02:41:56 +0000 Subject: [PATCH 5/5] feat(hid): Kconfig for basic/full consumer usages. * Add ZMK_HID_CONSUMER_REPORT_USAGES choice to allow choosing between full consumer usage range, with poor OS compat, or basic consumer usage range, with broader compat. --- app/Kconfig | 19 ++++++++++++++++++- app/include/zmk/hid.h | 25 +++++++++++++++++++++++++ app/src/hid.c | 2 ++ 3 files changed, 45 insertions(+), 1 deletion(-) diff --git a/app/Kconfig b/app/Kconfig index 629dfa70..35bf77da 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -51,13 +51,30 @@ config ZMK_HID_KEYBOARD_REPORT_SIZE int "# Keyboard Keys Reportable" default 6 - endif config ZMK_HID_CONSUMER_REPORT_SIZE int "# Consumer Keys Reportable" default 6 + +choice ZMK_HID_CONSUMER_REPORT_USAGES + prompt "HID Report Type" + +config ZMK_HID_CONSUMER_REPORT_USAGES_FULL + bool "Full Consumer HID Usage Support" + help + Enable full Consumer usage ID values to be sent to hosts. Allows for less + frequently used usages, but has compatibability issues with some host OSes. + +config ZMK_HID_CONSUMER_REPORT_USAGES_BASIC + bool "Basic Consumer HID Usage Support" + help + Enable Consumer usage ID values up to "Playback Speed - Slow" to be sent to + hosts. Allows for broader compatibability with more host OSes. + +endchoice + menu "Output Types" config ZMK_USB diff --git a/app/include/zmk/hid.h b/app/include/zmk/hid.h index be88c175..95b82d46 100644 --- a/app/include/zmk/hid.h +++ b/app/include/zmk/hid.h @@ -138,6 +138,24 @@ static const uint8_t zmk_hid_report_desc[] = { /* USAGE_PAGE (Consumer) */ HID_GI_USAGE_PAGE, HID_USAGE_CONSUMER, + +#if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) + /* LOGICAL_MINIMUM (0) */ + HID_GI_LOGICAL_MIN(1), + 0x00, + /* LOGICAL_MAXIMUM (0xFFFF) */ + HID_GI_LOGICAL_MAX(1), + 0xFF, + HID_LI_USAGE_MIN(1), + 0x00, + /* USAGE_MAXIMUM (0xFFFF) */ + HID_LI_USAGE_MAX(1), + 0xFF, + /* INPUT (Data,Ary,Abs) */ + /* REPORT_SIZE (8) */ + HID_GI_REPORT_SIZE, + 0x08, +#elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL) /* LOGICAL_MINIMUM (0) */ HID_GI_LOGICAL_MIN(1), 0x00, @@ -155,6 +173,9 @@ static const uint8_t zmk_hid_report_desc[] = { /* REPORT_SIZE (16) */ HID_GI_REPORT_SIZE, 0x10, +#else +#error "A proper consumer HID report usage range must be selected" +#endif /* REPORT_COUNT (CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE) */ HID_GI_REPORT_COUNT, CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE, @@ -187,7 +208,11 @@ struct zmk_hid_keyboard_report { } __packed; struct zmk_hid_consumer_report_body { +#if IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC) + uint8_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE]; +#elif IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_FULL) uint16_t keys[CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE]; +#endif } __packed; struct zmk_hid_consumer_report { diff --git a/app/src/hid.c b/app/src/hid.c index 756ed900..b524b09f 100644 --- a/app/src/hid.c +++ b/app/src/hid.c @@ -117,6 +117,8 @@ static inline int deselect_keyboard_usage(zmk_key_t usage) { #endif #define TOGGLE_CONSUMER(match, val) \ + COND_CODE_1(IS_ENABLED(CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC), \ + (if (val > 0xFF) { return -ENOTSUP; }), ()) \ for (int idx = 0; idx < CONFIG_ZMK_HID_CONSUMER_REPORT_SIZE; idx++) { \ if (consumer_report.body.keys[idx] != match) { \ continue; \