Browse Source

add kinT kinesis keyboard controller (kint41 variant) (#13333)

fixes https://github.com/kinx-project/kint/issues/5
Michael Stapelberg 3 years ago
parent
commit
f533d9e033

+ 3 - 0
keyboards/kinesis/kinesis.h

@@ -16,6 +16,9 @@
 #ifdef KEYBOARD_kinesis_kint36
 	#include "kint36.h"
 #endif
+#ifdef KEYBOARD_kinesis_kint41
+	#include "kint41.h"
+#endif
 
 #include "quantum.h"
 

+ 33 - 0
keyboards/kinesis/kint41/chconf.h

@@ -0,0 +1,33 @@
+/* Copyright 2020 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/*
+ * This file was auto-generated by:
+ *    `qmk chibios-confmigrate -i keyboards/kinesis/kint36/chconf.h -r platforms/chibios/common/configs/chconf.h`
+ */
+
+#pragma once
+
+#define CH_CFG_ST_TIMEDELTA 0
+
+#define CH_CFG_TIME_QUANTUM 20
+
+// One tick (minimum sleep interval) will be 100 μs. This value cannot be
+// increased arbitrarily: chSysTimerHandlerI() must be executed in less than one
+// tick as per http://forum.chibios.org/viewtopic.php?t=3712#p27851
+#define CH_CFG_ST_FREQUENCY 10000
+
+#include_next <chconf.h>

+ 105 - 0
keyboards/kinesis/kint41/config.h

@@ -0,0 +1,105 @@
+/* Copyright 2020 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+/* USB Device descriptor parameter */
+#undef VENDOR_ID
+#define VENDOR_ID 0x1209
+#undef PRODUCT_ID
+#define PRODUCT_ID 0x345C
+#undef DEVICE_VER
+#define DEVICE_VER 0x0001
+#undef MANUFACTURER
+#define MANUFACTURER "https://github.com/stapelberg"
+#undef PRODUCT
+#define PRODUCT "kinT (kint41)"
+
+/* key matrix size */
+#define MATRIX_ROWS 15
+#define MATRIX_COLS 7
+
+/*
+ * Keyboard Matrix Assignments
+ *
+ * Change this to how you wired your keyboard
+ * COLS: AVR pins used for columns, left to right
+ * ROWS: AVR pins used for rows, top to bottom
+ * DIODE_DIRECTION: COL2ROW = COL = Anode (+), ROW = Cathode (-, marked on diode)
+ *                  ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
+ *
+ */
+#define MATRIX_ROW_PINS               \
+    {                                 \
+        LINE_PIN8,      /* ROW_EQL */ \
+            LINE_PIN9,  /* ROW_1 */   \
+            LINE_PIN10, /* ROW_2 */   \
+            LINE_PIN11, /* ROW_3 */   \
+            LINE_PIN7,  /* ROW_4 */   \
+            LINE_PIN16, /* ROW_5 */   \
+            LINE_PIN5,  /* ROW_6 */   \
+            LINE_PIN3,  /* ROW_7 */   \
+            LINE_PIN4,  /* ROW_8 */   \
+            LINE_PIN1,  /* ROW_9 */   \
+            LINE_PIN0,  /* ROW_0 */   \
+            LINE_PIN2,  /* ROW_MIN */ \
+            LINE_PIN17, /* ROW_ESC */ \
+            LINE_PIN23, /* ROW_F1 */  \
+            LINE_PIN21, /* ROW_F2 */  \
+    }
+
+#define MATRIX_COL_PINS             \
+    {                               \
+        LINE_PIN18,     /* COL_0 */ \
+            LINE_PIN14, /* COL_1 */ \
+            LINE_PIN15, /* COL_2 */ \
+            LINE_PIN20, /* COL_3 */ \
+            LINE_PIN22, /* COL_4 */ \
+            LINE_PIN19, /* COL_5 */ \
+            LINE_PIN6   /* COL_6 */ \
+    }
+
+#define UNUSED_PINS
+
+/* COL2ROW or ROW2COL */
+#define DIODE_DIRECTION COL2ROW
+
+/* Well-worn Cherry MX key switches can bounce for up to 20ms, despite the
+ * Cherry data sheet specifying 5ms. Because we use the sym_eager_pk debounce
+ * algorithm, this debounce latency only affects key releases (not key
+ * presses). */
+#undef DEBOUNCE
+#define DEBOUNCE 20
+
+#define IGNORE_MOD_TAP_INTERRUPT
+
+// Reduce input latency by lowering the USB polling interval
+// from its 10ms default to the 125μs minimum that USB 2.x (High Speed) allows:
+#define USB_POLLING_INTERVAL_MS 1
+
+/* We use the i.MX RT1060 high-speed GPIOs (GPIO6-9) which are connected to the
+ * AHB bus (AHB_CLK_ROOT), which runs at the same speed as the ARM Core Clock,
+ * i.e. 600 MHz. See MIMXRT1062, page 949, 12.1 Chip-specific GPIO information.
+ * No additional delay is necessary. */
+
+// in clock cycles
+#define GPIO_INPUT_PIN_DELAY 0
+
+#define LED_PIN_ON_STATE 0
+#define LED_NUM_LOCK_PIN LINE_PIN26
+#define LED_CAPS_LOCK_PIN LINE_PIN12
+#define LED_SCROLL_LOCK_PIN LINE_PIN25
+#define LED_COMPOSE_PIN LINE_PIN24

+ 52 - 0
keyboards/kinesis/kint41/kint41.c

@@ -0,0 +1,52 @@
+/* Copyright 2020 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "kint41.h"
+
+void matrix_init_kb(void) {
+    matrix_init_user();
+
+// Turn on the Teensy 4.x Power LED:
+#define LED_POWER LINE_PIN13
+    setPinOutput(LED_POWER);
+    writePinHigh(LED_POWER);
+}
+
+// delay_inline sleeps for |cycles| (e.g. sleeping for F_CPU will sleep 1s).
+// delay_inline assumes the cycle counter has already been initialized and
+// should not be modified, i.e. it is safe to call during keyboard matrix scan.
+//
+// ChibiOS enables the cycle counter in chcore_v7m.c:
+// https://github.com/ChibiOS/ChibiOS/blob/b63023915c304092acb9f33bbab40f3ec07a7f0e/os/common/ports/ARMCMx/chcore_v7m.c#L263
+static void delay_inline(const uint32_t cycles) {
+  const uint32_t start = DWT->CYCCNT;
+  while ((DWT->CYCCNT - start) < cycles) {
+    // busy-loop until time has passed
+  }
+}
+
+void matrix_output_unselect_delay(void) {
+  // Use the cycle counter to do precise timing in microseconds. The ChibiOS
+  // thread sleep functions only allow sleep durations starting at 1 tick, which
+  // is 100μs in our configuration.
+
+  // Empirically: e.g. 5μs is not enough, will result in keys that don’t work
+  // and ghost key presses. 10μs seems to work well.
+
+  // 600 cycles at 0.6 cycles/ns == 1μs
+  const uint32_t cycles_per_us = 600;
+  delay_inline(10 * cycles_per_us);
+}

+ 92 - 0
keyboards/kinesis/kint41/kint41.h

@@ -0,0 +1,92 @@
+/* Copyright 2020 QMK
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include "quantum.h"
+
+#define ___ KC_NO
+
+// This a shortcut to help you visually see your layout.
+// The first section contains all of the arguments as on the physical keyboard
+// The second converts the arguments into the 2-D scanned array
+
+#define LAYOUT(                                   \
+    kC0, kD0, kE0, kC1, kD1, kE1, kC2, kD2, kE2,  \
+    k00, k10, k20, k30, k40, k50,                 \
+    k01, k11, k21, k31, k41, k51,                 \
+    k02, k12, k22, k32, k42, k52,                 \
+    k03, k13, k23, k33, k43, k53,                 \
+         k14, k24, k34, k54,                      \
+                             k56, k55,            \
+                                  k35,            \
+                        k36, k46, k25,            \
+                                                  \
+    kC3, kD3, kE3, kC4, kD4, kE4, kC5, kE5, kD5,  \
+                   k60, k70, k80, k90, kA0, kB0,  \
+                   k61, k71, k81, k91, kA1, kB1,  \
+                   k62, k72, k82, k92, kA2, kB2,  \
+                   k63, k73, k83, k93, kA3, kB3,  \
+                        k64, k84, k94, kA4,       \
+              k96, k85,                           \
+              k86,                                \
+              k66, k75, k65                       \
+) {                                              \
+    { k00,  k01,  k02,  k03,  ___,  ___,  ___ }, \
+    { k10,  k11,  k12,  k13,  k14,  ___,  ___ }, \
+    { k20,  k21,  k22,  k23,  k24,  k25,  ___ }, \
+    { k30,  k31,  k32,  k33,  k34,  k35,  k36 }, \
+    { k40,  k41,  k42,  k43,  ___,  ___,  k46 }, \
+    { k50,  k51,  k52,  k53,  k54,  k55,  k56 }, \
+    { k60,  k61,  k62,  k63,  k64,  k65,  k66 }, \
+    { k70,  k71,  k72,  k73,  ___,  k75,  ___ }, \
+    { k80,  k81,  k82,  k83,  k84,  k85,  k86 }, \
+    { k90,  k91,  k92,  k93,  k94,  ___,  k96 }, \
+    { kA0,  kA1,  kA2,  kA3,  kA4,  ___,  ___ }, \
+    { kB0,  kB1,  kB2,  kB3,  ___,  ___,  ___ }, \
+    { kC0,  kC1,  kC2,  kC3,  kC4,  kC5,  ___ }, \
+    { kD0,  kD1,  kD2,  kD3,  kD4,  kD5,  ___ }, \
+    { kE0,  kE1,  kE2,  kE3,  kE4,  kE5,  ___ }, \
+}
+
+/*  ---------------- LEFT HAND -----------------   ---------------- RIGHT HAND ---------------- */
+#define LAYOUT_pretty(                                                                           \
+    kC0, kD0, kE0, kC1, kD1, kE1, kC2, kD2, kE2,   kC3, kD3, kE3, kC4, kD4, kE4, kC5, kE5, kD5,  \
+    k00, k10, k20, k30, k40, k50,                            k60, k70, k80, k90, kA0, kB0,       \
+    k01, k11, k21, k31, k41, k51,                            k61, k71, k81, k91, kA1, kB1,       \
+    k02, k12, k22, k32, k42, k52,                            k62, k72, k82, k92, kA2, kB2,       \
+    k03, k13, k23, k33, k43, k53,                            k63, k73, k83, k93, kA3, kB3,       \
+         k14, k24, k34, k54,                                      k64, k84, k94, kA4,            \
+                             k56, k55,                  k96, k85,                                \
+                                  k35,                  k86,                                     \
+                        k36, k46, k25,                  k66, k75, k65                            \
+) {                                              \
+    { k00,  k01,  k02,  k03,  ___,  ___,  ___ }, \
+    { k10,  k11,  k12,  k13,  k14,  ___,  ___ }, \
+    { k20,  k21,  k22,  k23,  k24,  k25,  ___ }, \
+    { k30,  k31,  k32,  k33,  k34,  k35,  k36 }, \
+    { k40,  k41,  k42,  k43,  ___,  ___,  k46 }, \
+    { k50,  k51,  k52,  k53,  k54,  k55,  k56 }, \
+    { k60,  k61,  k62,  k63,  k64,  k65,  k66 }, \
+    { k70,  k71,  k72,  k73,  ___,  k75,  ___ }, \
+    { k80,  k81,  k82,  k83,  k84,  k85,  k86 }, \
+    { k90,  k91,  k92,  k93,  k94,  ___,  k96 }, \
+    { kA0,  kA1,  kA2,  kA3,  kA4,  ___,  ___ }, \
+    { kB0,  kB1,  kB2,  kB3,  ___,  ___,  ___ }, \
+    { kC0,  kC1,  kC2,  kC3,  kC4,  kC5,  ___ }, \
+    { kD0,  kD1,  kD2,  kD3,  kD4,  kD5,  ___ }, \
+    { kE0,  kE1,  kE2,  kE3,  kE4,  kE5,  ___ }  \
+}

