Co-authored-by: Ryan <fauxpark@gmail.com>pull/17405/head
@ -0,0 +1,17 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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 "adm42.h" |
@ -0,0 +1,31 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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 LAYOUT_adm42_3x12_6( \ | |||
K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112, \ | |||
K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212, \ | |||
K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312, \ | |||
K404, K405, K406, K407, K408, K409 \ | |||
) { \ | |||
{ K101, K102, K103, K104, K105, K106, K107, K108, K109, K110, K111, K112 }, \ | |||
{ K201, K202, K203, K204, K205, K206, K207, K208, K209, K210, K211, K212 }, \ | |||
{ K301, K302, K303, K304, K305, K306, K307, K308, K309, K310, K311, K312 }, \ | |||
{ KC_NO, KC_NO, KC_NO, K404, K405, K407, K406, K408, K409, KC_NO, KC_NO, KC_NO } \ | |||
} |
@ -0,0 +1,39 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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 "config_common.h" | |||
/* Microchip ADM42 sublicensing */ | |||
#define VENDOR_ID 0x04D8 | |||
#define PRODUCT_ID 0xE873 | |||
#define DEVICE_VER 0x0001 | |||
#define MANUFACTURER Lorenzo Leonini | |||
#define PRODUCT ADM42 | |||
#define MATRIX_ROWS 4 | |||
#define MATRIX_COLS 12 | |||
#define DIODE_DIRECTION ROW2COL | |||
#define TAP_CODE_DELAY 1 | |||
#define DEBOUNCE 10 | |||
#if defined(CONSOLE_ENABLE) | |||
#define DEBUG_MATRIX_SCAN_RATE | |||
#endif |
@ -0,0 +1,27 @@ | |||
# ADM42 | |||
![ADM42](https://i.imgur.com/pviCQSQh.jpeg) | |||
A compact ergonomic 40% ortholinear keyboard. [More info on ADM42.dev](https://adm42.dev) | |||
* Keyboard Maintainer: [Lorenzo Leonini](https://github.com/lleonini) | |||
* Hardware Supported: ADM42 | |||
* Hardware Availability: [Shop](https://shop.adm42.dev) | |||
Make example for this keyboard (after setting up your build environment): | |||
make adm42:default | |||
Flashing example for this keyboard: | |||
make adm42:default:flash | |||
See the [build environment setup](https://docs.qmk.fm/#/getting_started_build_tools) and the [make instructions](https://docs.qmk.fm/#/getting_started_make_guide) for more information. Brand new to QMK? Start with our [Complete Newbs Guide](https://docs.qmk.fm/#/newbs). | |||
## Bootloader | |||
Enter the bootloader in 3 ways: | |||
* **Keycode in layout**: Press the key mapped to `RESET` if it is available | |||
* **Bootmagic reset**: Hold down the key at (0,0) in the matrix (the top left key) and plug in the keyboard | |||
* **Physical reset button**: Briefly press the button on the back of the PCB |
@ -0,0 +1,52 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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/>. | |||
*/ | |||
#define MATRIX_COL_PINS { C6, B6, B5, B4, D7, D6, F0, F1, F4, F5, F6, F7 } | |||
#define MATRIX_ROW_PINS { C7, D5, D3, D2 } | |||
#define QMK_LED E6 | |||
#define RGB_DI_PIN B7 | |||
#define DRIVER_LED_TOTAL 42 | |||
#define RGB_MATRIX_MAXIMUM_BRIGHTNESS 170 | |||
#define RGB_MATRIX_CENTER { 112, 32 } | |||
#define RGB_DISABLE_WHEN_USB_SUSPENDED | |||
#define RGB_MATRIX_LED_PROCESS_LIMIT 21 | |||
#define RGB_MATRIX_LED_FLUSH_LIMIT 16 | |||
#define RGB_MATRIX_STARTUP_MODE RGB_MATRIX_CYCLE_LEFT_RIGHT | |||
#define RGB_MATRIX_TYPING_HEATMAP_DECREASE_DELAY_MS 20 | |||
#define RGB_MATRIX_KEYPRESSES | |||
#define RGB_MATRIX_FRAMEBUFFER_EFFECTS | |||
#define RGB_MATRIX_SAT_STEP 24 | |||
#define RGB_MATRIX_HUE_STEP 8 | |||
#define RGB_MATRIX_VAL_STEP 16 | |||
#define RGB_MATRIX_SPD_STEP 16 | |||
#define ENABLE_RGB_MATRIX_BREATHING | |||
#define ENABLE_RGB_MATRIX_CYCLE_LEFT_RIGHT | |||
#define ENABLE_RGBLIGHT_MODE_STATIC_LIGHT | |||
#define ENABLE_RGB_MATRIX_CYCLE_UP_DOWN | |||
#define ENABLE_RGB_MATRIX_PIXEL_FRACTAL | |||
#define ENABLE_RGB_MATRIX_TYPING_HEATMAP | |||
#define ENABLE_RGB_MATRIX_SOLID_REACTIVE_SIMPLE | |||
#define ENABLE_RGB_MATRIX_JELLYBEAN_RAINDROPS | |||
#define ENABLE_RGB_MATRIX_CYCLE_OUT_IN | |||
#define ENABLE_RGB_MATRIX_CYCLE_PINWHEEL | |||
#define ENABLE_RGB_MATRIX_PIXEL_RAIN | |||
#define ENABLE_RGB_MATRIX_DIGITAL_RAIN | |||
#define ENABLE_RGB_MATRIX_BAND_VAL | |||
#define ENABLE_RGB_MATRIX_SPLASH |
@ -0,0 +1,3 @@ | |||
#define HOLD_ON_OTHER_KEY_PRESS_PER_KEY | |||
#define TAPPING_FORCE_HOLD_PER_KEY | |||
#define IGNORE_MOD_TAP_INTERRUPT_PER_KEY |
@ -0,0 +1,210 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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 QMK_KEYBOARD_H | |||
enum custom_layers { | |||
_QWERTY, | |||
_COLEMAKDH, | |||
_SPECIAL, | |||
_EXTRA, | |||
_ADM, | |||
_SETUP, | |||
}; | |||
#define LW_GRV LWIN_T(KC_GRV) | |||
#define RW_EQU RWIN_T(KC_EQUAL) | |||
#define RW_BS RWIN_T(KC_BSLS) | |||
#define LC_TAB LCTL_T(KC_TAB) | |||
#define RC_QUT RCTL_T(KC_QUOT) | |||
#define LS_BPC LSFT_T(KC_BSPC) | |||
#define RS_SPC RSFT_T(KC_SPC) | |||
#define LA_BS LALT_T(KC_BSLS) | |||
#define LW_F11 LWIN_T(KC_F11) | |||
#define LC_APP LCTL_T(KC_APP) | |||
#define LA_TOG LALT_T(RGB_TOG) | |||
#define RW_F12 RWIN_T(KC_F12) | |||
#define LLS_ESC LT(_SPECIAL, KC_ESC) | |||
#define LLS_RALT LT(_SPECIAL, KC_RALT) | |||
#define LLE_ENT LT(_EXTRA, KC_ENT) | |||
#define LLA_DEL LT(_ADM, KC_DEL) | |||
#define SETUP MO(_SETUP) | |||
enum custom_keycodes { | |||
REFLASH = SAFE_RANGE, | |||
LC_CIRC, | |||
RC_DLR, | |||
DF_QWER, | |||
DF_COLE, | |||
}; | |||
// Not a mistake to have KC_LALT (also) on the right, RALT is kept for compose (LLS_RALT) | |||
const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
[_QWERTY] = LAYOUT_adm42_3x12_6( | |||
LW_GRV, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, RW_EQU, | |||
LC_TAB, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCLN, RC_QUT, | |||
KC_LALT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMM, KC_DOT, KC_SLSH, KC_LALT, | |||
LLS_ESC, LS_BPC, LLA_DEL, LLE_ENT, RS_SPC, LLS_RALT | |||
), | |||
[_COLEMAKDH] = LAYOUT_adm42_3x12_6( | |||
LW_GRV, KC_Q, KC_W, KC_F, KC_P, KC_B, KC_J, KC_L, KC_U, KC_Y, KC_SCLN, RW_EQU, | |||
LC_TAB, KC_A, KC_R, KC_S, KC_T, KC_G, KC_M, KC_N, KC_E, KC_I, KC_O, RC_QUT, | |||
KC_LALT, KC_Z, KC_X, KC_C, KC_D, KC_V, KC_K, KC_H, KC_COMM, KC_DOT, KC_SLSH, KC_LALT, | |||
LLS_ESC, LS_BPC, LLA_DEL, LLE_ENT, RS_SPC, LLS_RALT | |||
), | |||
[_SPECIAL] = LAYOUT_adm42_3x12_6( | |||
_______, KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, RW_BS, | |||
LC_CIRC, KC_LBRC, KC_RBRC, KC_LPRN, KC_RPRN, KC_EXLM, KC_LEFT, KC_DOWN, KC_UP, KC_RGHT, KC_MINS, RC_DLR, | |||
_______, KC_AMPR, KC_AT, KC_LCBR, KC_RCBR, KC_PIPE, KC_UNDS, KC_ASTR, KC_HASH, KC_PERC, KC_TILD, _______, | |||
KC_ESC, _______, KC_DEL, KC_ENT, _______, KC_RALT | |||
), | |||
[_EXTRA] = LAYOUT_adm42_3x12_6( | |||
LW_F11, KC_F1, KC_F2, KC_F3, KC_F4, KC_F5, KC_F6, KC_F7, KC_F8, KC_F9, KC_F10, RW_F12, | |||
KC_LCTL, KC_PAUS, KC_INS, KC_VOLD, KC_VOLU, KC_MUTE, KC_HOME, KC_PGDN, KC_PGUP, KC_END, KC_APP, KC_RCTL, | |||
_______, KC_SLEP, KC_PWR, KC_MSTP, KC_MNXT, KC_MPLY, _______, KC_BRID, KC_BRIU, KC_PSCR, KC_WAKE, _______, | |||
KC_CAPS, _______, _______, _______, _______, KC_CAPS | |||
), | |||
[_ADM] = LAYOUT_adm42_3x12_6( | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_M_B, RGB_VAD, RGB_VAI, RGB_SAD, RGB_SAI, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_TOG, RGB_MOD, RGB_RMOD,RGB_HUD, RGB_HUI, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, RGB_M_P, RGB_SPD, RGB_SPI, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, SETUP, XXXXXXX, XXXXXXX | |||
), | |||
[_SETUP] = LAYOUT_adm42_3x12_6( | |||
REFLASH, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, DF_QWER, DF_COLE, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, EEP_RST, | |||
XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX, XXXXXXX | |||
), | |||
}; | |||
bool get_ignore_mod_tap_interrupt(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case RC_QUT: | |||
return true; | |||
default: | |||
return false; | |||
} | |||
} | |||
bool get_hold_on_other_key_press(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case LLS_ESC: | |||
case LLS_RALT: | |||
case LLE_ENT: | |||
case LLA_DEL: | |||
return true; | |||
default: | |||
return false; | |||
} | |||
} | |||
bool get_tapping_force_hold(uint16_t keycode, keyrecord_t *record) { | |||
switch (keycode) { | |||
case LLS_ESC: | |||
case LLS_RALT: | |||
return true; | |||
default: | |||
return false; | |||
} | |||
} | |||
static uint16_t last_timer = 0; | |||
static int last_key = 0; | |||
bool cleanup_return(uint16_t keycode, keyrecord_t *record, bool value) { | |||
if (record->event.pressed) { | |||
last_key = keycode; | |||
last_timer = timer_read(); | |||
} | |||
return value; | |||
} | |||
bool process_record_user(uint16_t keycode, keyrecord_t *record) { | |||
#ifdef CONSOLE_ENABLE | |||
uprintf("KL: kc: 0x%04X, col: %u, row: %u, pressed: %b, time: %u, interrupt: %b, count: %u\n", keycode, record->event.key.col, record->event.key.row, record->event.pressed, record->event.time, record->tap.interrupted, record->tap.count); | |||
#endif | |||
switch (keycode) { | |||
case RC_DLR: | |||
if (record->event.pressed) { | |||
register_code(KC_RCTL); | |||
} else { | |||
unregister_code(KC_RCTL); | |||
if (last_key == keycode && timer_elapsed(last_timer) <= TAPPING_TERM) { | |||
send_string("$"); | |||
} | |||
} | |||
return cleanup_return(keycode, record, false); | |||
case LC_CIRC: | |||
if (record->event.pressed) { | |||
register_code(KC_LCTL); | |||
} else { | |||
unregister_code(KC_LCTL); | |||
if (last_key == keycode && timer_elapsed(last_timer) <= TAPPING_TERM) { | |||
send_string("^"); | |||
} | |||
} | |||
return cleanup_return(keycode, record, false); | |||
case DF_QWER: | |||
if (record->event.pressed) { | |||
set_single_persistent_default_layer(_QWERTY); | |||
send_string("QWERTY layout"); | |||
} | |||
return false; | |||
case DF_COLE: | |||
if (record->event.pressed) { | |||
set_single_persistent_default_layer(_COLEMAKDH); | |||
send_string("COLEMAKDH layout"); | |||
} | |||
return false; | |||
case REFLASH: | |||
eeconfig_init(); | |||
eeconfig_update_rgb_matrix_default(); | |||
writePinLow(QMK_LED); | |||
reset_keyboard(); | |||
return false; | |||
default: | |||
return cleanup_return(keycode, record, true); | |||
} | |||
} | |||
void keyboard_pre_init_kb(void) { | |||
setPinOutput(QMK_LED); | |||
writePinHigh(QMK_LED); | |||
} | |||
void keyboard_post_init_kb(void) { | |||
debug_enable = true; | |||
debug_matrix = false; | |||
debug_keyboard = false; | |||
writePinHigh(QMK_LED); | |||
} | |||
void suspend_power_down_kb(void) { | |||
writePinLow(QMK_LED); | |||
} | |||
void suspend_wakeup_init_kb(void) { | |||
writePinHigh(QMK_LED); | |||
} |
@ -0,0 +1,39 @@ | |||
/* Copyright 2020-2022 Lorenzo Leonini | |||
* SPDX-License-Identifier: GPL-2.0-only | |||
* | |||
* This program is free software: you can redistribute it and/or modify | |||
* it under the terms of the GNU General Public License version 2 as | |||
* published by the Free Software Foundation. | |||
* | |||
* 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 QMK_KEYBOARD_H | |||
led_config_t g_led_config = { | |||
{ | |||
{12, 11, 8, 7, 4, 3, 36, 37, 38, 39, 40, 41}, | |||
{13, 10, 9, 6, 5, 2, 35, 34, 33, 32, 31, 30}, | |||
{14, 15, 16, 17, 18, 1, 24, 25, 26, 27, 28, 29}, | |||
{NO_LED, NO_LED, NO_LED, 19, 20, 21, 0, 22, 23, NO_LED, NO_LED, NO_LED} | |||
}, { | |||
{112, 32}, {92, 36}, {94, 25}, {97, 14}, {80, 13}, {77, 24}, | |||
{62, 18}, {64, 8}, {49, 6}, {46, 17}, {28, 23}, {30, 13}, | |||
{14, 11}, {11, 22}, {8, 32}, {26, 34}, {43, 28}, {61, 29}, | |||
{76, 34}, {78, 46}, {97, 49}, {112, 56}, {127, 49}, {146, 46}, | |||
{132, 36}, {148, 34}, {164, 29}, {180, 28}, {198, 34}, {215, 32}, | |||
{212, 22}, {196, 23}, {178, 17}, {161, 18}, {146, 24}, {130, 25}, | |||
{126, 14}, {143, 13}, {159, 8}, {175, 6}, {194, 13}, {210, 11} | |||
}, { | |||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |||
4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, | |||
4, 4, 4, 4, 4, 4 | |||
} | |||
}; |
@ -0,0 +1,2 @@ | |||
RGB_MATRIX_ENABLE = yes | |||
RGB_MATRIX_DRIVER = WS2812 |
@ -0,0 +1,22 @@ | |||
# MCU name | |||
MCU = atmega32u4 | |||
# Bootloader selection | |||
BOOTLOADER = atmel-dfu | |||
# Build Options | |||
# change yes to no to disable | |||
# | |||
BOOTMAGIC_ENABLE = yes # Enable Bootmagic Lite | |||
MOUSEKEY_ENABLE = no # Mouse keys | |||
EXTRAKEY_ENABLE = yes # Audio control and System control | |||
CONSOLE_ENABLE = no # Console for debug | |||
COMMAND_ENABLE = no # Commands for debug and configuration | |||
NKRO_ENABLE = no # Enable N-Key Rollover | |||
BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality | |||
RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow | |||
AUDIO_ENABLE = no # Audio output | |||
DEBOUNCE_TYPE = sym_eager_pk | |||
LTO_ENABLE = yes | |||
DEFAULT_FOLDER = adm42/rev4 |