summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPete Johanson <peter@peterjohanson.com>2020-07-25 23:16:04 -0400
committerGitHub <noreply@github.com>2020-07-25 23:16:04 -0400
commit998f42a2ed225e1ad0e67cc1e033619622b314c4 (patch)
tree52f4abf4c3959cb9ab602e99d9aee587b3d646b8
parent91d8237cab170e16d5a9349c06d15ac6e78e14cd (diff)
parent5e96c0014a2a2a97c7363df9c74f062d0e3b806b (diff)
Merge pull request #63 from petejohanson/display/initial-lvgl-display-support
Initial display support.
-rw-r--r--app/CMakeLists.txt1
-rw-r--r--app/Kconfig10
-rw-r--r--app/boards/shields/kyria/Kconfig.defconfig36
-rw-r--r--app/boards/shields/kyria/kyria.dtsi18
-rw-r--r--app/boards/shields/lily58/Kconfig.defconfig40
-rw-r--r--app/boards/shields/lily58/lily58.dtsi21
-rw-r--r--app/include/zmk/display.h10
-rw-r--r--app/src/display.c56
-rw-r--r--app/src/main.c10
-rw-r--r--app/src/sensors.c3
10 files changed, 198 insertions, 7 deletions
diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt
index 45c6885..73b1534 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 21cc91c..e86198e 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"
@@ -139,7 +147,7 @@ config ZMK_ACTION_MOD_TAP
endmenu
config HEAP_MEM_POOL_SIZE
- default 1024
+ default 8192
config KERNEL_BIN_NAME
default "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/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/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/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);