Initial working Clueboard California Macropad w/ proton-c fixes

* Basic Clueboard Californai Macropad shield definition.
* New "direct" KSCAN driver that supports non-matrix direct
  wiring for switches, needed for macropad that doesn't have
  a matrix at all.
* Some renames for existing KSCAN GPIO driver to make the implied
  "matrix" part explicit.
This commit is contained in:
Pete Johanson 2020-06-24 10:06:35 -04:00
parent 23931aa4fe
commit d35a95c7af
16 changed files with 129 additions and 11 deletions

View file

@ -55,7 +55,7 @@
}; };
kscan { kscan {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "Keyscan Matrix"; label = "Keyscan Matrix";
row-gpios = <&gpioa 10 GPIO_ACTIVE_HIGH>, row-gpios = <&gpioa 10 GPIO_ACTIVE_HIGH>,
<&gpioa 9 GPIO_ACTIVE_HIGH>, <&gpioa 9 GPIO_ACTIVE_HIGH>,

View file

@ -1,6 +1,7 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
board_runner_args(jlink "--device=STM32F303VC" "--speed=4000") board_runner_args(dfu-util "--pid=0483:df11" "--alt=0" "--dfuse")
board_runner_args(jlink "--device=STM32F303CC" "--speed=4000")
include(${ZEPHYR_BASE}/boards/common/openocd.board.cmake) include(${ZEPHYR_BASE}/boards/common/dfu-util.board.cmake)
include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake) include(${ZEPHYR_BASE}/boards/common/jlink.board.cmake)

View file

@ -0,0 +1,14 @@
if SHIELD_CLUEBOARD_CALIFORNIA
config ZMK_KEYBOARD_NAME
default "Clueboard California Macropad"
# Unable to use interrupts as the same pin number is used
# across A & B controllers, and STM32F303CCT6 can't enable
# interrutps for multiple controllers for the same "line"
# for the external interrupts.
config ZMK_KSCAN_GPIO_POLLING
default y
endif

View file

@ -0,0 +1,5 @@
# Copyright (c) 2020 Pete Johanson
# SPDX-License-Identifier: MIT
config SHIELD_CLUEBOARD_CALIFORNIA
def_bool $(shields_list_contains,clueboard_california)

View file

@ -0,0 +1,34 @@
/*
* Copyright (c) 2020 Pete Johanson
*
* SPDX-License-Identifier: MIT
*/
/ {
chosen {
zmk,kscan = &kscan0;
};
kscan0: kscan_0 {
compatible = "zmk,kscan-gpio-direct";
label = "KSCAN";
input-gpios
= <&gpioa 10 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpioa 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpioa 0 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpiob 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpiob 11 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpiob 9 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpioa 8 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpioa 7 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpiob 1 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
, <&gpiob 2 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
;
};
// TODO: Per-key LED node(s)
};

View file

@ -0,0 +1,24 @@
#include <dt-bindings/zmk/keys.h>
#include <dt-bindings/zmk/matrix-transform.h>
#include <keymap.h>
/ {
chosen {
zmk,keymap = &keymap0;
};
keymap0: keymap {
compatible = "zmk,keymap";
label ="Default Kyria Keymap";
layers = <&default>;
};
layers {
compatible = "zmk,layers";
default: layer_0 {
label = "DEFAULT";
keys = <KC_9 KC_8 KC_7 KC_6 KC_5 KC_4 KC_3 KC_2 KC_1 KC_0>;
};
};
};

View file

@ -0,0 +1,24 @@
# Clueboard California Macropad
A small 10-key macropad in the shape of the US state of California,
## Features
* Per key LED.
* Proton-C compatible, including space for the piezo speaker.
* Direct GPIO wiring, no GPIO matrix at all.
Will need to set them to be PULL HIGH, and ACTIVE LOW
| Switch | Switch Pin | LED Pin |
| ------------ | ---------- | ------- |
| shasta1 | a10 | a2 |
| modoc1 | a9 | b5 |
| mendocino1 | a0 | a1 |
| lassen1 | b8 | b4 |
| eldorado1 | b11 | b12 |
| big_sur1 | b9 | b10 |
| sierra1 | a8 | a15 |
| los_padres1 | a7 | a6 |
| mojave1 | b1 | b0 |
| joshua_tree1 | b2 | b3 |

View file

@ -29,7 +29,7 @@
}; };
kscan_left: kscan_left { kscan_left: kscan_left {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN_LEFT"; label = "KSCAN_LEFT";
diode-direction = "row2col"; diode-direction = "row2col";
@ -49,7 +49,7 @@
}; };
kscan_right: kscan_right { kscan_right: kscan_right {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN_RIGHT"; label = "KSCAN_RIGHT";
diode-direction = "row2col"; diode-direction = "row2col";

View file

@ -21,7 +21,7 @@
}; };
left_hand: kscan_1 { left_hand: kscan_1 {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN_LEFT"; label = "KSCAN_LEFT";
diode-direction = "row2col"; diode-direction = "row2col";
@ -32,7 +32,7 @@
}; };
right_hand: kscan_2 { right_hand: kscan_2 {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN_RIGHT"; label = "KSCAN_RIGHT";
diode-direction = "row2col"; diode-direction = "row2col";

View file

@ -5,7 +5,7 @@
}; };
kscan0: kscan { kscan0: kscan {
compatible = "gpio-kscan"; compatible = "zmk,kscan-gpio-matrix";
label = "KSCAN"; label = "KSCAN";
diode-direction = "row2col"; diode-direction = "row2col";

View file

@ -4,6 +4,7 @@ if(CONFIG_ZMK_KSCAN_GPIO_DRIVER)
zephyr_library() zephyr_library()
zephyr_library_sources( zephyr_library_sources(
kscan_gpio.c kscan_gpio_matrix.c
kscan_gpio_direct.c
) )
endif() endif()

View file

@ -3,6 +3,14 @@ config ZMK_KSCAN_GPIO_DRIVER
default y default y
select GPIO select GPIO
if ZMK_KSCAN_GPIO_DRIVER
config ZMK_KSCAN_GPIO_POLLING
bool "Poll for key event triggers instead of using interrupts"
default n
endif
config ZMK_KSCAN_INIT_PRIORITY config ZMK_KSCAN_INIT_PRIORITY
int "Keyboard scan driver init priority" int "Keyboard scan driver init priority"
default 40 default 40

View file

@ -3,7 +3,7 @@
description: GPIO keyboard matrix controller description: GPIO keyboard matrix controller
compatible: "gpio-kscan" compatible: "zmk,kscan-gpio-matrix"
include: kscan.yaml include: kscan.yaml

View file

@ -4,7 +4,7 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#define DT_DRV_COMPAT gpio_kscan #define DT_DRV_COMPAT zmk_kscan_gpio_matrix
#include <device.h> #include <device.h>
#include <drivers/kscan.h> #include <drivers/kscan.h>
@ -13,6 +13,8 @@
LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL); LOG_MODULE_DECLARE(zmk, CONFIG_ZMK_LOG_LEVEL);
#if DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT)
struct kscan_gpio_item_config struct kscan_gpio_item_config
{ {
char *label; char *label;
@ -254,3 +256,5 @@ static int kscan_gpio_config_interrupts(struct device **devices,
&gpio_driver_api_##n); &gpio_driver_api_##n);
DT_INST_FOREACH_STATUS_OKAY(GPIO_INST_INIT) DT_INST_FOREACH_STATUS_OKAY(GPIO_INST_INIT)
#endif /* DT_HAS_COMPAT_STATUS_OKAY(DT_DRV_COMPAT) */

View file

@ -5,6 +5,9 @@
#if DT_NODE_HAS_PROP(ZMK_MATRIX_NODE_ID,row_gpios) #if DT_NODE_HAS_PROP(ZMK_MATRIX_NODE_ID,row_gpios)
#define ZMK_MATRIX_ROWS DT_PROP_LEN(ZMK_MATRIX_NODE_ID,row_gpios) #define ZMK_MATRIX_ROWS DT_PROP_LEN(ZMK_MATRIX_NODE_ID,row_gpios)
#define ZMK_MATRIX_COLS DT_PROP_LEN(ZMK_MATRIX_NODE_ID,col_gpios) #define ZMK_MATRIX_COLS DT_PROP_LEN(ZMK_MATRIX_NODE_ID,col_gpios)
#elif DT_NODE_HAS_PROP(ZMK_MATRIX_NODE_ID,input_gpios)
#define ZMK_MATRIX_ROWS 1
#define ZMK_MATRIX_COLS DT_PROP_LEN(ZMK_MATRIX_NODE_ID,input_gpios)
#else #else
#define ZMK_MATRIX_ROWS DT_PROP(ZMK_MATRIX_NODE_ID,rows) #define ZMK_MATRIX_ROWS DT_PROP(ZMK_MATRIX_NODE_ID,rows)
#define ZMK_MATRIX_COLS DT_PROP(ZMK_MATRIX_NODE_ID,columns) #define ZMK_MATRIX_COLS DT_PROP(ZMK_MATRIX_NODE_ID,columns)