This commit is contained in:
retic1337 2021-09-26 17:29:58 -07:00
parent aad030e0d4
commit f7a4f6f97b
9 changed files with 255 additions and 4 deletions

View file

@ -25,4 +25,7 @@ config ZMK_BLE
config ZMK_USB
default y
config IS31FL3733
default y
endif # BOARD_NRF52840_M2

View file

@ -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";
};

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -11,7 +11,6 @@
zmk,kscan = &kscan0;
zmk,matrix_transform = &default_transform;
};
kscan0: kscan {
compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN";

View file

@ -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)

View file

@ -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");

135
app/src/led_perkey.c Normal file
View file

@ -0,0 +1,135 @@
#include <init.h>
#include <zephyr.h>
#include <device.h>
#include <devicetree.h>
#include <sys/__assert.h>
#include <drivers/kscan.h>
#include <zmk/matrix_transform.h>
#include <zmk/event_manager.h>
#include <zmk/events/position_state_changed.h>
#include <drivers/led.h>
#include <logging/log.h>
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;
}