+ 22 - 0
keyboards/kinesis/kint41/mcuconf.h

@@ -0,0 +1,22 @@
+/*
+    ChibiOS - Copyright (C) 2006..2015 Giovanni Di Sirio
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+        http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+*/
+
+#ifndef _MCUCONF_H_
+#define _MCUCONF_H_
+
+#define MIMXRT1062_MCUCONF
+
+#endif /* _MCUCONF_H_ */

+ 3 - 0
keyboards/kinesis/kint41/readme.md

@@ -0,0 +1,3 @@
+# kinesis_kint41 keyboard firmware
+
+Please see https://github.com/kinx-project/kint for details.

+ 12 - 0
keyboards/kinesis/kint41/rules.mk

@@ -0,0 +1,12 @@
+MCU_FAMILY = MIMXRT1062
+MCU_SERIES = MIMXRT1062
+MCU_LDSCRIPT = MIMXRT1062
+MCU_STARTUP = MIMXRT1062
+BOARD = IC_TEENSY_4_1
+MCU  = cortex-m4
+ARMV = 7
+
+# Debounce eagerly (report change immediately), keep per-key timers. We can use
+# this because the Cherry MX keyswitches on the Kinesis only produce noise while
+# pressed.
+DEBOUNCE_TYPE = sym_eager_pk