summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xbin/build.sh181
-rw-r--r--config/bt60_v2.conf45
-rw-r--r--config/bt60_v2.keymap289
-rw-r--r--config/bt60_v2.overlay33
-rw-r--r--config/common.h29
-rw-r--r--utils/unicode.h83
6 files changed, 496 insertions, 164 deletions
diff --git a/bin/build.sh b/bin/build.sh
new file mode 100755
index 0000000..b0314d8
--- /dev/null
+++ b/bin/build.sh
@@ -0,0 +1,181 @@
+#!/usr/bin/env bash
+# Pulled from https://github.com/urob/zmk-config/, with some minor modifications
+
+# Parse input arguments
+while [[ $# -gt 0 ]]; do
+ case $1 in
+ # needed when user isn't in docker group
+ -s|--su)
+ SUDO="sudo"
+ ;;
+
+ -m|--multithread)
+ MULTITHREAD="true"
+ ;;
+
+ -c|--clear-cache)
+ CLEAR_CACHE="true"
+ ;;
+
+ # comma or space separated list of boards (use quotes if space separated)
+ # if ommitted, will compile list of boards in build.yaml
+ -b|--board)
+ BOARDS="$2"
+ shift
+ ;;
+
+ -v|--version)
+ ZEPHYR_VERSION="$2"
+ shift
+ ;;
+
+ -o|--output-dir)
+ OUTPUT_DIR="$2"
+ shift
+ ;;
+
+ --log-dir)
+ LOG_DIR="$2"
+ shift
+ ;;
+
+ --host-config-dir)
+ HOST_CONFIG_DIR="$2"
+ shift
+ ;;
+
+ --host-zmk-dir)
+ HOST_ZMK_DIR="$2"
+ shift
+ ;;
+
+ --docker-config-dir)
+ DOCKER_CONFIG_DIR="$2"
+ shift
+ ;;
+
+ --docker-zmk-dir)
+ DOCKER_ZMK_DIR="$2"
+ shift
+ ;;
+
+ --)
+ WEST_OPTS="${@:2}"
+ break
+ ;;
+
+ *)
+ echo "Unknown option $1"
+ exit 1
+ ;;
+
+ esac
+ shift
+done
+
+# Set defaults
+[[ -z $ZEPHYR_VERSION ]] && ZEPHYR_VERSION="3.2"
+
+[[ -z $OUTPUT_DIR ]] && OUTPUT_DIR="$HOME/Downloads"
+[[ -z $LOG_DIR ]] && LOG_DIR="/tmp"
+
+[[ -z $HOST_ZMK_DIR ]] && HOST_ZMK_DIR="$HOME/_code/zmk"
+[[ -z $HOST_CONFIG_DIR ]] && HOST_CONFIG_DIR="$HOME/_code/zmk-config"
+
+[[ -z $DOCKER_ZMK_DIR ]] && DOCKER_ZMK_DIR="/workspace/zmk"
+[[ -z $DOCKER_CONFIG_DIR ]] && DOCKER_CONFIG_DIR="/workspace/zmk-config"
+
+[[ -z $BOARDS ]] && BOARDS="$(grep '^[[:space:]]*\-[[:space:]]*board:' $HOST_CONFIG_DIR/build.yaml | sed 's/^.*: *//')"
+
+[[ -z $CLEAR_CACHE ]] && CLEAR_CACHE="false"
+
+DOCKER_IMG="zmkfirmware/zmk-dev-arm:$ZEPHYR_VERSION"
+DOCKER_BIN="docker"
+
+# +--------------------+
+# | BUILD THE FIRMWARE |
+# +--------------------+
+
+echo "Build mode: docker"
+# DOCKER_CMD="$DOCKER_BIN run --name zmk-$ZEPHYR_VERSION --rm \
+DOCKER_CMD="$DOCKER_BIN run --rm \
+ --mount type=bind,source=$HOST_ZMK_DIR,target=$DOCKER_ZMK_DIR \
+ --mount type=bind,source=$HOST_CONFIG_DIR,target=$DOCKER_CONFIG_DIR,readonly \
+ --mount type=volume,source=zmk-root-user-$ZEPHYR_VERSION,target=/root \
+ --mount type=volume,source=zmk-zephyr-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/zephyr \
+ --mount type=volume,source=zmk-zephyr-modules-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/modules \
+ --mount type=volume,source=zmk-zephyr-tools-$ZEPHYR_VERSION,target=$DOCKER_ZMK_DIR/tools"
+
+# Reset volumes
+if [[ $CLEAR_CACHE = true ]]
+then
+ $DOCKER_BIN volume rm $($DOCKER_BIN volume ls -q | grep "^zmk-.*-$ZEPHYR_VERSION$")
+fi
+
+# Update west if needed
+OLD_WEST="/root/west.yml.old"
+$DOCKER_CMD -w "$DOCKER_ZMK_DIR" "$DOCKER_IMG" /bin/bash -c " \
+ if [[ ! -f .west/config ]]; then west init -l app/; fi \
+ && if [[ -f $OLD_WEST ]]; then md5_old=\$(md5sum $OLD_WEST | cut -d' ' -f1); fi \
+ && [[ \$md5_old != \$(md5sum app/west.yml | cut -d' ' -f1) ]] \
+ && west update \
+ && cp app/west.yml $OLD_WEST"
+
+# Build parameters
+DOCKER_PREFIX="$DOCKER_CMD -w $DOCKER_ZMK_DIR/app $DOCKER_IMG"
+SUFFIX="${ZEPHYR_VERSION}_docker"
+CONFIG_DIR="$DOCKER_CONFIG_DIR/config"
+
+# usage: compile_board board
+compile_board () {
+ BUILD_DIR="${1}_$SUFFIX"
+ LOGFILE="$LOG_DIR/zmk_build_$1.log"
+ [[ $MULTITHREAD = "true" ]] || echo -en "\n$(tput setaf 2)Building $1... $(tput sgr0)"
+ [[ $MULTITHREAD = "true" ]] && echo -e "$(tput setaf 2)Building $1... $(tput sgr0)"
+ $DOCKER_PREFIX west build -d "build/$BUILD_DIR" -b $1 $WEST_OPTS \
+ -- -DZMK_CONFIG="$CONFIG_DIR" -Wno-dev > "$LOGFILE" 2>&1
+ if [[ $? -eq 0 ]]
+ then
+ [[ $MULTITHREAD = "true" ]] || echo "$(tput setaf 2)done$(tput sgr0)"
+ echo "Build log saved to \"$LOGFILE\"."
+ if [[ -f $HOST_ZMK_DIR/app/build/$BUILD_DIR/zephyr/zmk.uf2 ]]
+ then
+ TYPE="uf2"
+ else
+ TYPE="bin"
+ fi
+ OUTPUT="$OUTPUT_DIR/$1-zmk.$TYPE"
+ [[ -f $OUTPUT ]] && [[ ! -L $OUTPUT ]] && mv "$OUTPUT" "$OUTPUT.bak"
+ cp "$HOST_ZMK_DIR/app/build/$BUILD_DIR/zephyr/zmk.$TYPE" "$OUTPUT"
+ else
+ echo
+ cat "$LOGFILE"
+ echo "$(tput setaf 1)Error: $1 failed$(tput sgr0)"
+ fi
+}
+
+cd "$HOST_ZMK_DIR/app"
+if [[ $MULTITHREAD = "true" ]]; then
+ i=1
+ for board in $(echo $BOARDS | sed 's/,/ /g')
+ do
+ compile_board $board &
+ eval "T${i}=\${!}"
+ eval "B${i}=\$board" # Store the board name in a corresponding variable
+ ((i++))
+ done
+
+ echo "Starting $(($i - 1)) background threads:"
+ for ((x=1; x<i; x++))
+ do
+ pid="T$x"
+ wait "${!pid}"
+ board="B$x" # Retrieve the board name from the corresponding variable
+ echo -e "$(tput setaf 3)Thread $x with PID ${!pid} has finished: ${!board}$(tput sgr0)"
+ done
+else
+ for board in $(echo $BOARDS | sed 's/,/ /g')
+ do
+ compile_board $board
+ done
+fi
diff --git a/config/bt60_v2.conf b/config/bt60_v2.conf
index 9cbbd04..47cf014 100644
--- a/config/bt60_v2.conf
+++ b/config/bt60_v2.conf
@@ -1 +1,44 @@
-# Put configuration options here
+# SPDX-License-Identifier: MIT
+
+CONFIG_SOC_SERIES_NRF52X=y
+CONFIG_SOC_NRF52840_QIAA=y
+CONFIG_BOARD_BT60_V2=y
+
+# Enable MPU
+CONFIG_ARM_MPU=y
+
+# enable GPIO
+CONFIG_GPIO=y
+
+# encoder
+CONFIG_EC11=y
+CONFIG_EC11_TRIGGER_GLOBAL_THREAD=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
+
+CONFIG_ZMK_RGB_UNDERGLOW=n
+CONFIG_ZMK_RGB_UNDERGLOW_EXT_POWER=n
+CONFIG_ZMK_RGB_UNDERGLOW_ON_START=n
+CONFIG_ZMK_RGB_UNDERGLOW_HUE_START=262
+# Use the STRIP config specific to the LEDs you're using
+CONFIG_WS2812_STRIP=y
+CONFIG_BT_CTLR_TX_PWR_PLUS_8=y
+CONFIG_PWM=y
+CONFIG_LED_PWM=y
+CONFIG_ZMK_BACKLIGHT=y
+CONFIG_ZMK_BACKLIGHT_AUTO_OFF_IDLE=y
+CONFIG_ZMK_BACKLIGHT_AUTO_OFF_USB=n
+CONFIG_BUILD_OUTPUT_UF2=y
+
+# Idle timeout
+CONFIG_ZMK_IDLE_TIMEOUT=30000
+# Deep sleep
+CONFIG_ZMK_SLEEP=y
+CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=900000
diff --git a/config/bt60_v2.keymap b/config/bt60_v2.keymap
index eeb5c96..899ddd3 100644
--- a/config/bt60_v2.keymap
+++ b/config/bt60_v2.keymap
@@ -3,175 +3,138 @@
#include <dt-bindings/zmk/bt.h>
#include <dt-bindings/zmk/rgb.h>
#include <dt-bindings/zmk/backlight.h>
+#include <dt-bindings/zmk/outputs.h>
-#define ANSI
-//#define ISO
-//#define ALL_1U
-//#define HHKB
+#define K_E 17
+#define K_O 23
+#define K_A 28
-/ {
- chosen {
- #ifdef ANSI
- zmk,matrix_transform = &ansi_transform;
- #elif defined(ISO)
- zmk,matrix_transform = &iso_transform;
- #elif defined(ALL_1U)
- zmk,matrix_transform = &all_1u_transform;
- #elif defined(HHKB)
- zmk,matrix_transform = &hhkb_transform;
- #else
- #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap"
- #endif
- };
+#include "common.h"
- keymap {
- compatible = "zmk,keymap";
- #ifdef ANSI
- default_layer {
- // ------------------------------------------------------------------------------------------
- // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP |
- // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
- // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
- // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |
- // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL |
- // ------------------------------------------------------------------------------------------
- bindings = <
+#define DEFAULT 0
+#define RAISE 1
+#define SPECIAL 2
+#define MAC_U 3
+#define GAMING_U 4
- &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 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 CAPS &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 LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
- &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- raise {
- // ------------------------------------------------------------------------------------------
- // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL |
- // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG|
- // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT |
- // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG |
- // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET | BT_CLR |
- // ------------------------------------------------------------------------------------------
- bindings = <
- &kp GRAVE &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 DEL
- &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG
- &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader
- &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG
- &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- #elif defined(ISO)
- default_layer {
- // ------------------------------------------------------------------------------------------
- // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP |
- // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | |
- // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER |
- // | SHIFT | \ | Z | X | C | V | B | N | M | , | . | / | SHIFT |
- // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL |
- // ------------------------------------------------------------------------------------------
- bindings = <
+COMBO(lnx_oe_comb, K_O K_E, DEFAULT, &lnx_no_oe)
+COMBO(lnx_ae_comb, K_A K_E, DEFAULT, &lnx_no_ae)
+COMBO(lnx_ao_comb, K_A K_O, DEFAULT, &lnx_no_ao)
+COMBO(mwn_oe_comb, 54 37, MAC_U, &mwn_no_oe)
+COMBO(mwn_ae_comb, 54 38, MAC_U, &mwn_no_ae)
+COMBO(mwn_ao_comb, 54 25, MAC_U, &mwn_no_ao)
- &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 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 CAPS &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 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 LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp K_CMENU &kp RCTRL
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- raise {
- // ------------------------------------------------------------------------------------------
- // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL |
- // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | |
- // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP|RGB_TOG| BOOT |
- // | SHIFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| B | N | M | , | END | PGDN | BL_TOG |
- // | BT_PRV| BT_NXT| ALT | SPACE | ALT | 1 | RESET |BT_CLR |
- // ------------------------------------------------------------------------------------------
- bindings = <
- &kp GRAVE &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 DEL
- &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK
- &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &rgb_ug RGB_TOG &bootloader
- &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG
- &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &sys_reset &bt BT_CLR
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- #elif defined(ALL_1U)
- default_layer {
- // ------------------------------------------------------------------------------------------
- // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BKSP | DEL |
- // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
- // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
- // | SHFT |NONE| Z | X | C | V | B | N | M | , | . | / | SHFT | UP | 1 |
- // | CTL | WIN | ALT | SPACE | RALT| CTRL | LEFT | DOWN | 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 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 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 LSHFT &none &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT &kp UP &mo 1
- &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &kp RCTRL &kp LEFT &kp DOWN &kp RIGHT
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- raise {
- // ------------------------------------------------------------------------------------------
- // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 |BKSP | DEL |
- // | 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 |
- // | SHFT |NONE|VOLDN|VOLUP|MUTE|BLINC|BLDEC| N | M | , | END | PGDN | SHFT|BL_TOG| 1 |
- // | BT_PRV| BT_NXT| ALT | SPACE | RALT| CTRL | LEFT |RESET| BT_CLR |
- // ------------------------------------------------------------------------------------------
- bindings = <
- &kp GRAVE &kp F1 &kp F2 &kp F3 &kp F4 &kp F5 &kp F6 &kp F7 &kp F8 &kp F9 &kp F10 &kp F11 &kp F12 &trans &trans
- &trans &trans &trans &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG
- &trans &trans &trans &trans &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader
- &trans &none &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &trans &bl BL_TOG &trans
- &bt BT_PRV &bt BT_NXT &trans &trans &trans &trans &trans &sys_reset &bt BT_CLR
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+/ {
+ behaviors {
+ mo_tog: behavior_mo_tog {
+ compatible = "zmk,behavior-hold-tap";
+ label = "mo_tog";
+ #binding-cells = <2>;
+ flavor = "hold-preferred";
+ tapping-term-ms = <200>;
+ bindings = <&mo>, <&tog>;
+ };
+ td_rfn_u_c: rfn_u {
+ compatible = "zmk,behavior-tap-dance";
+ label = "RFN_UPPER";
+ #binding-cells = <0>;
+ tapping-term-ms = <200>;
+ bindings = <&mo 1>, <&tog 1>;
+ };
+ td_rfn_l_c: rfn_l {
+ compatible = "zmk,behavior-tap-dance";
+ label = "RFN_LOWER";
+ #binding-cells = <0>;
+ tapping-term-ms = <200>;
+ bindings = <&mo 1>, <&mo 2>;
+ };
+ td_lctrl_l: lctrl_l {
+ compatible = "zmk,behavior-tap-dance";
+ label = "LCTRL_LOWER";
+ #binding-cells = <0>;
+ tapping-term-ms = <200>;
+ bindings = <&mo 1>, <&mo 2>;
+ };
+ td_lshift_c: lshift_caps {
+ compatible = "zmk,behavior-tap-dance";
+ label = "LSHIFT_CAPS";
+ #binding-cells = <0>;
+ tapping-term-ms = <200>;
+ bindings = <&kp LSHFT>, <&kp CAPS>;
+ };
+ td_rshift_c: rshift_caps {
+ compatible = "zmk,behavior-tap-dance";
+ label = "RSHIFT_CAPS";
+ #binding-cells = <0>;
+ tapping-term-ms = <200>;
+ bindings = <&kp RSHFT>, <&kp CAPS>;
+ };
};
- #elif defined(HHKB)
- default_layer {
- // ------------------------------------------------------------------------------------------
- // | ESC | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP |
- // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | \ |
- // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | ENTER |
- // | SHIFT | Z | X | C | V | B | N | M | , | . | / | SHIFT |
- // | CTL | WIN | ALT | SPACE | ALT | 1 | CTRL |
- // ------------------------------------------------------------------------------------------
- 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 BSPC
- &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 CAPS &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 LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT
- &kp LCTRL &kp LGUI &kp LALT &kp SPACE &kp RALT &mo 1 &kp RCTRL
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- raise {
- // ------------------------------------------------------------------------------------------
- // |GRAVE| F1 | F2 | F3 | F4 | F5 | F6 | F7 | F8 | F9 | F10 | F11 | F12 | DEL |
- // | TAB | Q | UP | E | HUI | HUD | Y | U | INS | O |PSCRN| SLCK| P_B | RGB_TOG|
- // | CAPS | LEFT| DOWN|RIGHT| BRI | BRD | H | J | K | L | HOME| PGUP| BOOT |
- // | SHFT |VOLDN|VOLUP| MUTE|BLINC|BLDEC| N | M | , | END | PGDN | BL_TOG |
- // | BT_PRV | BT_NXT | ALT | SPACE | RESET | 1 | BT_CLR |
- // ------------------------------------------------------------------------------------------
- bindings = <
- &kp GRAVE &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 DEL
- &trans &trans &kp UP &trans &rgb_ug RGB_HUI &rgb_ug RGB_HUD &trans &trans &kp INS &trans &kp PSCRN &kp SLCK &kp PAUSE_BREAK &rgb_ug RGB_TOG
- &trans &kp LEFT &kp DOWN &kp RIGHT &rgb_ug RGB_BRI &rgb_ug RGB_BRD &trans &trans &trans &trans &kp HOME &kp PG_UP &bootloader
- &trans &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC &trans &trans &trans &kp END &kp PG_DN &bl BL_TOG
- &bt BT_PRV &bt BT_NXT &trans &trans &sys_reset &trans &bt BT_CLR
- >;
- sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
- };
- #else
- #error "Layout not defined, please define a layout by uncommenting the appropriate line in bt60_v2.keymap"
- #endif
+ keymap {
+ compatible = "zmk,keymap";
+
+ default_layer {
+ // ------------------------------------------------------------------------------------------
+ // | ` | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = | BKSP
+ // | TAB | Q | W | E | R | T | Y | U | I | O | P | [ | ] | |
+ // | CAPS | A | S | D | F | G | H | J | K | L | ; | ' | # | ENTER |
+ // | SHIFT| \ | Z | trans | . | / | SHIFT |
+ // | CTL | WIN | ALT | SPACE | ALT | 1 | MENU | CTRL|
+ // ------------------------------------------------------------------------------------------
+ bindings = <
+
+ &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 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
+ &mt LCTRL ESC &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 LSHIFT &kp NON_US_BSLH &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &td_rshift_c &td_rfn_u_c
+ &td_lctrl_l &kp LGUI &kp LALT &kp SPACE &kp RALT &td_rfn_l_c &kp C_MENU &kp RCTRL
+ >;
+ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+ };
+ raise {
+ bindings = <
+ &bt BT_CLR &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 DEL
+ ___ ___ ___ ___ ___ ___ &kp HOME &kp PG_DN &kp PG_UP &kp END &kp PSCRN &kp SLCK &kp PAUSE_BREAK
+ ___ ___ ___ ___ ___ ___ &kp LEFT &kp DOWN &kp UP &kp RIGHT ___ ___ ___ ___
+ &kp C_PREV &kp C_VOL_DN &kp C_VOL_UP &kp C_MUTE &bl BL_INC &bl BL_DEC ___ ___ ___ ___ ___ ___ ___ ___
+ &to 0 ___ ___ ___ ___ &mo 2 ___ ___
+ >;
+ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+ };
+ special {
+ bindings = <
+ &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_CLR
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ &bootloader
+ ___ &tog MAC_U &tog GAMING_U ___ ___ ___ ___ ___ ___ ___ ___ ___ &bl BL_TOG ___
+ &to 0 ___ ___ ___ ___ ___ &sys_reset ___
+ >;
+ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+ };
- };
+
+ mac_unicode {
+ bindings = <
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___
+ >;
+ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+ };
+ gaming {
+ bindings = <
+ &kp ESC ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ &kp LCTRL ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ &kp LSHIFT ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___ ___
+ &kp LCTRL ___ ___ ___ ___ ___ ___ ___
+ >;
+ sensor-bindings = <&inc_dec_kp C_VOL_UP C_VOL_DN>;
+ };
+
+ };
};
+
diff --git a/config/bt60_v2.overlay b/config/bt60_v2.overlay
new file mode 100644
index 0000000..02595ab
--- /dev/null
+++ b/config/bt60_v2.overlay
@@ -0,0 +1,33 @@
+#include <dt-bindings/zmk/matrix_transform.h>
+
+/ {
+ model = "BT60_V2";
+ compatible = "polarityworks,bt60_v2";
+
+ chosen {
+ zephyr,code-partition = &code_partition;
+ zephyr,sram = &sram0;
+ zephyr,flash = &flash0;
+ zmk,kscan = &kscan0;
+ zmk,underglow = &led_strip;
+ zmk,backlight = &backlight;
+ zmk,matrix_transform = &default_transform;
+ zmk,battery = &vbatt;
+ };
+
+ default_transform: keymap_transform_0 {
+ compatible = "zmk,matrix-transform";
+ columns = <15>;
+ rows = <5>;
+ map = <
+ RC(1,0) 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,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,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10) RC(2,11) RC(2,12)
+ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,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,14)
+ RC(5,0) RC(5,1) RC(5,2) RC(5,6) RC(5,10) RC(5,11) RC(5,12) RC(5,13)
+ >;
+ };
+
+
+};
+
diff --git a/config/common.h b/config/common.h
new file mode 100644
index 0000000..1292b8b
--- /dev/null
+++ b/config/common.h
@@ -0,0 +1,29 @@
+#define ___ &trans
+#define XXX &none
+
+#ifndef QUICK_TAP_MS
+ #define QUICK_TAP_MS 175
+#endif
+
+#define ZMK_HELPER_STRINGIFY(x) #x
+
+#define MO_TOG(layer) &mo_tog layer layer // Macro to apply momentary-layer-on-hold/toggle-layer-on-tap to a specific layer
+
+&sk { // sticky-key config
+ release-after-ms = <900>; // release after 0.6s
+ quick-release; // no double capitalization when rolling keys
+};
+
+&sl { // sticky-layer config
+ ignore-modifiers; // allow chording sticky mods & layers
+};
+
+&lt { // layer-tap config
+ flavor = "balanced";
+ tapping-term-ms = <200>;
+ quick-tap-ms = <QUICK_TAP_MS>;
+};
+
+
+#include "../utils/unicode.h"
+
diff --git a/utils/unicode.h b/utils/unicode.h
new file mode 100644
index 0000000..f202fda
--- /dev/null
+++ b/utils/unicode.h
@@ -0,0 +1,83 @@
+#define COMBO(name, POS, LAYERS, BINDINGS) \
+ / { \
+ combos { \
+ compatible = "zmk,combos"; \
+ name { \
+ timeout-ms = <50>; \
+ key-positions = <POS>; \
+ layers = <LAYERS>; \
+ bindings = <BINDINGS>; \
+ }; \
+ }; \
+ };
+
+/* ZMK_UNICODE */
+#define UC_LEAD_MACWIN &macro_press &kp LALT // macOS/Windows-Alt-Codes
+#define UC_LEAD_LINUX &macro_tap &kp LS(LC(U)) // Linux
+#define UC_LEAD_WINDOWS &macro_tap &kp RALT &kp U // Windows + WinCompose (default)
+
+#define UC_TRAIL_MACWIN &macro_release &kp LALT // macOS/Windows-Alt-Codes
+#define UC_TRAIL_LINUX &macro_tap &kp SPACE // Linux
+#define UC_TRAIL_WINDOWS &macro_tap &kp RET // Windows + WinCompose (default)
+
+#define UC_MACRO_LINUX(name, unicode_bindings) \
+ / { \
+ macros { \
+ name: name { \
+ compatible = "zmk,behavior-macro"; \
+ label = ZMK_HELPER_STRINGIFY(UC_MACRO_ ## name); \
+ wait-ms = <0>; \
+ tap-ms = <0>; \
+ #binding-cells = <0>; \
+ bindings = <UC_LEAD_LINUX>, <&macro_tap unicode_bindings>, <UC_TRAIL_LINUX>; \
+ }; \
+ }; \
+ };
+#define UC_MACRO_MACWIN(name, unicode_bindings) \
+ / { \
+ macros { \
+ name: name { \
+ compatible = "zmk,behavior-macro"; \
+ label = ZMK_HELPER_STRINGIFY(UC_MACRO_ ## name); \
+ wait-ms = <0>; \
+ tap-ms = <0>; \
+ #binding-cells = <0>; \
+ bindings = <UC_LEAD_MACWIN>, <&macro_tap unicode_bindings>, <UC_TRAIL_MACWIN>; \
+ }; \
+ }; \
+ };
+
+#define UC_MODMORPH(name, uc_binding, shifted_uc_binding) \
+ / { \
+ behaviors { \
+ name: name { \
+ compatible = "zmk,behavior-mod-morph"; \
+ label = ZMK_HELPER_STRINGIFY(UC_MORPH_ ## name); \
+ #binding-cells = <0>; \
+ bindings = <uc_binding>, <shifted_uc_binding>; \
+ mods = <(MOD_LSFT|MOD_RSFT)>; \
+ }; \
+ }; \
+ };
+
+#define ZMK_UNICODE_SINGLE(name, L0, L1, L2, L3) \
+ UC_MACRO(name ## _lower, &kp L0 &kp L1 &kp L2 &kp L3) \
+ UC_MODMORPH(name, &name ## _lower, &none)
+
+#define ZMK_UNICODE_PAIR_LINUX(name, L0, L1, L2, L3, U0, U1, U2, U3) \
+ UC_MACRO_LINUX(name ## _lower, &kp L0 &kp L1 &kp L2 &kp L3) \
+ UC_MACRO_LINUX(name ## _upper, &kp U0 &kp U1 &kp U2 &kp U3) \
+ UC_MODMORPH(name, &name ## _lower, &name ## _upper)
+
+#define ZMK_UNICODE_PAIR_MACWIN(name, L0, L1, L2, L3, U0, U1, U2, U3) \
+ UC_MACRO_MACWIN(name ## _lower, &kp L0 &kp L1 &kp L2 &kp L3) \
+ UC_MACRO_MACWIN(name ## _upper, &kp U0 &kp U1 &kp U2 &kp U3) \
+ UC_MODMORPH(name, &name ## _lower, &name ## _upper)
+
+ZMK_UNICODE_PAIR_MACWIN(mwn_no_ae, N0, N0, E, N6, N0, N0, C, N6)
+ZMK_UNICODE_PAIR_MACWIN(mwn_no_ao, N0, N0, E, N5, N0, N0, C, N5)
+ZMK_UNICODE_PAIR_MACWIN(mwn_no_oe, N0, N0, F, N8, N0, N0, D, N8)
+ZMK_UNICODE_PAIR_LINUX(lnx_no_ae, N0, N0, E, N6, N0, N0, C, N6)
+ZMK_UNICODE_PAIR_LINUX(lnx_no_ao, N0, N0, E, N5, N0, N0, C, N5)
+ZMK_UNICODE_PAIR_LINUX(lnx_no_oe, N0, N0, F, N8, N0, N0, D, N8)
+