Skip to content

Commit

Permalink
[Keyboard] add kinT kinesis keyboard controller (kint41 variant)
Browse files Browse the repository at this point in the history
  • Loading branch information
stapelberg committed Jun 20, 2021
1 parent f106f77 commit 6e3f6b2
Show file tree
Hide file tree
Showing 8 changed files with 322 additions and 0 deletions.
3 changes: 3 additions & 0 deletions keyboards/kinesis/kinesis.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,9 @@
#ifdef KEYBOARD_kinesis_kint36
#include "kint36.h"
#endif
#ifdef KEYBOARD_kinesis_kint41
#include "kint41.h"
#endif

#include "quantum.h"

Expand Down
33 changes: 33 additions & 0 deletions keyboards/kinesis/kint41/chconf.h
Original file line number Diff line number Diff line change
@@ -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 changes: 105 additions & 0 deletions keyboards/kinesis/kint41/config.h
Original file line number Diff line number Diff line change
@@ -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
* asym_eager_defer_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 changes: 52 additions & 0 deletions keyboards/kinesis/kint41/kint41.c
Original file line number Diff line number Diff line change
@@ -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 changes: 92 additions & 0 deletions keyboards/kinesis/kint41/kint41.h
Original file line number Diff line number Diff line change
@@ -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 changes: 22 additions & 0 deletions keyboards/kinesis/kint41/mcuconf.h
Original file line number Diff line number Diff line change
@@ -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 changes: 3 additions & 0 deletions keyboards/kinesis/kint41/readme.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# kinesis_kint41 keyboard firmware

Please see https://github.com/kinx-project/kint for details.
12 changes: 12 additions & 0 deletions keyboards/kinesis/kint41/rules.mk
Original file line number Diff line number Diff line change
@@ -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 = asym_eager_defer_pk

0 comments on commit 6e3f6b2

Please sign in to comment.