From 6e9049298b697a9da575e43815b2847b4ca32a3d Mon Sep 17 00:00:00 2001 From: moergo-sc Date: Sun, 19 Sep 2021 13:05:21 +1200 Subject: [PATCH] Glove80 v0 and v1 board definitions --- .gitattributes | 1 + .gitignore | 7 +- app/boards/arm/glove80/CMakeLists.txt | 3 + app/boards/arm/glove80/Kconfig | 7 + app/boards/arm/glove80/Kconfig.board | 13 ++ app/boards/arm/glove80/Kconfig.defconfig | 66 ++++++++ app/boards/arm/glove80/board.cmake | 5 + app/boards/arm/glove80/glove80.dtsi | 107 ++++++++++++ app/boards/arm/glove80/glove80.keymap | 153 ++++++++++++++++++ app/boards/arm/glove80/glove80_lh.dts | 138 ++++++++++++++++ app/boards/arm/glove80/glove80_lh.keymap | 1 + app/boards/arm/glove80/glove80_lh.yaml | 15 ++ app/boards/arm/glove80/glove80_lh.yml | 10 ++ app/boards/arm/glove80/glove80_lh_defconfig | 79 +++++++++ app/boards/arm/glove80/glove80_rh.dts | 116 +++++++++++++ app/boards/arm/glove80/glove80_rh.keymap | 1 + app/boards/arm/glove80/glove80_rh.yaml | 15 ++ app/boards/arm/glove80/glove80_rh.yml | 10 ++ app/boards/arm/glove80/glove80_rh_defconfig | 77 +++++++++ app/boards/arm/glove80/usb_serial_number.c | 67 ++++++++ app/boards/arm/glove80_v0/Kconfig | 7 + app/boards/arm/glove80_v0/Kconfig.board | 13 ++ app/boards/arm/glove80_v0/Kconfig.defconfig | 63 ++++++++ app/boards/arm/glove80_v0/board.cmake | 5 + app/boards/arm/glove80_v0/glove80_v0.dtsi | 107 ++++++++++++ app/boards/arm/glove80_v0/glove80_v0.keymap | 57 +++++++ app/boards/arm/glove80_v0/glove80_v0_lh.dts | 118 ++++++++++++++ .../arm/glove80_v0/glove80_v0_lh.keymap | 1 + app/boards/arm/glove80_v0/glove80_v0_lh.yaml | 15 ++ app/boards/arm/glove80_v0/glove80_v0_lh.yml | 10 ++ .../arm/glove80_v0/glove80_v0_lh_defconfig | 49 ++++++ app/boards/arm/glove80_v0/glove80_v0_rh.dts | 120 ++++++++++++++ .../arm/glove80_v0/glove80_v0_rh.keymap | 1 + app/boards/arm/glove80_v0/glove80_v0_rh.yaml | 15 ++ app/boards/arm/glove80_v0/glove80_v0_rh.yml | 10 ++ .../arm/glove80_v0/glove80_v0_rh_defconfig | 49 ++++++ 36 files changed, 1530 insertions(+), 1 deletion(-) create mode 100644 app/boards/arm/glove80/CMakeLists.txt create mode 100644 app/boards/arm/glove80/Kconfig create mode 100644 app/boards/arm/glove80/Kconfig.board create mode 100644 app/boards/arm/glove80/Kconfig.defconfig create mode 100644 app/boards/arm/glove80/board.cmake create mode 100644 app/boards/arm/glove80/glove80.dtsi create mode 100644 app/boards/arm/glove80/glove80.keymap create mode 100644 app/boards/arm/glove80/glove80_lh.dts create mode 100644 app/boards/arm/glove80/glove80_lh.keymap create mode 100644 app/boards/arm/glove80/glove80_lh.yaml create mode 100644 app/boards/arm/glove80/glove80_lh.yml create mode 100644 app/boards/arm/glove80/glove80_lh_defconfig create mode 100644 app/boards/arm/glove80/glove80_rh.dts create mode 100644 app/boards/arm/glove80/glove80_rh.keymap create mode 100644 app/boards/arm/glove80/glove80_rh.yaml create mode 100644 app/boards/arm/glove80/glove80_rh.yml create mode 100644 app/boards/arm/glove80/glove80_rh_defconfig create mode 100644 app/boards/arm/glove80/usb_serial_number.c create mode 100644 app/boards/arm/glove80_v0/Kconfig create mode 100644 app/boards/arm/glove80_v0/Kconfig.board create mode 100644 app/boards/arm/glove80_v0/Kconfig.defconfig create mode 100644 app/boards/arm/glove80_v0/board.cmake create mode 100644 app/boards/arm/glove80_v0/glove80_v0.dtsi create mode 100644 app/boards/arm/glove80_v0/glove80_v0.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.dts create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yaml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh.yml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_lh_defconfig create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.dts create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.keymap create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yaml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh.yml create mode 100644 app/boards/arm/glove80_v0/glove80_v0_rh_defconfig diff --git a/.gitattributes b/.gitattributes index 3d05d86d31a..af12493a041 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4,3 +4,4 @@ # Docker on Windows. .bashrc text eol=lf *.sh text eol=lf +*.nix text eol=lf diff --git a/.gitignore b/.gitignore index 93c801d9aa9..f628f383b1c 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,9 @@ /zmk-config /build *.DS_Store -__pycache__ \ No newline at end of file +__pycache__ +workspace.code-workspace +*.uf2 +left +result +right diff --git a/app/boards/arm/glove80/CMakeLists.txt b/app/boards/arm/glove80/CMakeLists.txt new file mode 100644 index 00000000000..3eb2cd276ea --- /dev/null +++ b/app/boards/arm/glove80/CMakeLists.txt @@ -0,0 +1,3 @@ +zephyr_library() +zephyr_library_sources(usb_serial_number.c) +zephyr_library_include_directories(${ZEPHYR_BASE}/drivers) diff --git a/app/boards/arm/glove80/Kconfig b/app/boards/arm/glove80/Kconfig new file mode 100644 index 00000000000..8914d2acb46 --- /dev/null +++ b/app/boards/arm/glove80/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_GLOVE80_LH || BOARD_GLOVE80_RH) diff --git a/app/boards/arm/glove80/Kconfig.board b/app/boards/arm/glove80/Kconfig.board new file mode 100644 index 00000000000..ff20b075a1f --- /dev/null +++ b/app/boards/arm/glove80/Kconfig.board @@ -0,0 +1,13 @@ +# nice!nano board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_LH + bool "Glove80 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GLOVE80_RH + bool "Glove80 RH" + depends on SOC_NRF52840_QIAA + diff --git a/app/boards/arm/glove80/Kconfig.defconfig b/app/boards/arm/glove80/Kconfig.defconfig new file mode 100644 index 00000000000..bebbace34e8 --- /dev/null +++ b/app/boards/arm/glove80/Kconfig.defconfig @@ -0,0 +1,66 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_GLOVE80_LH +config BOARD + default "glove80 lh" + +config ZMK_SPLIT_BLE_ROLE_CENTRAL + default y + +config ZMK_KEYBOARD_NAME + default "Glove80 Left" +endif # BOARD_GLOVE80_LH + +if BOARD_GLOVE80_RH +config BOARD + default "glove80 rh" + +config ZMK_KEYBOARD_NAME + default "Glove80 Right" +endif # BOARD_GLOVE80_RH + +if BOARD_GLOVE80_LH || BOARD_GLOVE80_RH + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +config ZMK_BATTERY_VOLTAGE_DIVIDER + default y + +config ZMK_BATTERY_NRF_VDDH + default y + +config ZMK_KSCAN_MATRIX_WAIT_BETWEEN_OUTPUTS + default 5 + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT + +endif # BOARD_GLOVE80_LH || BOARD_GLOVE80_RH diff --git a/app/boards/arm/glove80/board.cmake b/app/boards/arm/glove80/board.cmake new file mode 100644 index 00000000000..fa847d50595 --- /dev/null +++ b/app/boards/arm/glove80/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/glove80/glove80.dtsi b/app/boards/arm/glove80/glove80.dtsi new file mode 100644 index 00000000000..46066505335 --- /dev/null +++ b/app/boards/arm/glove80/glove80.dtsi @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020 Pete Johanson + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <6>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) 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(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(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(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(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) +RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "col2row"; + debounce-press-ms = <1>; + debounce-release-ms = <10>; + }; + +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + diff --git a/app/boards/arm/glove80/glove80.keymap b/app/boards/arm/glove80/glove80.keymap new file mode 100644 index 00000000000..d46e373c21e --- /dev/null +++ b/app/boards/arm/glove80/glove80.keymap @@ -0,0 +1,153 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +#define HYPER LC(LS(LG(LALT))) + +// layers +#define DEFAULT 0 +#define LOWER 1 +#define MAGIC 2 +#define FACTORY_TEST 3 + +/ { + behaviors { + // For the "layer" key, it'd nice to be able to use it as either a shift or a toggle. + // Configure it as a tap dance, so the first tap (or hold) is a &mo and the second tap is a &to + layer_td: tap_dance_0 { + compatible = "zmk,behavior-tap-dance"; + label = "LAYER_TAP_DANCE"; + #binding-cells = <0>; + tapping-term-ms = <200>; + bindings = <&mo LOWER>, <&to LOWER>; + }; + }; + + macros { + rgb_ug_status_macro: rgb_ug_status_macro_0 { + label = "RGB_UG_STATUS"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&rgb_ug RGB_STATUS>; + }; + }; + + macros { + bt_0: bt_profile_macro_0 { + label = "BT_0"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 0>; + }; + }; + + macros { + bt_1: bt_profile_macro_1 { + label = "BT_1"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 1>; + }; + }; + + macros { + bt_2: bt_profile_macro_2 { + label = "BT_2"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 2>; + }; + }; + + macros { + bt_3: bt_profile_macro_3 { + label = "BT_3"; + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + bindings + = <&out OUT_BLE>, + <&bt BT_SEL 3>; + }; + }; + + magic: magic_hold_tap { + compatible = "zmk,behavior-hold-tap"; + label = "MAGIC_HOLD_TAP"; + #binding-cells = <2>; + flavor = "tap-preferred"; + tapping-term-ms = <200>; + bindings = <&mo>, <&rgb_ug_status_macro>; + }; + + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | + // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | + // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | + + bindings = < + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 + &kp EQUAL &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 ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &layer_td &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP + &magic MAGIC 0 &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN + >; + }; + + lower_layer { + bindings = < + &kp C_BRI_DN &kp C_BRI_UP &kp C_PREV &kp C_NEXT &kp C_PP &kp C_MUTE &kp C_VOL_DN &kp C_VOL_UP &none &kp PAUSE_BREAK + &trans &none &none &none &none &kp HOME &kp LPAR &kp KP_NUM &kp KP_EQUAL &kp KP_DIVIDE &kp KP_MULTIPLY &kp PSCRN + &trans &none &none &kp UP &none &kp END &kp RPAR &kp KP_N7 &kp KP_N8 &kp KP_N9 &kp KP_MINUS &kp SLCK + &trans &none &kp LEFT &kp DOWN &kp RIGHT &kp PG_UP &kp PRCNT &kp KP_N4 &kp KP_N5 &kp KP_N6 &kp KP_PLUS &none + &trans &kp K_CMENU &none &kp F11 &kp F12 &kp PG_DN &trans &trans &to DEFAULT &trans &trans &trans &kp COMMA &kp KP_N1 &kp KP_N2 &kp KP_N3 &kp KP_ENTER &trans + &trans &kp CAPS &kp INS &kp F11 &kp F12 &trans &trans &trans &trans &trans &trans &kp KP_N0 &kp KP_N0 &kp KP_DOT &kp KP_ENTER &trans + >; + }; + + magic_layer { + bindings = < + &bt BT_CLR &none &none &none &none &none &none &none &none &bt BT_CLR_ALL + &none &none &none &none &none &none &none &none &none &none &none &none + &none &rgb_ug RGB_SPI &rgb_ug RGB_SAI &rgb_ug RGB_HUI &rgb_ug RGB_BRI &rgb_ug RGB_TOG &none &none &none &none &none &none + &bootloader &rgb_ug RGB_SPD &rgb_ug RGB_SAD &rgb_ug RGB_HUD &rgb_ug RGB_BRD &rgb_ug RGB_EFF &none &none &none &none &none &bootloader + &reset &none &none &none &none &none &bt_2 &bt_3 &none &none &none &none &none &none &none &none &none &reset + &none &none &none &none &none &bt_0 &bt_1 &out OUT_USB &none &none &none &none &none &none &none &to FACTORY_TEST + >; + }; + + factory_test_layer { + bindings = < + &kp N0 &kp N6 &kp N2 &kp N8 &kp N4 &kp N4 &kp N8 &kp N2 &kp N6 &kp N0 + &kp N1 &kp N7 &kp N3 &kp N9 &kp N5 &kp N0 &kp N0 &kp N5 &kp N9 &kp N3 &kp N7 &kp N1 + &kp N2 &kp N8 &kp N4 &kp N0 &kp N6 &kp N1 &kp N1 &kp N6 &kp N0 &kp N4 &kp N8 &kp N2 + &kp N3 &kp N9 &kp N5 &kp N1 &kp N7 &kp N2 &kp N2 &kp N7 &kp N1 &kp N5 &kp N9 &kp N3 + &kp N4 &kp N0 &kp N6 &kp N2 &kp N8 &kp N3 &kp N4 &kp N5 &kp N6 &kp N6 &kp N5 &kp N4 &kp N3 &kp N8 &kp N2 &kp N6 &kp N0 &kp N4 + &kp N5 &kp N1 &kp N7 &kp N3 &kp N9 &kp N7 &kp N8 &kp N9 &kp N9 &kp N8 &kp N7 &kp N9 &kp N3 &kp N7 &kp N1 &kp N5 + >; + }; + }; +}; diff --git a/app/boards/arm/glove80/glove80_lh.dts b/app/boards/arm/glove80/glove80_lh.dts new file mode 100644 index 00000000000..69bc06d3fd0 --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.dts @@ -0,0 +1,138 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80.dtsi" + +/ { + model = "glove80_lh"; + compatible = "glove80_lh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + zmk,underglow-indicators = &underglow_indicators; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "BACK LED"; + pwm_led_0 { + pwms = <&pwm0 47>; + label = "Back LED configured as backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 5>; + output-ohms = <820000>; + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY-VDDH"; + }; + +/* + MoErgo 40 LEDs + + 34 28 22 16 10 + 35 29 23 17 11 6 + 36 30 24 18 12 7 + 37 31 25 19 13 8 + 38 32 26 20 14 9 + 39 33 27 21 15 + 0 1 2 + 3 4 5 +*/ + + underglow_indicators: underglow-indicators { + compatible = "zmk,underglow-indicators"; + layer-state = <35 29 23 17 11 6>; + bat-lhs = <36 30 24 18 12 7>; + bat-rhs = <37 31 25 19 13 8>; + capslock = <22>; + numlock = <16>; + scrolllock = <10>; + ble-state = <3 4 0 1>; + usb-state = <5>; + output-fallback = <15>; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + mosi-pin = <27>; /* WS2812_VEXT_DATA */ + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <13>; /* Must select a not connected pin */ + miso-pin = <14>; /* Must select a not connected pin */ + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <40>; /* 40 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + ch0-pin = <47>; +}; + + +/* [SC] Pretty sure this is not required +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; +*/ + +&kscan0 { + row-gpios + = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW1 + , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW2 + , <&gpio0 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW3 + , <&gpio0 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW4 + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW5 + , <&gpio1 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH ROW6 + ; + col-gpios + = <&gpio1 8 GPIO_ACTIVE_HIGH> // LH COL6 + , <&gpio1 4 GPIO_ACTIVE_HIGH> // LH COL5 + , <&gpio1 6 GPIO_ACTIVE_HIGH> // LH COL4 + , <&gpio1 7 GPIO_ACTIVE_HIGH> // LH COL3 + , <&gpio1 5 GPIO_ACTIVE_HIGH> // LH COL2 + , <&gpio1 3 GPIO_ACTIVE_HIGH> // LH COL1 + , <&gpio1 1 GPIO_ACTIVE_HIGH> // LH Thumb + ; +}; + diff --git a/app/boards/arm/glove80/glove80_lh.keymap b/app/boards/arm/glove80/glove80_lh.keymap new file mode 100644 index 00000000000..5179ff91f9d --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.keymap @@ -0,0 +1 @@ +#include "glove80.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80/glove80_lh.yaml b/app/boards/arm/glove80/glove80_lh.yaml new file mode 100644 index 00000000000..d0180f3e763 --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_lh +name: Glove80_LH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80/glove80_lh.yml b/app/boards/arm/glove80/glove80_lh.yml new file mode 100644 index 00000000000..3d42c3a9f53 --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_lh +name: Glove80_LH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80/glove80_lh_defconfig b/app/boards/arm/glove80/glove80_lh_defconfig new file mode 100644 index 00000000000..428e671b506 --- /dev/null +++ b/app/boards/arm/glove80/glove80_lh_defconfig @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_LH=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Glove80 Left" +CONFIG_USB_DEVICE_PID=0x27db +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" + +CONFIG_BT_DIS_PNP_PID=0x27db +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Glove80" + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9807B007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring +# BRT_MAX above 80% will draw additional current and can potentially damage your +# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 + +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Default to no logging +CONFIG_ZMK_USB_LOGGING=n + +CONFIG_ZMK_USB_BOOT=y + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n diff --git a/app/boards/arm/glove80/glove80_rh.dts b/app/boards/arm/glove80/glove80_rh.dts new file mode 100644 index 00000000000..8d150ccda6a --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.dts @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80.dtsi" + +/ { + model = "glove80_rh"; + compatible = "glove80_rh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &back_led_backlight; + zmk,battery = &vbatt; + }; + + back_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "BACK LED"; + pwm_led_0 { + pwms = <&pwm0 16>; + label = "Back LED configured as backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 19 GPIO_ACTIVE_HIGH>; /* WS2812_CE */ + init-delay-ms = <100>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 5>; + output-ohms = <820000>; + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY-VDDH"; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + mosi-pin = <13>; /* WS2812_VEXT_DATA */ + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <27>; /* Must select a not connected pin */ + miso-pin = <14>; /* Must select a not connected pin */ + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <4000000>; + + /* WS2812 */ + chain-length = <40>; /* 40 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + ch0-pin = <16>; +}; + + +/* [SC] Pretty sure this is not required +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; +*/ + +/* For right hand, the columns are offset by 7 */ +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW1 + , <&gpio0 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW2 + , <&gpio0 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW3 + , <&gpio1 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW4 + , <&gpio0 11 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW5 + , <&gpio0 12 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH ROW6 + ; + col-gpios + = <&gpio1 6 GPIO_ACTIVE_HIGH> // RH Thumb + , <&gpio1 4 GPIO_ACTIVE_HIGH> // RH COL1 + , <&gpio0 2 GPIO_ACTIVE_HIGH> // RH COL2 + , <&gpio1 7 GPIO_ACTIVE_HIGH> // RH COL3 + , <&gpio1 5 GPIO_ACTIVE_HIGH> // RH COL4 + , <&gpio1 3 GPIO_ACTIVE_HIGH> // RH COL5 + , <&gpio1 1 GPIO_ACTIVE_HIGH> // RH COL6 + ; +}; + diff --git a/app/boards/arm/glove80/glove80_rh.keymap b/app/boards/arm/glove80/glove80_rh.keymap new file mode 100644 index 00000000000..5179ff91f9d --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.keymap @@ -0,0 +1 @@ +#include "glove80.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80/glove80_rh.yaml b/app/boards/arm/glove80/glove80_rh.yaml new file mode 100644 index 00000000000..3a84cdf4774 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_rh +name: Glove80_RH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80/glove80_rh.yml b/app/boards/arm/glove80/glove80_rh.yml new file mode 100644 index 00000000000..b279f9c9390 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_rh +name: Glove80_RH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80/glove80_rh_defconfig b/app/boards/arm/glove80/glove80_rh_defconfig new file mode 100644 index 00000000000..801c38b3175 --- /dev/null +++ b/app/boards/arm/glove80/glove80_rh_defconfig @@ -0,0 +1,77 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_RH=y + +# Keyboard IDs +CONFIG_ZMK_KEYBOARD_NAME="Glove80 Right" +CONFIG_USB_DEVICE_PID=0x27d9 +CONFIG_USB_DEVICE_VID=0x16c0 +CONFIG_USB_DEVICE_MANUFACTURER="MoErgo" +CONFIG_USB_DEVICE_SN="moergo.com:GLV80-0123456789ABCDEF" + +CONFIG_BT_DIS_PNP_PID=0x27d9 +CONFIG_BT_DIS_PNP_VID=0x16c0 +CONFIG_BT_DIS_MANUF="MoErgo" +CONFIG_BT_DIS_MODEL="Glove80 Right" + +# Enable MPU +CONFIG_ARM_MPU=y + +# Enable GPIO +CONFIG_GPIO=y + +# Build configurations +CONFIG_BUILD_OUTPUT_UF2=y +CONFIG_BUILD_OUTPUT_UF2_FAMILY_ID="0x9808B007" +CONFIG_USE_DT_CODE_PARTITION=y + +# Flash configuration +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable 32kHz crystal +CONFIG_CLOCK_CONTROL_NRF_K32SRC_XTAL=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MIN=4 + +# DO NOT CHANGE CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX TO ABOVE 80. Configuring +# BRT_MAX above 80% will draw additional current and can potentially damage your +# computer. WARRANTY IS VOID IF BRT_MAX SET ABOVE 80. +CONFIG_ZMK_RGB_UNDERGLOW_BRT_MAX=80 + +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=16 + +# The power LED is implemented as a backlight +# For now, the power LED is acting as a "USB connected" indicator +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# The full two-byte consumer report space has compatibility issues with some +# operating systems, most notably macOS. Use the more basic single-byte usage +# space. +CONFIG_ZMK_HID_CONSUMER_REPORT_USAGES_BASIC=y + +# Default to no logging +CONFIG_ZMK_USB_LOGGING=n + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n diff --git a/app/boards/arm/glove80/usb_serial_number.c b/app/boards/arm/glove80/usb_serial_number.c new file mode 100644 index 00000000000..6840e807d9f --- /dev/null +++ b/app/boards/arm/glove80/usb_serial_number.c @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include "usb_descriptor.h" + +#define LOG_LEVEL CONFIG_USB_DEVICE_LOG_LEVEL +#include +LOG_MODULE_DECLARE(usb_descriptor); + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize); + +uint8_t *usb_update_sn_string_descriptor(void) { + /* + * nrf52840 hwinfo returns a 64-bit hardware id. Glove80 uses this as a + * serial number, encoded as base16 into the last 16 characters of the + * CONFIG_USB_DEVICE_SN template. If insufficient template space is + * available, instead return the static serial number string. + */ + const uint8_t template_len = sizeof(CONFIG_USB_DEVICE_SN); + const uint8_t sn_len = 16; + + if (template_len < sn_len + 1) { + LOG_DBG("Serial number template too short"); + return CONFIG_USB_DEVICE_SN; + } + + static uint8_t serial[sizeof(CONFIG_USB_DEVICE_SN)]; + strncpy(serial, CONFIG_USB_DEVICE_SN, template_len); + + uint8_t hwid[8]; + memset(hwid, 0, sizeof(hwid)); + uint8_t hwlen = hwinfo_get_device_id(hwid, sizeof(hwid)); + + if (hwlen > 0) { + const uint8_t offset = template_len - sn_len - 1; + LOG_HEXDUMP_DBG(&hwid, sn_len, "Serial Number"); + base16_encode(hwid, hwlen, serial + offset, sn_len + 1); + } + + return serial; +} + +int base16_encode(const uint8_t *data, int length, uint8_t *result, int bufSize) { + const char hex[] = "0123456789ABCDEF"; + + int i = 0; + while (i < bufSize && i < length * 2) { + uint8_t nibble; + if (i % 2 == 0) { + nibble = data[i / 2] >> 4; + } else { + nibble = data[i / 2] & 0xF; + } + result[i] = hex[nibble]; + ++i; + } + if (i < bufSize) { + result[i] = '\0'; + } + return i; +} diff --git a/app/boards/arm/glove80_v0/Kconfig b/app/boards/arm/glove80_v0/Kconfig new file mode 100644 index 00000000000..13216bf9150 --- /dev/null +++ b/app/boards/arm/glove80_v0/Kconfig @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: MIT + +config BOARD_ENABLE_DCDC + bool "Enable DCDC mode" + select SOC_DCDC_NRF52X + default y + depends on (BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH) diff --git a/app/boards/arm/glove80_v0/Kconfig.board b/app/boards/arm/glove80_v0/Kconfig.board new file mode 100644 index 00000000000..421e8540594 --- /dev/null +++ b/app/boards/arm/glove80_v0/Kconfig.board @@ -0,0 +1,13 @@ +# nice!nano board configuration + +# Copyright (c) 2020 Pete Johanson +# SPDX-License-Identifier: MIT + +config BOARD_GLOVE80_V0_LH + bool "Glove80 v0 LH" + depends on SOC_NRF52840_QIAA + +config BOARD_GLOVE80_V0_RH + bool "Glove80 v0 RH" + depends on SOC_NRF52840_QIAA + diff --git a/app/boards/arm/glove80_v0/Kconfig.defconfig b/app/boards/arm/glove80_v0/Kconfig.defconfig new file mode 100644 index 00000000000..82ef9ce9f26 --- /dev/null +++ b/app/boards/arm/glove80_v0/Kconfig.defconfig @@ -0,0 +1,63 @@ +# Copyright (c) 2021 The ZMK Contributors +# SPDX-License-Identifier: MIT + +if BOARD_GLOVE80_V0_LH +config BOARD + default "glove80 v0 lh" + +config ZMK_SPLIT_BLE_ROLE_CENTRAL + default y + +config ZMK_KEYBOARD_NAME + default "Glove80 V0 Left" +endif # BOARD_GLOVE80_V0_LH + +if BOARD_GLOVE80_V0_RH +config BOARD + default "glove80 v0 rh" + +config ZMK_KEYBOARD_NAME + default "Glove80 V0 Right" +endif # BOARD_GLOVE80_V0_RH + +if BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH + +config ZMK_SPLIT + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +config ZMK_BATTERY_VOLTAGE_DIVIDER + default y + +config ZMK_BATTERY_NRF_VDDH + default y + +if USB + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +endif # USB + +if ZMK_BACKLIGHT + +config PWM + default y + +config LED_PWM + default y + +endif # ZMK_BACKLIGHT + +endif # BOARD_GLOVE80_V0_LH || BOARD_GLOVE80_V0_RH diff --git a/app/boards/arm/glove80_v0/board.cmake b/app/boards/arm/glove80_v0/board.cmake new file mode 100644 index 00000000000..fa847d50595 --- /dev/null +++ b/app/boards/arm/glove80_v0/board.cmake @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: MIT + +board_runner_args(nrfjprog "--nrf-family=NRF52" "--softreset") +include(${ZEPHYR_BASE}/boards/common/blackmagicprobe.board.cmake) +include(${ZEPHYR_BASE}/boards/common/nrfjprog.board.cmake) diff --git a/app/boards/arm/glove80_v0/glove80_v0.dtsi b/app/boards/arm/glove80_v0/glove80_v0.dtsi new file mode 100644 index 00000000000..00ff566276d --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0.dtsi @@ -0,0 +1,107 @@ +/* + * Copyright (c) 2020 Pete Johanson + * + * SPDX-License-Identifier: MIT + */ + +#include + +/ { + chosen { + zmk,kscan = &kscan0; + zmk,matrix_transform = &default_transform; + zephyr,code-partition = &code_partition; + zephyr,sram = &sram0; + zephyr,flash = &flash0; + zephyr,console = &cdc_acm_uart; + }; + + default_transform: keymap_transform_0 { + compatible = "zmk,matrix-transform"; + columns = <14>; + rows = <6>; + map = < +RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) 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(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(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(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(0,6) RC(1,6) RC(2,6) RC(2,7) RC(1,7) RC(0,7) RC(4,8) RC(4,9) RC(4,10) RC(4,11) RC(4,12) RC(4,13) +RC(5,0) RC(5,1) RC(5,2) RC(5,3) RC(5,4) RC(3,6) RC(4,6) RC(5,6) RC(5,7) RC(4,7) RC(3,7) RC(5,9) RC(5,10) RC(5,11) RC(5,12) RC(5,13) + >; + }; + + kscan0: kscan { + compatible = "zmk,kscan-gpio-matrix"; + label = "KSCAN"; + + diode-direction = "row2col"; + debounce-press-ms = <1>; + debounce-release-ms = <25>; + }; + +}; + +&adc { + status = "okay"; +}; + +&gpiote { + status = "okay"; +}; + +&gpio0 { + status = "okay"; +}; + +&gpio1 { + status = "okay"; +}; + +&usbd { + status = "okay"; + cdc_acm_uart: cdc_acm_uart { + compatible = "zephyr,cdc-acm-uart"; + label = "CDC_ACM_0"; + }; +}; + +&flash0 { + /* + * For more information, see: + * http://docs.zephyrproject.org/latest/devices/dts/flash_partitions.html + */ + partitions { + compatible = "fixed-partitions"; + #address-cells = <1>; + #size-cells = <1>; + + sd_partition: partition@0 { + label = "softdevice"; + reg = <0x00000000 0x00026000>; + }; + code_partition: partition@26000 { + label = "code_partition"; + reg = <0x00026000 0x000c6000>; + }; + + /* + * The flash starting at 0x000ec000 and ending at + * 0x000f3fff is reserved for use by the application. + */ + + /* + * Storage partition will be used by FCB/LittleFS/NVS + * if enabled. + */ + storage_partition: partition@ec000 { + label = "storage"; + reg = <0x000ec000 0x00008000>; + }; + + boot_partition: partition@f4000 { + label = "adafruit_boot"; + reg = <0x000f4000 0x0000c000>; + }; + }; +}; + diff --git a/app/boards/arm/glove80_v0/glove80_v0.keymap b/app/boards/arm/glove80_v0/glove80_v0.keymap new file mode 100644 index 00000000000..a3b33a3a42b --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0.keymap @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2020 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +#include +#include +#include +#include +#include +#include + +#define HYPER LC(LS(LG(LALT))) + +// layers +#define DEFAULT 0 +#define LOWER 1 + +/ { + keymap { + compatible = "zmk,keymap"; + + default_layer { + // --------------------------------------------------------------------------------------------------------------------------------- + // | F1 | F2 | F3 | F4 | F5 | | F6 | F7 | F8 | F9 | F10 | + // | = | 1 | 2 | 3 | 4 | 5 | | 6 | 7 | 8 | 9 | 0 | - | + // | TAB | Q | W | E | R | T | | Y | U | I | O | P | \ | + // | ESC | A | S | D | F | G | | H | J | K | L | ; | ' | + // | ` | Z | X | C | V | B | LSHFT | LCTRL | LOWER | | LGUI | RCTRL | RSHFT | N | M | , | . | / | PGUP | + // | MAGIC | HOME| END | LEFT | RIGHT| | BSPC | DEL | LALT | | RALT | RET | SPACE | | UP | DOWN | [ | ] | PGDN | + + + // MAGIC is currently bound to the same as LAYER - these will be fixed later + bindings = < + &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 + &kp EQUAL &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 ESC &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT + &kp GRAVE &kp Z &kp X &kp C &kp V &kp B &kp LSHFT &kp LCTRL &mo LOWER &kp LGUI &kp RCTRL &kp RSHFT &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp PG_UP + &mo LOWER &kp HOME &kp END &kp LEFT &kp RIGHT &kp BSPC &kp DEL &kp LALT &kp RALT &kp RET &kp SPACE &kp UP &kp DOWN &kp LBKT &kp RBKT &kp PG_DN + >; + }; + + lower_layer { + bindings = < + &bt BT_SEL 0 &bt BT_SEL 1 &bt BT_SEL 2 &bt BT_SEL 3 &bt BT_SEL 4 &none &none &none &kp F11 &kp F12 + &bt BT_CLR &bt BT_CLR &out OUT_USB &out OUT_BLE &out OUT_TOG &none &none &none &none &none &none &none + &bootloader &rgb_ug RGB_TOG &rgb_ug RGB_EFF &rgb_ug RGB_BRI &rgb_ug RGB_BRD &kp K_VOL_UP &none &none &none &none &none &bootloader + &reset &none &none &none &none &kp K_VOL_DN &none &none &none &none &none &reset + &ext_power EP_ON &ext_power EP_OFF &none &none &none &kp K_MUTE &none &kp HYPER &none &none &none &none &none &none &none &none &none &none + &none &kp CAPS &kp INS &none &none &none &none &none &none &none &none &none &none &none &none &none + >; + }; + }; +}; + diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.dts b/app/boards/arm/glove80_v0/glove80_v0_lh.dts new file mode 100644 index 00000000000..db9e2884997 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.dts @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80_v0.dtsi" + +/ { + model = "glove80_v0_lh"; + compatible = "glove80_v0_lh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &power_led_backlight; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio1 10 GPIO_ACTIVE_HIGH >; + label = "Red LED"; + }; + }; + + power_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 42>; + label = "Power Led Backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 30 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ + init-delay-ms = <10>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 5>; + output-ohms = <820000>; /** Double check that this is right */ + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY-VDDH"; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + mosi-pin = <27>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <24>; // NC + miso-pin = <25>; // NC + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <2000000>; + + /* WS2812 */ + chain-length = <40>; /* 18 keys have underglow at the moment */ + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + ch0-pin = <42>; /* 32 * 1 + 10 */ +}; + + +// [SC] Not sure if this section is necessary +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 GPIO_ACTIVE_HIGH> // LH ROW1 + , <&gpio0 5 GPIO_ACTIVE_HIGH> // LH ROW2 + , <&gpio0 7 GPIO_ACTIVE_HIGH> // LH ROW3 + , <&gpio1 8 GPIO_ACTIVE_HIGH> // LH ROW4 + , <&gpio0 11 GPIO_ACTIVE_HIGH> // LH ROW5 + , <&gpio0 12 GPIO_ACTIVE_HIGH> // LH ROW6 + ; + col-gpios + = <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL6 + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL5 + , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL4 + , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL3 + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL2 + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH COL1 + , <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // LH Thumb + ; +}; + diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.keymap b/app/boards/arm/glove80_v0/glove80_v0_lh.keymap new file mode 100644 index 00000000000..1a5a04b3937 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.keymap @@ -0,0 +1 @@ +#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yaml b/app/boards/arm/glove80_v0/glove80_v0_lh.yaml new file mode 100644 index 00000000000..56b575ac27e --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_v0_lh +name: Glove80_V0_LH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh.yml b/app/boards/arm/glove80_v0/glove80_v0_lh.yml new file mode 100644 index 00000000000..407021c51df --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_v0_lh +name: Glove80_V0_LH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig new file mode 100644 index 00000000000..4fb803b61a9 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_lh_defconfig @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_V0_LH=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_USE_DT_CODE_PARTITION=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Enable RGB underglow +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 + +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 + +# The power LED is implemented as a backlight +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# Turn on logging, and set ZMK logging to debug output +# Only for debugging +CONFIG_ZMK_USB_LOGGING=n + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.dts b/app/boards/arm/glove80_v0/glove80_v0_rh.dts new file mode 100644 index 00000000000..4d3ab99aa73 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.dts @@ -0,0 +1,120 @@ +/* + * Copyright (c) 2021 The ZMK Contributors + * + * SPDX-License-Identifier: MIT + */ + +/dts-v1/; +#include +#include +#include "glove80_v0.dtsi" + +/ { + model = "glove80_v0_rh"; + compatible = "glove80_v0_rh"; + + chosen { + zmk,underglow = &led_strip; + zmk,backlight = &power_led_backlight; + zmk,battery = &vbatt; + }; + + leds { + compatible = "gpio-leds"; + red_led: led_0 { + gpios = <&gpio0 20 GPIO_ACTIVE_HIGH>; + label = "Red LED"; + }; + }; + + power_led_backlight: pwmleds { + compatible = "pwm-leds"; + label = "Backlight LEDs"; + pwm_led_0 { + pwms = <&pwm0 20>; + label = "Power Led Backlight"; + }; + }; + + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio0 21 GPIO_ACTIVE_HIGH>; /**[SC] WS2812_CE */ + init-delay-ms = <10>; + }; + + vbatt: vbatt-divider { + compatible = "zmk,battery-voltage-divider"; + label = "BATTERY"; + io-channels = <&adc 5>; + output-ohms = <820000>; /** Double check that this is right */ + full-ohms = <(1500000 + 820000)>; + }; + + vbatt-vddh { + compatible = "zmk,battery-nrf-vddh"; + label = "BATTERY-VDDH"; + }; +}; + +&spi1 { + compatible = "nordic,nrf-spim"; + /* Cannot be used together with i2c0. */ + status = "okay"; + mosi-pin = <13>; + // Unused pins, needed for SPI definition, but not used by the ws2812 driver itself. + sck-pin = <24>; // NC + miso-pin = <25>; // NC + + led_strip: ws2812@0 { + compatible = "worldsemi,ws2812-spi"; + label = "WS2812C-2020"; + + /* SPI */ + reg = <0>; /* ignored, but necessary for SPI bindings */ + spi-max-frequency = <2000000>; + + /* WS2812 */ + chain-length = <40>; + spi-one-frame = <0x70>; + spi-zero-frame = <0x40>; + + color-mapping = ; + }; +}; + +&pwm0 { + status = "okay"; + ch0-pin = <20>; /* 32 * 0 + 20 */ +}; + +// [SC] Not sure if this section is necessary +&uart0 { + compatible = "nordic,nrf-uarte"; + tx-pin = <6>; + rx-pin = <8>; +}; + +&default_transform { + col-offset = <7>; +}; + +&kscan0 { + row-gpios + = <&gpio0 26 GPIO_ACTIVE_HIGH> // RH ROW1 + , <&gpio0 5 GPIO_ACTIVE_HIGH> // RH ROW2 + , <&gpio0 7 GPIO_ACTIVE_HIGH> // RH ROW3 + , <&gpio1 8 GPIO_ACTIVE_HIGH> // RH ROW4 + , <&gpio0 11 GPIO_ACTIVE_HIGH> // RH ROW5 + , <&gpio0 12 GPIO_ACTIVE_HIGH> // RH ROW6 + ; + col-gpios + = <&gpio0 2 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH Thumb + , <&gpio1 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL1 + , <&gpio1 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL2 + , <&gpio1 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL3 + , <&gpio1 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL4 + , <&gpio1 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL5 + , <&gpio1 1 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)> // RH COL6 + ; +}; diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.keymap b/app/boards/arm/glove80_v0/glove80_v0_rh.keymap new file mode 100644 index 00000000000..1a5a04b3937 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.keymap @@ -0,0 +1 @@ +#include "glove80_v0.keymap" \ No newline at end of file diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yaml b/app/boards/arm/glove80_v0/glove80_v0_rh.yaml new file mode 100644 index 00000000000..222ae1770e2 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.yaml @@ -0,0 +1,15 @@ +identifier: glove80_v0_rh +name: Glove80_V0_RH +type: mcu +arch: arm +toolchain: + - zephyr + - gnuarmemb + - xtools +supported: + - adc + - usb_device + - ble + - ieee802154 + - pwm + - watchdog diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh.yml b/app/boards/arm/glove80_v0/glove80_v0_rh.yml new file mode 100644 index 00000000000..41333f08662 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh.yml @@ -0,0 +1,10 @@ +file_format: "1" +id: glove80_v0_rh +name: Glove80_V0_RH +type: board +arch: arm +outputs: + - usb + - ble +url: https://www.moergo.com +exposes: diff --git a/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig b/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig new file mode 100644 index 00000000000..76ea8adbc71 --- /dev/null +++ b/app/boards/arm/glove80_v0/glove80_v0_rh_defconfig @@ -0,0 +1,49 @@ +# SPDX-License-Identifier: MIT + +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y +CONFIG_BOARD_GLOVE80_V0_RH=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +CONFIG_BUILD_OUTPUT_UF2=y + +CONFIG_USE_DT_CODE_PARTITION=y + +CONFIG_MPU_ALLOW_FLASH_WRITE=y +CONFIG_NVS=y +CONFIG_SETTINGS_NVS=y +CONFIG_FLASH=y +CONFIG_FLASH_PAGE_LAYOUT=y +CONFIG_FLASH_MAP=y + +# Disable RGB underglow for now in RH +CONFIG_ZMK_RGB_UNDERGLOW=y +CONFIG_WS2812_STRIP=y +CONFIG_SPI=y + +CONFIG_ZMK_RGB_UNDERGLOW_ON_START=y +CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=y +CONFIG_ZMK_RGB_UNDERGLOW_BRT_STEP=4 + +CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=285 +CONFIG_ZMK_RGB_UNDERGLOW_SAT_START=75 +CONFIG_ZMK_RGB_UNDERGLOW_BRT_START=20 + +# The power LED is implemented as a backlight +CONFIG_ZMK_BACKLIGHT=y +CONFIG_ZMK_BACKLIGHT_ON_START=y +CONFIG_ZMK_BACKLIGHT_BRT_START=5 +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y +CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=y + +# Turn on logging, and set ZMK logging to debug output +# Only for debugging +CONFIG_ZMK_USB_LOGGING=n + +# Turn on debugging to disable optimization +CONFIG_DEBUG=n