diff --git a/app/boards/arm/nrf52840_m2/Kconfig.defconfig b/app/boards/arm/nrf52840_m2/Kconfig.defconfig index f3e1f0eb..e6bb4a10 100644 --- a/app/boards/arm/nrf52840_m2/Kconfig.defconfig +++ b/app/boards/arm/nrf52840_m2/Kconfig.defconfig @@ -25,4 +25,7 @@ config ZMK_BLE config ZMK_USB default y +config IS31FL3733 + default y + endif # BOARD_NRF52840_M2 diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts index e090842c..ff06a26b 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2.dts +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2.dts @@ -16,7 +16,11 @@ zephyr,sram = &sram0; zephyr,flash = &flash0; }; - + ext-power { + compatible = "zmk,ext-power-generic"; + label = "EXT_POWER"; + control-gpios = <&gpio1 4 GPIO_ACTIVE_HIGH>; + }; leds { compatible = "gpio-leds"; red_led: led_0 { @@ -32,9 +36,19 @@ label = "Blue LED"; }; }; - }; - +&i2c0 { + compatible = "nordic,nrf-twi"; + status = "okay"; + sda-pin = <36>; + scl-pin = <37>; + clock-frequency = < I2C_BITRATE_STANDARD >; + is31fl3733a: is31fl3733@50 { + compatible = "issi,is31fl3733"; + label = "IS31FL3733A"; + reg = <0x50>; + }; +}; &adc { status = "okay"; }; diff --git a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig index 2f563c38..94bda406 100644 --- a/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig +++ b/app/boards/arm/nrf52840_m2/nrf52840_m2_defconfig @@ -19,3 +19,28 @@ CONFIG_SETTINGS_NVS=y CONFIG_FLASH=y CONFIG_FLASH_PAGE_LAYOUT=y CONFIG_FLASH_MAP=y +CONFIG_SENSOR=y +CONFIG_IS31FL3733=y +# Turn on logging. +CONFIG_LOG=y +CONFIG_ZMK_LOG_LEVEL_DBG=y +CONFIG_LOG_STRDUP_BUF_COUNT=16 +CONFIG_SERIAL=y +CONFIG_LOG_BACKEND_SHOW_COLOR=y + +# Log via USB. +CONFIG_USB_DEVICE_STACK=y +CONFIG_USB_CDC_ACM=y +CONFIG_USB_CDC_ACM_RINGBUF_SIZE=8192 +CONFIG_USB_CDC_ACM_DEVICE_NAME="CDC_ACM" +CONFIG_USB_CDC_ACM_DEVICE_COUNT=1 +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y +CONFIG_UART_CONSOLE=y +CONFIG_USB_UART_CONSOLE=y +CONFIG_UART_CONSOLE_ON_DEV_NAME="CDC_ACM_0" +CONFIG_ZMK_EXT_POWER=y +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=60000 +CONFIG_DEVICE_POWER_MANAGEMENT=y +CONFIG_ZMK_SLEEP=y \ No newline at end of file diff --git a/app/boards/arm/retic1337_tkl/Kconfig.defconfig b/app/boards/arm/retic1337_tkl/Kconfig.defconfig new file mode 100644 index 00000000..83f82e06 --- /dev/null +++ b/app/boards/arm/retic1337_tkl/Kconfig.defconfig @@ -0,0 +1,29 @@ +# retic1337_tkl board configuration + +if BOARD_RETIC1337_TKL + +config ZMK_KEYBOARD_NAME + default "Test_Keyboard" + +config I2C + default y + +config USB_NRFX + default y + +config USB_DEVICE_STACK + default y + +config BT_CTLR + default BT + +config ZMK_BLE + default y + +config ZMK_USB + default y + +config IS31FL3733 + default y + +endif # BOARD_RETIC1337_TKL diff --git a/app/boards/arm/retic1337_tkl/retic1337_tkl_defconfig b/app/boards/arm/retic1337_tkl/retic1337_tkl_defconfig new file mode 100644 index 00000000..ebe25f8b --- /dev/null +++ b/app/boards/arm/retic1337_tkl/retic1337_tkl_defconfig @@ -0,0 +1,39 @@ +CONFIG_SOC_SERIES_NRF52X=y +CONFIG_SOC_NRF52840_QIAA=y + +# Enable MPU +CONFIG_ARM_MPU=y + +# enable GPIO +CONFIG_GPIO=y + +# Turn on logging, and set ZMK logging to debug output +CONFIG_LOG=y +CONFIG_ZMK_LOG_LEVEL_DBG=y + +# Enable serial console +CONFIG_SERIAL=y +CONFIG_CONSOLE=y +CONFIG_UART_INTERRUPT_DRIVEN=y +CONFIG_UART_LINE_CTRL=y + +# Enable USB UART, and set the console device +CONFIG_UART_CONSOLE=y + +# additional board options +CONFIG_GPIO_AS_PINRESET=y + +#I2C +CONFIG_I2C=y +CONFIG_I2C_NRFX=y +CONFIG_I2C_0=y +CONFIG_I2C_INIT_PRIORITY=60 +CONFIG_IS31FL3733=y +CONFIG_SENSOR=y +CONFIG_BQ274XX=y +CONFIG_EC11=y +CONFIG_EC11_TRIGGER_GLOBAL_THREAD=y +CONFIG_ZMK_EXT_POWER=y +CONFIG_ZMK_IDLE_SLEEP_TIMEOUT=60000 +CONFIG_DEVICE_POWER_MANAGEMENT=y +CONFIG_ZMK_SLEEP=y \ No newline at end of file diff --git a/app/boards/shields/m60/m60.overlay b/app/boards/shields/m60/m60.overlay index 18d06511..0c67e6d9 100644 --- a/app/boards/shields/m60/m60.overlay +++ b/app/boards/shields/m60/m60.overlay @@ -11,7 +11,6 @@ zmk,kscan = &kscan0; zmk,matrix_transform = &default_transform; }; - kscan0: kscan { compatible = "zmk,kscan-gpio-matrix"; label = "KSCAN"; diff --git a/app/drivers/led/CMakeLists.txt b/app/drivers/led/CMakeLists.txt index b2879ffe..01472e83 100644 --- a/app/drivers/led/CMakeLists.txt +++ b/app/drivers/led/CMakeLists.txt @@ -1,4 +1,10 @@ # Copyright (c) 2020 The ZMK Contributors # SPDX-License-Identifier: MIT +<<<<<<< Updated upstream +======= +#zephyr_library() + +#zephyr_library_sources(led.c) +>>>>>>> Stashed changes add_subdirectory_ifdef(CONFIG_IS31FL3733 is31fl3733) diff --git a/app/drivers/led/is31fl3733/is31fl3733.c b/app/drivers/led/is31fl3733/is31fl3733.c index d5814170..a20e8968 100644 --- a/app/drivers/led/is31fl3733/is31fl3733.c +++ b/app/drivers/led/is31fl3733/is31fl3733.c @@ -169,6 +169,7 @@ static int is31fl3733_led_reset(const struct device *dev) { static int is31fl3733_led_init(const struct device *dev) { const struct is31fl3733_config *dev_cfg = dev->config; struct is31fl3733_data *dev_data = dev->data; + k_busy_wait(1000); dev_data->i2c = device_get_binding(dev_cfg->bus_name); if (dev_data->i2c == NULL) { LOG_DBG("Failed to get I2C device"); diff --git a/app/src/led_perkey.c b/app/src/led_perkey.c new file mode 100644 index 00000000..4e5ee225 --- /dev/null +++ b/app/src/led_perkey.c @@ -0,0 +1,135 @@ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); +#define ZMK_KSCAN_EVENT_STATE_PRESSED 0 +#define ZMK_KSCAN_EVENT_STATE_RELEASED 1 +#define BASE_RED 255 +#define BASE_GREEN 0 +#define BASE_BLUE 255 +uint8_t led_base_color[3] = {BASE_RED, BASE_GREEN, BASE_BLUE}; +#define PRESSED_RED 250 +#define PRESSED_GREEN 0 +#define PRESSED_BLUE 0 +uint8_t pressed_color[3] = {PRESSED_RED, PRESSED_GREEN, PRESSED_BLUE}; +struct zmk_kscan_event { + uint32_t row; + uint32_t column; + uint32_t state; +}; +K_MSGQ_DEFINE(zmk_kscan_msgxq, sizeof(struct zmk_kscan_event), CONFIG_ZMK_KSCAN_EVENT_QUEUE_SIZE, 4); +struct zmk_kscan_msg_processor { + struct k_work work; +} led_processor; + +static void zmk_kscan_callback_led(const struct device *dev, uint32_t row, uint32_t column, + bool pressed) { + struct zmk_kscan_event evx = { + .row = row, + .column = column, + .state = (pressed ? ZMK_KSCAN_EVENT_STATE_PRESSED : ZMK_KSCAN_EVENT_STATE_RELEASED)}; + + k_msgq_put(&zmk_kscan_msgxq, &evx, K_NO_WAIT); + k_work_submit(&led_processor.work); +} + +uint8_t led_lookup_matrix[108] = { 1, 0, 3, 5, 7, 9, 11, 13, 15, 65, 0, 67, 69, 71, 73, 75, 77, 79, + 17, 20, 22, 24, 26, 28, 30, 80, 81, 82, 83, 84, 85, 0, 86, 87, 88, 90, + 19, 21, 23, 25, 27, 29, 31, 96, 98, 100, 102, 104, 106, 0, 108, 109, 110, 92, + 34, 36, 38, 40, 42, 44, 46, 97, 99, 101, 103, 105, 0, 0, 107, 0, 0, 0, + 35, 0, 37, 39, 41, 43, 45, 47, 112, 113, 114, 115, 0, 0, 119, 0, 111, 0, + 49, 51, 53, 0, 0, 0, 0, 57, 0, 0, 0, 62, 116, 118, 121, 123, 125, 127}; + +void set_led_rgb(uint8_t led, uint8_t *rgb){ + struct device *dev = NULL; + if (led < 64){ + dev = device_get_binding("IS31FL3733A"); + } + else{ + dev = device_get_binding("IS31FL3733B"); + led = led - 64; + } + LOG_INF("Setting LED: %d to %d, %d, %d, on Device: %s\n", led, rgb[0], rgb[1], rgb[2], dev->name); + if (dev == NULL) { + LOG_ERR("Failed to get device binding\n"); + return; + } + led_set_color(dev, led, 3, rgb); +} +void zmk_kscan_process_msgxq(struct k_work *item) { + struct zmk_kscan_event evx; + + while (k_msgq_get(&zmk_kscan_msgxq, &evx, K_NO_WAIT) == 0) { + bool pressed = (evx.state == ZMK_KSCAN_EVENT_STATE_PRESSED); + uint32_t position = zmk_matrix_transform_row_column_to_position(evx.row, evx.column); + struct position_state_changed *pos_evx; + LOG_INF("Row: %d, col: %d, position: %d, pressed: %s, turning LED: %d %s\n", evx.row, evx.column, position, + (pressed ? "true" : "false"), led_lookup_matrix[position], (pressed ? "ON" : "OFF") ); + if (pressed){ + set_led_rgb(led_lookup_matrix[position], pressed_color); + } + else{ + set_led_rgb(led_lookup_matrix[position], led_base_color); + } + pos_evx = new_position_state_changed(); + pos_evx->state = pressed; + pos_evx->position = position; + pos_evx->timestamp = k_uptime_get(); + ZMK_EVENT_RAISE(pos_evx); + } +} +void set_all_on(const struct device *dev){ + for (uint8_t led = 0; led < 192; led++) { + led_on(dev, led); + } +} +void set_all_rgb(const struct device *dev, uint8_t *rgb){ + for (uint8_t led = 0; led < 64; led++) { + led_set_color(dev, led, 3, rgb); + } +} +int led_perkey_init(char *name) { + LOG_INF("ZMK_PER_KEY_LED INIT\n"); + const struct device *dev_a = device_get_binding("IS31FL3733A"); + if (!dev_a) { + LOG_ERR("I2C: Device driver not found.\n"); + return 0; + } + const struct device *dev_b = device_get_binding("IS31FL3733B"); + if (!dev_b) { + LOG_ERR("I2C: Device driver not found.\n"); + return 0; + } + if (dev_a == NULL) { + LOG_ERR("Failed to get device binding\n"); + return 0; + } + LOG_INF("device is %p, name is %s\n", dev_a, dev_a->name); + if (dev_b == NULL) { + LOG_ERR("Failed to get device binding\n"); + return 0; + } + LOG_INF("device is %p, name is %s\n", dev_b, dev_b->name); + set_all_on(dev_a); + set_all_on(dev_b); + set_all_rgb(dev_a, led_base_color); + set_all_rgb(dev_b, led_base_color); + const struct device *kscan_dev = device_get_binding(name); + if (kscan_dev == NULL) { + LOG_ERR("Failed to get the KSCAN device"); + return -EINVAL; + } + k_work_init(&led_processor.work, zmk_kscan_process_msgxq); + kscan_config(kscan_dev, zmk_kscan_callback_led); + kscan_enable_callback(kscan_dev); + return 0; +}