From d224578a75754994bc32e0e9c782fe6ef23b95d4 Mon Sep 17 00:00:00 2001 From: Max Starikov Date: Fri, 20 Feb 2026 20:21:53 +0100 Subject: [PATCH 1/4] use raw hid --- config/boards/shields/corney/corney.conf | 5 +++++ config/boards/shields/corney/corney.keymap | 24 ++++++++++++++++++++-- config/west.yml | 5 +++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/config/boards/shields/corney/corney.conf b/config/boards/shields/corney/corney.conf index 5e35c54..3f60691 100644 --- a/config/boards/shields/corney/corney.conf +++ b/config/boards/shields/corney/corney.conf @@ -8,4 +8,9 @@ CONFIG_ZMK_MOUSE_TICK_DURATION=8 # Optional: Adjust mouse movement speed (default is 500) CONFIG_ZMK_MOUSE_DEFAULT_SPEED=500 + +CONFIG_RAW_HID=y +CONFIG_RAW_HID_REPORT_SIZE=32 +CONFIG_RAW_HID_DEVICE_NAME="ZMK RAWHID" + ZMK_KEYBOARD_NAME="Corney" diff --git a/config/boards/shields/corney/corney.keymap b/config/boards/shields/corney/corney.keymap index 8a09a25..6c174f7 100644 --- a/config/boards/shields/corney/corney.keymap +++ b/config/boards/shields/corney/corney.keymap @@ -12,7 +12,27 @@ #include #include "corney_macros.dtsi" +#include "behaviors.dtsi" +/ { + macros { + // Нажал: отправили телеметрию + включили слой + // Держим: слой активен + // Отпустил: отпустили слой (и при желании отправили телеметрию "base") + mo_func_with_notify: mo_func_with_notify { + compatible = "zmk,behavior-macro"; + #binding-cells = <0>; + + bindings = + <¯o_press &raw_layer FUNC>, // <-- notify (твоё поведение) + <¯o_press &mo FUNC>, // <-- включить слой + <¯o_pause_for_release>, // держать пока удерживаем + <¯o_release &mo FUNC>; // отпустить слой + // опционально: + // , <¯o_tap &raw_layer BASE>; + }; + }; +}; / { keymap { @@ -29,7 +49,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Y &kp U &kp I &kp O &kp P &kp MINUS &cycle_lang_de &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &kp SEMI &kp SQT &kp LSHFT &kp Z &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &kp FSLH &kp RSHFT - &kp LCTRL &kp SPACE &mo FUNC &kp RGUI &mo CHARS &kp RALT + &kp LCTRL &kp SPACE &mo_func_with_notify &kp RGUI &mo CHARS &kp RALT >; }; @@ -45,7 +65,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Z &kp U &kp I &kp O &kp P &kp FSLH &cycle_lang_ru &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &shift_COMMA &shift_BSLH &mo DEFAULT_LINUX_SHIFT &kp Y &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &shift_N7 &mo DEFAULT_LINUX_SHIFT - &kp LCTRL &kp SPACE &mo FUNC &kp RGUI &mo CHARS_DE &mo DEFAULT_LINUX_ALT + &kp LCTRL &kp SPACE &mo FUNC111 &kp RGUI &mo CHARS_DE &mo DEFAULT_LINUX_ALT >; }; diff --git a/config/west.yml b/config/west.yml index e1fa2f2..86bb574 100644 --- a/config/west.yml +++ b/config/west.yml @@ -2,6 +2,8 @@ manifest: remotes: - name: zmkfirmware url-base: https://github.com/zmkfirmware + - name: zzeneg + url-base: https://github.com/zzeneg # Additional modules containing boards/shields/custom code can be listed here as well # See https://docs.zephyrproject.org/3.2.0/develop/west/manifest.html#projects projects: @@ -9,5 +11,8 @@ manifest: remote: zmkfirmware revision: v0.2.1 import: app/west.yml + - name: zmk-raw-hid + remote: zzeneg + revision: main self: path: config From a58e2f67d3a81d2451f3389c6a8e07f0b9f4a40c Mon Sep 17 00:00:00 2001 From: Max Starikov Date: Fri, 20 Feb 2026 20:33:33 +0100 Subject: [PATCH 2/4] add files --- config/boards/shields/corney/behaviors.dtsi | 8 ++++++ config/boards/shields/corney/corney.keymap | 2 +- .../shields/corney/rawhid_layer_behavior.c | 25 +++++++++++++++++++ config/boards/shields/corney/rawhid_notify.c | 20 +++++++++++++++ 4 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 config/boards/shields/corney/behaviors.dtsi create mode 100644 config/boards/shields/corney/rawhid_layer_behavior.c create mode 100644 config/boards/shields/corney/rawhid_notify.c diff --git a/config/boards/shields/corney/behaviors.dtsi b/config/boards/shields/corney/behaviors.dtsi new file mode 100644 index 0000000..b8e23ea --- /dev/null +++ b/config/boards/shields/corney/behaviors.dtsi @@ -0,0 +1,8 @@ +/ { + behaviors { + raw_layer: raw_layer { + compatible = "zmk,behavior"; + label = "RAW_LAYER"; + }; + }; +}; \ No newline at end of file diff --git a/config/boards/shields/corney/corney.keymap b/config/boards/shields/corney/corney.keymap index 6c174f7..18bec28 100644 --- a/config/boards/shields/corney/corney.keymap +++ b/config/boards/shields/corney/corney.keymap @@ -65,7 +65,7 @@ &kp TAB &kp Q &kp W &kp E &kp R &kp T &kp Z &kp U &kp I &kp O &kp P &kp FSLH &cycle_lang_ru &kp A &kp S &kp D &kp F &kp G &kp H &kp J &kp K &kp L &shift_COMMA &shift_BSLH &mo DEFAULT_LINUX_SHIFT &kp Y &kp X &kp C &kp V &kp B &kp N &kp M &kp COMMA &kp DOT &shift_N7 &mo DEFAULT_LINUX_SHIFT - &kp LCTRL &kp SPACE &mo FUNC111 &kp RGUI &mo CHARS_DE &mo DEFAULT_LINUX_ALT + &kp LCTRL &kp SPACE &mo FUNC &kp RGUI &mo CHARS_DE &mo DEFAULT_LINUX_ALT >; }; diff --git a/config/boards/shields/corney/rawhid_layer_behavior.c b/config/boards/shields/corney/rawhid_layer_behavior.c new file mode 100644 index 0000000..bb929be --- /dev/null +++ b/config/boards/shields/corney/rawhid_layer_behavior.c @@ -0,0 +1,25 @@ +#include +#include + +extern void rawhid_send_layer(uint8_t layer, uint8_t flags); + +static int behavior_rawhid_layer_pressed(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) +{ + uint8_t layer = binding->param1; + + rawhid_send_layer(layer, 0); + + return ZMK_BEHAVIOR_OPAQUE; +} + +static const struct behavior_driver_api behavior_rawhid_layer_driver_api = { + .binding_pressed = behavior_rawhid_layer_pressed, +}; + +BEHAVIOR_DT_INST_DEFINE(0, + behavior_rawhid_layer_pressed, + NULL, + NULL, + &behavior_rawhid_layer_driver_api +); \ No newline at end of file diff --git a/config/boards/shields/corney/rawhid_notify.c b/config/boards/shields/corney/rawhid_notify.c new file mode 100644 index 0000000..66099a0 --- /dev/null +++ b/config/boards/shields/corney/rawhid_notify.c @@ -0,0 +1,20 @@ +#include +#include +#include +#include + +#define REPORT_SIZE 32 + +static uint8_t report_buf[REPORT_SIZE]; + +void rawhid_send_layer(uint8_t layer, uint8_t flags) +{ + report_buf[0] = 0x01; // message type: layer update + report_buf[1] = layer; + report_buf[2] = flags; + + // остальные байты нули + memset(report_buf + 3, 0, REPORT_SIZE - 3); + + hid_int_ep_write(report_buf, REPORT_SIZE, NULL); +} \ No newline at end of file From 38566aac1b8928a1cbed02e610a6d0bb98a26275 Mon Sep 17 00:00:00 2001 From: Max Starikov Date: Fri, 20 Feb 2026 20:41:26 +0100 Subject: [PATCH 3/4] fix hid command --- config/boards/shields/corney/behaviors.dtsi | 6 +-- config/boards/shields/corney/corney.conf | 4 +- .../shields/corney/rawhid_layer_behavior.c | 38 ++++++++++++++----- config/boards/shields/corney/rawhid_notify.c | 22 +++++++---- 4 files changed, 49 insertions(+), 21 deletions(-) diff --git a/config/boards/shields/corney/behaviors.dtsi b/config/boards/shields/corney/behaviors.dtsi index b8e23ea..b1b0bd6 100644 --- a/config/boards/shields/corney/behaviors.dtsi +++ b/config/boards/shields/corney/behaviors.dtsi @@ -1,8 +1,8 @@ / { behaviors { raw_layer: raw_layer { - compatible = "zmk,behavior"; - label = "RAW_LAYER"; + compatible = "zmk,behavior-raw-layer"; + #binding-cells = <1>; }; }; -}; \ No newline at end of file +}; diff --git a/config/boards/shields/corney/corney.conf b/config/boards/shields/corney/corney.conf index 3f60691..80fa7c2 100644 --- a/config/boards/shields/corney/corney.conf +++ b/config/boards/shields/corney/corney.conf @@ -11,6 +11,6 @@ CONFIG_ZMK_MOUSE_DEFAULT_SPEED=500 CONFIG_RAW_HID=y CONFIG_RAW_HID_REPORT_SIZE=32 -CONFIG_RAW_HID_DEVICE_NAME="ZMK RAWHID" +CONFIG_RAW_HID_DEVICE="HID_1" -ZMK_KEYBOARD_NAME="Corney" +CONFIG_ZMK_KEYBOARD_NAME="Corney" diff --git a/config/boards/shields/corney/rawhid_layer_behavior.c b/config/boards/shields/corney/rawhid_layer_behavior.c index bb929be..a876890 100644 --- a/config/boards/shields/corney/rawhid_layer_behavior.c +++ b/config/boards/shields/corney/rawhid_layer_behavior.c @@ -1,25 +1,45 @@ +#define DT_DRV_COMPAT zmk_behavior_raw_layer + +#include +#include +#include +#include #include -#include + +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); extern void rawhid_send_layer(uint8_t layer, uint8_t flags); +#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) + static int behavior_rawhid_layer_pressed(struct zmk_behavior_binding *binding, - struct zmk_behavior_binding_event event) -{ + struct zmk_behavior_binding_event event) { uint8_t layer = binding->param1; + LOG_DBG("position %d layer %d", event.position, layer); rawhid_send_layer(layer, 0); return ZMK_BEHAVIOR_OPAQUE; } +static int behavior_rawhid_layer_released(struct zmk_behavior_binding *binding, + struct zmk_behavior_binding_event event) { + ARG_UNUSED(binding); + ARG_UNUSED(event); + + return ZMK_BEHAVIOR_OPAQUE; +} + static const struct behavior_driver_api behavior_rawhid_layer_driver_api = { .binding_pressed = behavior_rawhid_layer_pressed, + .binding_released = behavior_rawhid_layer_released, }; -BEHAVIOR_DT_INST_DEFINE(0, - behavior_rawhid_layer_pressed, - NULL, - NULL, - &behavior_rawhid_layer_driver_api -); \ No newline at end of file +#define RAW_LAYER_INST(n) \ + BEHAVIOR_DT_INST_DEFINE(n, NULL, NULL, NULL, NULL, POST_KERNEL, \ + CONFIG_KERNEL_INIT_PRIORITY_DEFAULT, \ + &behavior_rawhid_layer_driver_api); + +DT_INST_FOREACH_STATUS_OKAY(RAW_LAYER_INST) + +#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */ diff --git a/config/boards/shields/corney/rawhid_notify.c b/config/boards/shields/corney/rawhid_notify.c index 66099a0..d5d1547 100644 --- a/config/boards/shields/corney/rawhid_notify.c +++ b/config/boards/shields/corney/rawhid_notify.c @@ -1,11 +1,16 @@ #include -#include -#include +#include #include -#define REPORT_SIZE 32 +#if IS_ENABLED(CONFIG_RAW_HID) +#include +#endif -static uint8_t report_buf[REPORT_SIZE]; +#if IS_ENABLED(CONFIG_RAW_HID) +static uint8_t report_buf[CONFIG_RAW_HID_REPORT_SIZE]; +#else +static uint8_t report_buf[32]; +#endif void rawhid_send_layer(uint8_t layer, uint8_t flags) { @@ -14,7 +19,10 @@ void rawhid_send_layer(uint8_t layer, uint8_t flags) report_buf[2] = flags; // остальные байты нули - memset(report_buf + 3, 0, REPORT_SIZE - 3); + memset(report_buf + 3, 0, sizeof(report_buf) - 3); - hid_int_ep_write(report_buf, REPORT_SIZE, NULL); -} \ No newline at end of file +#if IS_ENABLED(CONFIG_RAW_HID) + raise_raw_hid_sent_event( + (struct raw_hid_sent_event){.data = report_buf, .length = sizeof(report_buf)}); +#endif +} From 2c6c1b485efa9c55aabda4bb44852c399900d309 Mon Sep 17 00:00:00 2001 From: Max Starikov Date: Fri, 20 Feb 2026 20:46:08 +0100 Subject: [PATCH 4/4] add files --- config/CMakeLists.txt | 5 +++++ config/Kconfig | 1 + config/dts/bindings/behaviors/zmk,behavior-raw-layer.yaml | 5 +++++ config/zephyr/module.yml | 7 +++++++ 4 files changed, 18 insertions(+) create mode 100644 config/CMakeLists.txt create mode 100644 config/Kconfig create mode 100644 config/dts/bindings/behaviors/zmk,behavior-raw-layer.yaml create mode 100644 config/zephyr/module.yml diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt new file mode 100644 index 0000000..2db8908 --- /dev/null +++ b/config/CMakeLists.txt @@ -0,0 +1,5 @@ +if(CONFIG_SHIELD_CORNEY_LEFT OR CONFIG_SHIELD_CORNEY_RIGHT) + zephyr_library_include_directories(${CMAKE_SOURCE_DIR}/include) + zephyr_library_sources(boards/shields/corney/rawhid_layer_behavior.c) + zephyr_library_sources(boards/shields/corney/rawhid_notify.c) +endif() diff --git a/config/Kconfig b/config/Kconfig new file mode 100644 index 0000000..548d2d4 --- /dev/null +++ b/config/Kconfig @@ -0,0 +1 @@ +# SPDX-License-Identifier: MIT diff --git a/config/dts/bindings/behaviors/zmk,behavior-raw-layer.yaml b/config/dts/bindings/behaviors/zmk,behavior-raw-layer.yaml new file mode 100644 index 0000000..2582e7b --- /dev/null +++ b/config/dts/bindings/behaviors/zmk,behavior-raw-layer.yaml @@ -0,0 +1,5 @@ +description: Raw HID layer report behavior + +compatible: "zmk,behavior-raw-layer" + +include: one_param.yaml diff --git a/config/zephyr/module.yml b/config/zephyr/module.yml new file mode 100644 index 0000000..59adb92 --- /dev/null +++ b/config/zephyr/module.yml @@ -0,0 +1,7 @@ +name: corney-config +build: + cmake: . + kconfig: Kconfig + settings: + board_root: . + dts_root: .