diff options
-rw-r--r-- | app/CMakeLists.txt | 1 | ||||
-rw-r--r-- | app/Kconfig | 16 | ||||
-rw-r--r-- | app/boards/shields/kyria/Kconfig.defconfig | 36 | ||||
-rw-r--r-- | app/boards/shields/kyria/kyria.dtsi | 18 | ||||
-rw-r--r-- | app/boards/shields/lily58/Kconfig.defconfig | 40 | ||||
-rw-r--r-- | app/boards/shields/lily58/lily58.dtsi | 21 | ||||
-rw-r--r-- | app/cmake/zmk_config.cmake | 16 | ||||
-rw-r--r-- | app/drivers/zephyr/Kconfig | 5 | ||||
-rw-r--r-- | app/include/zmk/display.h | 10 | ||||
-rw-r--r-- | app/include/zmk/events/keycode-state-changed.h | 2 | ||||
-rw-r--r-- | app/prj.conf | 4 | ||||
-rw-r--r-- | app/src/display.c | 56 | ||||
-rw-r--r-- | app/src/endpoints.c | 1 | ||||
-rw-r--r-- | app/src/main.c | 10 | ||||
-rw-r--r-- | app/src/sensors.c | 3 |
15 files changed, 217 insertions, 22 deletions
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 243228f..3734101 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -33,6 +33,7 @@ target_sources(app PRIVATE src/keymap.c) target_sources(app PRIVATE src/hid_listener.c) target_sources(app PRIVATE src/hid.c) target_sources(app PRIVATE src/sensors.c) +target_sources_ifdef(CONFIG_ZMK_DISPLAY app PRIVATE src/display.c) target_sources(app PRIVATE src/event_manager.c) target_sources(app PRIVATE src/events/position_state_changed.c) target_sources(app PRIVATE src/events/keycode_state_changed.c) diff --git a/app/Kconfig b/app/Kconfig index df768b3..01384a0 100644 --- a/app/Kconfig +++ b/app/Kconfig @@ -67,6 +67,14 @@ endif endmenu +config ZMK_DISPLAY + bool "ZMK display support" + default n + select DISPLAY + select LVGL + select LVGL_THEMES + select LVGL_THEME_MONO + select LVGL_OBJ_LABEL menu "Split Support" @@ -163,7 +171,13 @@ endif endmenu config HEAP_MEM_POOL_SIZE - default 1024 + default 8192 + +config KERNEL_BIN_NAME + default "zmk" + +config REBOOT + default y module = ZMK module-str = zmk diff --git a/app/boards/shields/kyria/Kconfig.defconfig b/app/boards/shields/kyria/Kconfig.defconfig index bc0a7b8..405377b 100644 --- a/app/boards/shields/kyria/Kconfig.defconfig +++ b/app/boards/shields/kyria/Kconfig.defconfig @@ -18,5 +18,41 @@ if SHIELD_KYRIA_LEFT || SHIELD_KYRIA_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 + default 128 + +config LVGL_VER_RES + 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/kyria/kyria.dtsi b/app/boards/shields/kyria/kyria.dtsi index 89fc70f..bbead84 100644 --- a/app/boards/shields/kyria/kyria.dtsi +++ b/app/boards/shields/kyria/kyria.dtsi @@ -81,8 +81,22 @@ 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) sensors = <&left_encoder &right_encoder>; }; - // TODO: Encoder node(s) - // TODO: OLED node // TODO: RGB node(s) }; +&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 = <63>; + prechargep = <0x22>; + }; +}; diff --git a/app/boards/shields/lily58/Kconfig.defconfig b/app/boards/shields/lily58/Kconfig.defconfig index 8f278b0..89f217b 100644 --- a/app/boards/shields/lily58/Kconfig.defconfig +++ b/app/boards/shields/lily58/Kconfig.defconfig @@ -12,3 +12,43 @@ config ZMK_KEYBOARD_NAME default "Lily58 Right" endif + +if SHIELD_LILY58_LEFT || SHIELD_LILY58_RIGHT + +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 + default 128 + +config LVGL_VER_RES + default 32 + +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/lily58/lily58.dtsi b/app/boards/shields/lily58/lily58.dtsi index 5fd7341..8655d8c 100644 --- a/app/boards/shields/lily58/lily58.dtsi +++ b/app/boards/shields/lily58/lily58.dtsi @@ -44,7 +44,24 @@ RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(4,5) RC(4,6) RC(3,6) RC(3,7) ; }; - - // TODO: OLED node }; +&pro_micro_i2c { + status = "okay"; + + ssd1306@3c { + compatible = "solomon,ssd1306fb"; + reg = <0x3c>; + label = "DISPLAY"; + width = <128>; + height = <32>; + segment-offset = <0>; + page-offset = <0>; + display-offset = <0>; + multiplex-ratio = <31>; + segment-remap; + com-invdir; + com-sequential; + prechargep = <0x22>; + }; +}; diff --git a/app/cmake/zmk_config.cmake b/app/cmake/zmk_config.cmake index 8ecf710..e4d2632 100644 --- a/app/cmake/zmk_config.cmake +++ b/app/cmake/zmk_config.cmake @@ -44,13 +44,13 @@ endif() set(CACHED_ZMK_CONFIG ${ZMK_CONFIG} CACHE STRING "Selected user ZMK config") if (ZMK_CONFIG) - if(EXISTS "${ZMK_CONFIG}/boards") + if(EXISTS ${ZMK_CONFIG}/boards) message(STATUS "Adding ZMK config directory as board root: ${ZMK_CONFIG}") - list(APPEND BOARD_ROOT "${ZMK_CONFIG}") + list(APPEND BOARD_ROOT ${ZMK_CONFIG}) endif() - if(EXISTS "${ZMK_CONFIG}/dts") + if(EXISTS ${ZMK_CONFIG}/dts) message(STATUS "Adding ZMK config directory as DTS root: ${ZMK_CONFIG}") - list(APPEND DTS_ROOT "${ZMK_CONFIG}") + list(APPEND DTS_ROOT ${ZMK_CONFIG}) endif() endif() @@ -76,6 +76,7 @@ foreach(root ${BOARD_ROOT}) NO_DEFAULT_PATH ) foreach(shield_path ${shields_refs_list}) + get_filename_component(SHIELD_DIR ${shield_path} NAME) if (EXISTS "${shield_path}/keymap") list(APPEND KEYMAP_DIRS ${shield_path}/keymap) endif() @@ -101,7 +102,7 @@ if (BASE_KEYMAPS_DIR) endif() if (ZMK_CONFIG) - if (EXISTS "${ZMK_CONFIG}") + if (EXISTS ${ZMK_CONFIG}) message(STATUS "ZMK Config directory: ${ZMK_CONFIG}") list(APPEND DTS_ROOT ${ZMK_CONFIG}) if (EXISTS "${ZMK_CONFIG}/include") @@ -109,8 +110,13 @@ if (ZMK_CONFIG) endif() if (SHIELD) + message(STATUS "Board: ${BOARD}, ${BOARD_DIR}, ${SHIELD}, ${SHIELD_DIR}") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD_DIR}.overlay") + list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD_DIR}_${BOARD}.overlay") list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.overlay") list(APPEND overlay_candidates "${ZMK_CONFIG}/${SHIELD}.overlay") + list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD_DIR}.conf") + list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD_DIR}_${BOARD}.conf") list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}_${BOARD}.conf") list(APPEND config_candidates "${ZMK_CONFIG}/${SHIELD}.conf") endif() diff --git a/app/drivers/zephyr/Kconfig b/app/drivers/zephyr/Kconfig index 0237846..b22c4b1 100644 --- a/app/drivers/zephyr/Kconfig +++ b/app/drivers/zephyr/Kconfig @@ -25,7 +25,7 @@ menuconfig EC11 if EC11 -choice +choice EC11_TRIGGER prompt "Trigger mode" default EC11_TRIGGER_NONE help @@ -46,9 +46,6 @@ config EC11_TRIGGER_OWN_THREAD endchoice -config EC11_TRIGGER - bool - config EC11_THREAD_PRIORITY int "Thread priority" depends on EC11_TRIGGER_OWN_THREAD diff --git a/app/include/zmk/display.h b/app/include/zmk/display.h new file mode 100644 index 0000000..93ac3ff --- /dev/null +++ b/app/include/zmk/display.h @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2020 Peter Johanson <peter@peterjohanson.com> + * + * SPDX-License-Identifier: MIT + */ + +#pragma once + +int zmk_display_init(); +void zmk_display_task_handler();
\ No newline at end of file diff --git a/app/include/zmk/events/keycode-state-changed.h b/app/include/zmk/events/keycode-state-changed.h index 1663f9b..e12813c 100644 --- a/app/include/zmk/events/keycode-state-changed.h +++ b/app/include/zmk/events/keycode-state-changed.h @@ -3,7 +3,7 @@ * * SPDX-License-Identifier: MIT */ - + #pragma once #include <zephyr.h> diff --git a/app/prj.conf b/app/prj.conf deleted file mode 100644 index abb3bdd..0000000 --- a/app/prj.conf +++ /dev/null @@ -1,4 +0,0 @@ -# CONFIG_LOG=y -# CONFIG_ZMK_LOG_LEVEL_DBG=y -CONFIG_KERNEL_BIN_NAME="zmk" -CONFIG_REBOOT=y
\ No newline at end of file diff --git a/app/src/display.c b/app/src/display.c new file mode 100644 index 0000000..9021914 --- /dev/null +++ b/app/src/display.c @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2020 Peter Johanson + * + * SPDX-License-Identifier: MIT + */ + +#include <init.h> +#include <device.h> +#include <devicetree.h> + +#include <logging/log.h> +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); + +#include <drivers/display.h> +#include <lvgl.h> + +#define ZMK_DISPLAY_NAME CONFIG_LVGL_DISPLAY_DEV_NAME + +static struct device *display; + +static lv_obj_t *screen; + +int zmk_display_init() +{ + lv_obj_t *hello_world_label; + lv_obj_t *count_label; + + LOG_DBG(""); + + display = device_get_binding(ZMK_DISPLAY_NAME); + if (display == NULL) { + LOG_ERR("Failed to find display device"); + return -EINVAL; + } + + screen = lv_obj_create(NULL, NULL); + lv_scr_load(screen); + + hello_world_label = lv_label_create(lv_scr_act(), NULL); + lv_label_set_text(hello_world_label, "ZMK v0.1.0"); + lv_obj_align(hello_world_label, NULL, LV_ALIGN_CENTER, 0, 0); + count_label = lv_label_create(lv_scr_act(), NULL); + lv_label_set_text(count_label, CONFIG_ZMK_KEYBOARD_NAME); + lv_obj_align(count_label, NULL, LV_ALIGN_IN_BOTTOM_MID, 0, 0); + lv_task_handler(); + display_blanking_off(display); + + return 0; +} + +void zmk_display_task_handler() +{ + lv_tick_inc(10); + lv_task_handler(); + k_sleep(K_MSEC(10)); +} diff --git a/app/src/endpoints.c b/app/src/endpoints.c index 48dc2ec..c9ba716 100644 --- a/app/src/endpoints.c +++ b/app/src/endpoints.c @@ -3,7 +3,6 @@ #include <zmk/hid.h> #include <zmk/usb_hid.h> #include <zmk/hog.h> -# #include <logging/log.h> LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); diff --git a/app/src/main.c b/app/src/main.c index 5f28158..5a678ee 100644 --- a/app/src/main.c +++ b/app/src/main.c @@ -14,7 +14,7 @@ LOG_MODULE_REGISTER(zmk, CONFIG_ZMK_LOG_LEVEL); #include <zmk/matrix.h> #include <zmk/kscan.h> -#include <zmk/endpoints.h> +#include <zmk/display.h> #define ZMK_KSCAN_DEV DT_LABEL(ZMK_MATRIX_NODE_ID) @@ -26,4 +26,12 @@ void main(void) { return; } + +#ifdef CONFIG_ZMK_DISPLAY + zmk_display_init(); + + while (1) { + zmk_display_task_handler(); + } +#endif /* CONFIG_ZMK_DISPLAY */ } diff --git a/app/src/sensors.c b/app/src/sensors.c index 0a86109..501ce15 100644 --- a/app/src/sensors.c +++ b/app/src/sensors.c @@ -60,7 +60,8 @@ static void zmk_sensors_init_item(const char *node, u8_t i, u8_t abs_i) sensors[i].sensor_number = abs_i; if (!sensors[i].dev) { - LOG_ERR("Failed to find device for %s", node); + LOG_WRN("Failed to find device for %s", node); + return; } sensor_trigger_set(sensors[i].dev, &sensors[i].trigger, zmk_sensors_trigger_handler); |