diff options
Diffstat (limited to 'keyboards/lfkeyboards/smk65/revb')
-rw-r--r-- | keyboards/lfkeyboards/smk65/revb/config.h | 116 | ||||
-rw-r--r-- | keyboards/lfkeyboards/smk65/revb/revb.c | 171 | ||||
-rw-r--r-- | keyboards/lfkeyboards/smk65/revb/revb.h | 134 | ||||
-rw-r--r-- | keyboards/lfkeyboards/smk65/revb/rules.mk | 16 |
4 files changed, 437 insertions, 0 deletions
diff --git a/keyboards/lfkeyboards/smk65/revb/config.h b/keyboards/lfkeyboards/smk65/revb/config.h new file mode 100644 index 0000000000..0d4fe40f35 --- /dev/null +++ b/keyboards/lfkeyboards/smk65/revb/config.h @@ -0,0 +1,116 @@ +/* +Copyright 2020 LFKeyboards +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 "config_common.h" + +/* USB Device descriptor parameter */ +#define VENDOR_ID 0x4C46 // "LF" +#define PRODUCT_ID 0x565B // "s65b" +#define DEVICE_VER 0x0006 +#define MANUFACTURER LFKeyboards +#define PRODUCT SMK65v2 + +// RevA +// #define DIODE_DIRECTION COL2ROW +// #define MATRIX_ROWS 5 +// #define MATRIX_COLS 16 +// #define MATRIX_ROW_PINS {B7, F7, F6, F5, F4} +// #define MATRIX_COL_PINS {F0, F1, D2, D3, D5, D4, D6, D7, B4, B5, B6, C7, B3, B2, B1, B0} +// #define UNUSED_PINS {} + +// RevB +#define DIODE_DIRECTION COL2ROW +#define MATRIX_ROWS 5 +#define MATRIX_COLS 16 +#define MATRIX_ROW_PINS {D6, D7, E0, C3, C4} +#define MATRIX_COL_PINS {F2, C5, E5, E4, B7, B6, B5, B4, B3, B2, B1, B0, E1, C0, C1, C2} +#define UNUSED_PINS {} +#define RGBLED_NUM 20 // Number of LEDs + +//RevB only: + +#define AUDIO_VOICES +#define C6_AUDIO +// #define B5_AUDIO + +#define BACKLIGHT_LEVELS 8 +#define BACKLIGHT_PWM_MAP {8, 16, 40, 55, 70, 128, 200, 255} + +#define RGB_DI_PIN C7 // Have to set it to something to get the ws2812 code to compile +#define RGBLED_NUM 20 // Number of LEDs +#define RGBLIGHT_ANIMATIONS +#define RGBLIGHT_HUE_STEP 10 +#define RGBLIGHT_SAT_STEP 17 +#define RGBLIGHT_VAL_STEP 17 + +/* Debounce reduces chatter (unintended double-presses) - set 0 if debouncing is not needed */ +#define DEBOUNCE 5 + +/* define if matrix has ghost (lacks anti-ghosting diodes) */ +//#define MATRIX_HAS_GHOST + +/* Mechanical locking support. Use KC_LCAP, KC_LNUM or KC_LSCR instead in keymap */ +#define LOCKING_SUPPORT_ENABLE +/* Locking resynchronize hack */ +#define LOCKING_RESYNC_ENABLE + +/* If defined, GRAVE_ESC will always act as ESC when CTRL is held. + * This is useful for the Windows task manager shortcut (ctrl+shift+esc). + */ +//#define GRAVE_ESC_CTRL_OVERRIDE + +/* + * Force NKRO + * + * Force NKRO (nKey Rollover) to be enabled by default, regardless of the saved + * state in the bootmagic EEPROM settings. (Note that NKRO must be enabled in the + * makefile for this to work.) + * + * If forced on, NKRO can be disabled via magic key (default = LShift+RShift+N) + * until the next keyboard reset. + * + * NKRO may prevent your keystrokes from being detected in the BIOS, but it is + * fully operational during normal computer usage. + * + * For a less heavy-handed approach, enable NKRO via magic key (LShift+RShift+N) + * or via bootmagic (hold SPACE+N while plugging in the keyboard). Once set by + * bootmagic, NKRO mode will always be enabled until it is toggled again during a + * power-up. + * + */ +//#define FORCE_NKRO + +/* + * Feature disable options + * These options are also useful to firmware size reduction. + */ + +/* disable debug print */ +//#define NO_DEBUG + +/* disable print */ +//#define NO_PRINT + +/* disable action features */ +//#define NO_ACTION_LAYER +//#define NO_ACTION_TAPPING +//#define NO_ACTION_ONESHOT +//#define NO_ACTION_MACRO +//#define NO_ACTION_FUNCTION + +/* Bootmagic Lite key configuration */ +//#define BOOTMAGIC_LITE_ROW 0 +//#define BOOTMAGIC_LITE_COLUMN 0 diff --git a/keyboards/lfkeyboards/smk65/revb/revb.c b/keyboards/lfkeyboards/smk65/revb/revb.c new file mode 100644 index 0000000000..7498febeb3 --- /dev/null +++ b/keyboards/lfkeyboards/smk65/revb/revb.c @@ -0,0 +1,171 @@ +/* +Copyright 2020 LFKeyboards +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 <avr/sfr_defs.h> +#include <avr/timer_avr.h> +#include <avr/wdt.h> +#include "smk65.h" +#include "keymap.h" +#include "debug.h" +#include "issi.h" +#include "TWIlib.h" +#include "lighting.h" + +uint16_t click_hz = CLICK_HZ; +uint16_t click_time = CLICK_MS; +uint8_t click_toggle = CLICK_ENABLED; + + +void matrix_init_kb(void) +{ + matrix_init_user(); + +#ifdef AUDIO_ENABLE + // audio_init() sets PB5 to output and drives it low, which breaks our matrix + // so reset PB5 to input + cbi(DDRB, 5); + sbi(PORTB, 5); +#else + // If we're not using the audio pin, drive it low + sbi(DDRC, 6); + cbi(PORTC, 6); +#endif + +#ifdef ISSI_ENABLE + issi_init(); +#endif +} + +void matrix_scan_kb(void) +{ +#ifdef WATCHDOG_ENABLE + wdt_reset(); +#endif + matrix_scan_user(); +} + +void click(uint16_t freq, uint16_t duration){ +#ifdef AUDIO_ENABLE + if(freq >= 100 && freq <= 20000 && duration < 100){ + play_note(freq, 10); + for (uint16_t i = 0; i < duration; i++){ + _delay_ms(1); + } + stop_all_notes(); + } +#endif +} + +bool process_record_kb(uint16_t keycode, keyrecord_t* record) +{ + // Test code that turns on the switch led for the key that is pressed + // set_backlight_by_keymap(record->event.key.col, record->event.key.row); + if (click_toggle && record->event.pressed){ + click(click_hz, click_time); + } + if (keycode == RESET) { + reset_keyboard_kb(); + } else { + } + return process_record_user(keycode, record); +} + +void action_function(keyrecord_t *event, uint8_t id, uint8_t opt) +{ +#ifdef AUDIO_ENABLE + int8_t sign = 1; +#endif + if(id == LFK_ESC_TILDE){ + // Send ~ on shift-esc + void (*method)(uint8_t) = (event->event.pressed) ? &add_key : &del_key; + uint8_t shifted = get_mods() & (MOD_BIT(KC_LSHIFT) | MOD_BIT(KC_RSHIFT)); + method(shifted ? KC_GRAVE : KC_ESCAPE); + send_keyboard_report(); + }else if(event->event.pressed){ + switch(id){ + case LFK_SET_DEFAULT_LAYER: + // set/save the current base layer to eeprom, falls through to LFK_CLEAR + eeconfig_update_default_layer(1UL << opt); + default_layer_set(1UL << opt); + case LFK_CLEAR: + // Go back to default layer + layer_clear(); + break; +#ifdef AUDIO_ENABLE + case LFK_CLICK_FREQ_LOWER: + sign = -1; // continue to next statement + case LFK_CLICK_FREQ_HIGHER: + click_hz += sign * 100; + click(click_hz, click_time); + break; + case LFK_CLICK_TOGGLE: + if(click_toggle){ + click_toggle = 0; + click(4000, 100); + click(1000, 100); + }else{ + click_toggle = 1; + click(1000, 100); + click(4000, 100); + } + break; + case LFK_CLICK_TIME_SHORTER: + sign = -1; // continue to next statement + case LFK_CLICK_TIME_LONGER: + click_time += sign; + click(click_hz, click_time); + break; +#endif + case LFK_DEBUG_SETTINGS: + dprintf("Click:\n"); + dprintf(" toggle: %d\n", click_toggle); + dprintf(" freq(hz): %d\n", click_hz); + dprintf(" duration(ms): %d\n", click_time); + break; + } + } +} + +void reset_keyboard_kb(){ +#ifdef WATCHDOG_ENABLE + MCUSR = 0; + wdt_disable(); + wdt_reset(); +#endif + reset_keyboard(); +} + +// LFK lighting info +const uint8_t switch_matrices[] = {0, 1}; +const uint8_t rgb_matrices[] = {6, 7}; +// const uint8_t rgb_sequence[] = { +// 14, 24, 23, 22, 21, 20, 19, 18, 26, 25, 28, 29, +// 30, 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13 +// }; +const uint8_t rgb_sequence[] = { + 25, 28, 29, + 30, 31, 32, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14 +}; +// Maps switch LEDs from Row/Col to ISSI matrix. +// Value breakdown: +// Bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | +// / \ ISSI Col | ISSI Row | +// matrix idx +// const uint8_t switch_leds[MATRIX_ROWS][MATRIX_COLS] = +// KEYMAP( +// 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, +// 0x29, 0x28, 0x27, 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0xA9, 0xA8, 0xA7, 0xA6, 0xA5, 0xA4, 0xA3, 0xA2, 0xA1, +// 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0xB9, 0xB8, 0xB7, 0xB6, 0xB5, 0xB3, +// 0x49, 0x48, 0x47, 0x45, 0x44, 0x43, 0x42, 0x41, 0xC9, 0xC8, 0xC7, 0xC6, 0xC5, 0xC4, 0xC2, +// 0x59, 0x58, 0x57, 0x56, 0x55, 0x51, 0xD6, 0xE5, 0xE4, 0xE3, 0xE2, 0xE1); diff --git a/keyboards/lfkeyboards/smk65/revb/revb.h b/keyboards/lfkeyboards/smk65/revb/revb.h new file mode 100644 index 0000000000..3d3e5181fd --- /dev/null +++ b/keyboards/lfkeyboards/smk65/revb/revb.h @@ -0,0 +1,134 @@ +/* +Copyright 2020 LFKeyboards +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 + +/* if the kb.h file exists (because we're running from qmkbuilder) include it */ +#ifdef __has_include +#if __has_include("kb.h") +#include "kb.h" +#endif +#endif + +#include "quantum.h" +#include "matrix.h" +#include <avr/sfr_defs.h> + +#ifndef cbi +#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) +#endif + +#ifndef sbi +#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) +#endif + + +typedef struct RGB_Color { + uint16_t red; + uint16_t green; + uint16_t blue; +} RGB_Color; + +typedef struct Layer_Info { + uint32_t layer; + uint32_t mask; + RGB_Color color; +} Layer_Info; + +extern const uint32_t layer_count; +extern const Layer_Info layer_info[]; + +enum action_functions { + LFK_CLEAR = 0, // Resets all layers + LFK_ESC_TILDE, // esc+lshift = ~ + LFK_SET_DEFAULT_LAYER, // changes and saves current base layer to eeprom + LFK_CLICK_TOGGLE, // Adjusts click duration + LFK_CLICK_FREQ_HIGHER, // Adjusts click frequency + LFK_CLICK_FREQ_LOWER, // Adjusts click frequency + LFK_CLICK_TIME_LONGER, // Adjusts click duration + LFK_CLICK_TIME_SHORTER, // Adjusts click duration + LFK_DEBUG_SETTINGS, // prints LED and click settings to HID + LFK_LED_TEST // cycles through switch and RGB LEDs +}; + +#define CLICK_HZ 500 +#define CLICK_MS 2 +#define CLICK_ENABLED 0 + +void reset_keyboard_kb(void); +void click(uint16_t freq, uint16_t duration); + +// readability +#define ___ KC_NO + +/* Vanilla Keymap */ +// This a shortcut to help you visually see your layout. +/* +* ,-------------------------------------------------------------------------------. +* | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1G | +* |-------------------------------------------------------------------------------| +* | 21 | 22 |23 | 24 | 25 | 26 | 27 | 28 | 29 | 2A | 2B | 2C | 2D | 2F | 2G | +* |-------------------------------------------------------------------------------| +* | 31 | 32 |33 | 34 | 35 | 36 | 37 | 38 | 39 | 3A | 3B | 3C | 3F | 3G | +* |-------------------------------------------------------------------------------| +* | 41 | 42 |43 | 45 | 46 | 47 | 48 | 49 | 4A | 4B | 4C | 4D | 4F | 4G | +* |-------------------------------------------------------------------------------| +* | 51 | 52 | 53 | 57 | 5A | 5B | 5C | 5D | 5E | 3E | 4E | +* `-------------------------------------------------------------------------------' +*/ +// The first section contains all of the arguements +// The second converts the arguments into a two-dimensional array +#define LAYOUT_65_ansi( \ + k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, k1G, \ + k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2F, k2G, \ + k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3F, k3G, \ + k41, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4F, k4G, \ + k51, k52, k53, k57, k5B, k5C, k5D, k5E, k3E, k4E \ +) { \ + { k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, ___, k1F, k1G }, \ + { k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, ___, k2F, k2G }, \ + { k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, ___, k3E, k3F, k3G }, \ + { k41, ___, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G }, \ + { k51, k52, k53, ___, ___, ___, k57, ___, ___, ___, k5B, k5C, k5D, k5E, ___, ___ }, \ +} + +#define LAYOUT_65_iso( \ + k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1F, k1G, \ + k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2G, \ + k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3F, k2F, k3G, \ + k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4F, k4G, \ + k51, k52, k53, k57, k5B, k5C, k5D, k5E, k3E, k4E \ +) { \ + { k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, ___, k1F, k1G }, \ + { k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, ___, k2F, k2G }, \ + { k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, ___, k3E, k3F, k3G }, \ + { k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G }, \ + { k51, k52, k53, ___, ___, ___, k57, ___, ___, ___, k5B, k5C, k5D, k5E, ___, ___ }, \ +} + +// TODO: remove backwards compatibility with previous keymaps +#define LAYOUT LAYOUT_65_ansi +#define LAYOUT_iso( \ + k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, k1G, \ + k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, k2F, k2G, \ + k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, k3F, k3G, \ + k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4F, k4G, \ + k51, k52, k53, k57, k5B, k5C, k5D, k5E, k3E, k4E \ +) { \ + { k11, k12, k13, k14, k15, k16, k17, k18, k19, k1A, k1B, k1C, k1D, k1E, ___, k1G }, \ + { k21, k22, k23, k24, k25, k26, k27, k28, k29, k2A, k2B, k2C, k2D, ___, k2F, k2G }, \ + { k31, k32, k33, k34, k35, k36, k37, k38, k39, k3A, k3B, k3C, ___, k3E, k3F, k3G }, \ + { k41, k42, k43, k44, k45, k46, k47, k48, k49, k4A, k4B, k4C, k4D, k4E, k4F, k4G }, \ + { k51, k52, k53, ___, ___, ___, k57, ___, ___, ___, k5B, k5C, k5D, k5E, ___, ___ }, \ +} diff --git a/keyboards/lfkeyboards/smk65/revb/rules.mk b/keyboards/lfkeyboards/smk65/revb/rules.mk new file mode 100644 index 0000000000..9e82372416 --- /dev/null +++ b/keyboards/lfkeyboards/smk65/revb/rules.mk @@ -0,0 +1,16 @@ +# MCU name +MCU = at90usb646 + +# Bootloader selection +BOOTLOADER = atmel-dfu + +# Build Options +# change yes to no to disable +# +BACKLIGHT_ENABLE = no # Enable keyboard backlight functionality +RGBLIGHT_ENABLE = no # Enable keyboard RGB underglow +RGBLIGHT_CUSTOM_DRIVER = yes # RGB code is implemented in lefkeyboards, not WS2812 +AUDIO_ENABLE = no # Audio output + +# Extra source files for IS3731 lighting +SRC += TWIlib.c issi.c lighting.c |